Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

excel i problem z drukarką

153 views
Skip to first unread message

PePe

unread,
Jul 18, 2007, 2:57:19 AM7/18/07
to
Witam wszystkich.

Czy jest możliwe by pod excelem z poziomu VBA można było się odwołać do
drukarki tylko po nazwie? (tak jest pod Wordem)

przykład excel
jest jakiś case i wybór drukarki
Case 3
Application.ActivePrinter = "\\KYOCERA\sklad na Ne03:"
Case 4
Application.ActivePrinter = "\\KYOCERA\LP1 na Ne04:"

pod wordem wygląda to tak.
ActivePrinter = "\\KYOCERA\sklad"
ActivePrinter = "\\KYOCERA\LP1"


A problem jest w tym, że excel odwołuje się do drukarek po tym Ne03, Ne04

a każdorazowe dodanie drukarki, lub usunięcie powoduje zmianę tych numerów.
Większy bajer. mój komputer bez wyraźnej przyczyny czasami zmienia te
numery jakieś inne! ;) no i muszę za każdym razem zmieniać makro.

czy jest możliwość zmusić excela by odwoływał się tylko po nazwie, tak
jak to robi word?

liczę na pomoc
dzięki

Pozdrawiam
PePe


Tajan

unread,
Jul 18, 2007, 5:46:54 AM7/18/07
to
Witam!

Użytkownik "PePe" <nos...@wp.pl> napisał w wiadomości
news:f7kdkd$s72$2...@atlantis.news.tpi.pl...
Witam wszystkich.


Zmusić, to raczej nie można :-)
Najprostszym sposobem na ustawienie aktywnej drukarki jest uruchomienie okna
dialogowego:
Application.Dialogs(xlDialogPrinterSetup).Show
Wybrana w nim drukarka automatycznie staje się drukarką aktywną.
Jeżeli ten sposób Ci nie odpowiada, to wtedy jest juz trudniej. Dane o portach
trzeba "wyciągnąć" z systemu. Przy czym, o ile w systemach z rodziny NT (2000,
NT, XP) jest to dość proste, bo wystarczy przeczytać odpowiednią sekcje pliku
WIN.INI, to w starszych wersjach trzeba się mocno zagłębiać w API.
Przykładowy kod funkcji odczytującej numer portu danej drukarki z pliku WIN.INI
wygląda następująco:

Declare Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long

Function GetPrinterName(PrinterName As String) As String
Dim Buffer As String
Dim PrinterPort As String
Dim iPort As Integer
Dim iDriver As Integer
Dim r As Long

Buffer = Space(1024)

r = GetProfileString("PrinterPorts", PrinterName, "", _
Buffer, Len(Buffer))

On Error Resume Next
iDriver = InStr(Buffer, ",")
iPort = InStr(iDriver + 1, Buffer, ",")
On Error GoTo 0

If iPort > 0 Then
PrinterPort = Mid(Buffer, iDriver + 1, _
iPort - iDriver - 1)
GetPrinterName = PrinterName & " na " & PrinterPort
End If

End Function

(deklaracja funkcji GetProfileString powinna się znaleźć na początku modułu)

i w swoim kodzie możesz ją zastosowac tak:

Application.ActivePrinter = GetPrinterName("\\KYOCERA\sklad")

Przy czym, w przypadku błędnie podanej nazwy drukarki funkcja zwraca pusty
ciąg, więc nalezałoby się zabezpieczyć przed takimi przypadkami,np:

PrinterName=""
(...)
Case 3
PrinterName = "\\KYOCERA\sklad"
Case 4
PrinterName = "\\KYOCERA\LP1"
(...)
If PrinterName <> "" Then
Application.ActivePrinter = GetPrinterName(PrinterName)

Jak wcześniej wspomniałem, ta funkcja nie działa w wcześniejszych wersjach
Windows, ale gdybyś również jej potrzebował i na te wersje, to mogę Ci
przygotować przykład, ale w tej chwili nie mam systemu aby ją uruchomić :-)

Tajan

PePe

unread,
Jul 18, 2007, 9:29:28 AM7/18/07
to
Tajan pisze:

[ciaach]

> Jak wcześniej wspomniałem, ta funkcja nie działa w wcześniejszych wersjach
> Windows, ale gdybyś również jej potrzebował i na te wersje, to mogę Ci
> przygotować przykład, ale w tej chwili nie mam systemu aby ją uruchomić :-)
>
> Tajan
>

Ja wiedziałem że na życzliwość grupowiczów można liczyć.
wielkie serdeczne dzięki.
Sprawdzone i działa wyśmienicie.
to co napisałeś w zupełności wystarczy. używamy xp.

--
Pozdrawiam
PePe

0 new messages