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
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
[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