VBA activeprinter instellen

Status
Niet open voor verdere reacties.

kiredw

Gebruiker
Lid geworden
31 mei 2012
Berichten
12
Hallo,

Ik heb geen idee wat ik nu op het moment fout doe. Ik probeer de application.activeprinter te veranderen in een andere printer. Wat ik ook doe, ik krijg het niet voor elkaar.

code om te de printer te wijzigen, geeft het goede resultaat en het goede Ne nummer.

Code:
Function FindPrinter(ByVal Printername As String) As String
  Dim Arr As Variant
  Dim Device As Variant
  Dim Devices As Variant
  Dim Printer As String
  Dim RegObj As Object
  Dim RegValue As String
  Const HKEY_CURRENT_USER = &H80000001
       
    Set RegObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    RegObj.enumvalues HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Devices, Arr
    
      For Each Device In Devices
        RegObj.getstringvalue HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Device, RegValue
        Printer = Device & " on " & Split(RegValue, ",")(1)
        If InStr(1, Printer, Printername, vbTextCompare) > 0 Then
           FindPrinter = Printer
           Exit Function
        End If
      Next
End Function

Gedeeltelijk printer code

Code:
   If IsArray(Names) Then
    For Each s In ActiveWorkbook.Worksheets
      For i = 0 To UBound(Names)
        If StrComp(s.Name, Names(i), vbTextCompare) = 0 Then
          If Names(i) = "Montagebon" Then
          Printernaam = FindPrinter(Worksheets("invoerscherm").range("L93"))
          End If
          
          If Names(i) = "Productietek" Then
          Printernaam = FindPrinter(Worksheets("invoerscherm").range("L92"))
      
             If actie = "a4" Then

            s.PrintOut ActivePrinter:=Printernaam
            
                GoTo labela4eind
            End If

Zodra ik wil printen, gebruikt excel de default printer of ik krijg een foutmelding(1004). Zodra ik ActivePrinter:= Printernaam in ActivePrinter:="aaaaaaa op Ne01:" verander, krijg ik ook een foutmelding(methode en object error 1004).

Ik heb veel varianten geprobeerd, maar het is me nog niet gelukt.

Het viel me ook op, dat de printers niet zichtbaar zijn in vba, na het openemen van printopdrachten door verschillende printers.
 
Laatst bewerkt:
Probeer eens:

"aaaaaaa on Ne01:"

en test met:

Code:
sub M_snb()
    With CreateObject("Wscript.network").EnumPrinterConnections
        For j = 0 To .Count - 1 Step 2
            c4 = IIf(c4 = "", "", c4 & vbCr) & .Item(j + 1) & " on " & .Item(j)
            msgbox c4
            CreateObject("Wscript.network").SetDefaultPrinter (.Item(j + 1))
        Next
    End With
End sub
 
Laatst bewerkt:
snb, bedankt voor de reactie.

Probeer eens:

"aaaaaaa on Ne01:"

Op, is een schrijffoutje naar forum.:). Als ik activeprinter = "asdasd ON ne01:", daarmee de goede NE nummer mee geeft, krijg ik ook een foutmelding.

Dat stukje code, ga ik nu ff toepassen. Dit is een andere manier om de printer te bereiken? Ipv NE nummer mag je dus ook Ipadres gebruiken?
 
GEWELDIG.. Het werkt eindelijk. Nooit geweten dat het ook op deze manier kon en waarschijnlijk moest.


Code:
Function Setprinter(ByVal Printername As String) As String
    With CreateObject("Wscript.network").EnumPrinterConnections
        For j = 0 To .Count - 1 Step 2 
            If InStr(1, .Item(j + 1), Printername, vbTextCompare) > 0 Then
            c4 = IIf(c4 = "", "", c4 & vbCr) & .Item(j + 1) & " on " & .Item(j)
            CreateObject("Wscript.network").SetDefaultPrinter (.Item(j + 1))
            End If     
        Next
    End With
End Function
 
Laatst bewerkt:
Verwar niet de keuze voor een aktieve printer met het instellen van de standaardprinter.
Gebruik geen funktie voor de wijziging van instellingen: dat doe je met een macro.
Als je een waarde als resultaat wil terugkrijgen gebruik je een funktie .
Zie beide stellingen hieronder geïllustreerd.

Code:
Sub M_snb()
  Application.ActivePrinter = F_findprinter("Laserjet 1010")

  M_Setprinter "LaserJet 1010"
End Sub

Sub M_Setprinter(ByVal Printernaam As String)
  For Each pr In CreateObject("Wscript.network").EnumPrinterConnections
    If InStr(LCase(pr), LCase(Printernaam)) Then CreateObject("Wscript.network").SetDefaultPrinter pr
  Next
End Sub

Function F_findprinter(printernaam)
  For Each pr In CreateObject("Wscript.network").EnumPrinterConnections
    If InStr(LCase(pr), LCase(printernaam)) Then Exit For
  Next
  F_findprinter = pr
End Function
 
Laatst bewerkt:
Verwar niet de keuze voor een aktieve printer met het instellen van de standaardprinter.
Gebruik geen funktie voor de wijziging van instellingen: dat doe je met een macro.
Als je een waarde als resultaat wil terugkrijgen gebruik je een funktie .
Zie beide stellingen hieronder geïllustreerd.

Code:
Sub M_snb()
  Application.ActivePrinter = F_findprinter("Laserjet 1010")

  M_Setprinter "LaserJet 1010"
End Sub

Sub M_Setprinter(ByVal Printernaam As String)
  For Each pr In CreateObject("Wscript.network").EnumPrinterConnections
    If InStr(LCase(pr), LCase(Printernaam)) Then CreateObject("Wscript.network").SetDefaultPrinter pr
  Next
End Sub

Function F_findprinter(printernaam)
  For Each pr In CreateObject("Wscript.network").EnumPrinterConnections
    If InStr(LCase(pr), LCase(printernaam)) Then Exit For
  Next
  F_findprinter = pr
End Function

Bedankt voor de tip en informatie.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan