[excel / vba] printerpoort selecteren werkt niet altijd

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • 1of6Billion
  • Registratie: Januari 2010
  • Laatst online: 08-09 07:53
Ik gebruik een stukje (niet zelf-bedachte) vba-code om in Excel door middel van een knop een printopdracht naar een (label)printer te sturen. Op mijn laptop werkt het naar behoren, maar bij mijn collega niet. Er verschijnt een melding dat de printerpoort niet gevonden is. Uitbreiden naar 80, 256 of 1024 poorten haalt niks uit.
Hij heeft windows+office op UK-engels staan. Ik op NL. Ik zie niet HOE dat het verschil kan uitmaken, maar ook niet wat ik kan doen om het op te lossen.

Iemand een idee?

code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 Sub DymoOPM()

Dim sCurrentPrinter As String
sCurrentPrinter = Application.ActivePrinter

    Dim PrinterName As String
    Dim PortNumber As Integer
    Dim PrinterPort As String
    Dim PrinterFullName As String
    Dim PrinterFound As Boolean
    Dim STDprinter As String
    '-------------------------------------------------------------------------
    STDprinter = Application.ActivePrinter
    '-------------------------------------------------------------------------
    'set printernaam
    PrinterName = "\\vm-002\PR-079"
    '-------------------------------------------------------------------------
    PrinterFound = False
    On Error Resume Next
        
    'eventueel aantal porten uitbreiden naar bv 0 To 80
    For PortNumber = 0 To 50
        PrinterPort = "Ne" & Format(PortNumber, "00") & ":"
        PrinterFullName = PrinterName & " op " & PrinterPort
        
        Application.ActivePrinter = PrinterFullName

        If Err.Number = 0 Then
            PrinterFound = True
            Exit For
        Else
            Err.Clear
        End If
       
    Next PortNumber
    '-------------------------------------------------------------------------
    If PrinterFound Then
        GoTo 10
    Else
        MsgBox (PrinterName & vbCr & "Port niet gevonden, neem contact op met de beheerder van dit bestand")
        GoTo 20
    End If
    Application.ActivePrinter = STDprinter
    '----------------------------------------------------------------------
10

ActiveSheet.PrintOut Copies:=Range("G5").Value

20
Application.ActivePrinter = sCurrentPrinter
End Sub

Beste antwoord (via 1of6Billion op 26-09-2023 11:19)


  • dixet
  • Registratie: Februari 2010
  • Laatst online: 00:23
1of6Billion schreef op dinsdag 26 september 2023 @ 08:21:
[...]

Ik ben in de war: OP staat tussen aanhalingstekens. Is het dan geen tekst?
Dat is wel tekst. De VBA plakt de naam van de printer, het hard gecodeerde woordje "op" en de poortnaam aan elkaar.

Dus in jouw geval bouwt de VBA deze naam op:

"\\vm-002\PR-079 op Ne01"

en bij je collega moet het worden:

"\\vm-002\PR-079 on Ne01"

Extragratis tip 1:
Als je de code robuust wilt maken kan je de landinstellingen uitvragen met de volgende code
code:
1
lc = Application.International(xlCountrySetting)

Als lc nu de waarde 1 heeft staat Windows op Engels, de waarde 31 betekent Nederlands. Als in je organisatie nog meer talen gebruikt worden moet je de codes daarvan even googlen en toevoegen.


Extragratis tip 2:
GOTO is vies, bah! GOTO maakt je code al gauw onleesbaar en spaghetti
Voeg liever de code die je wilt uitvoeren gewoon toe aan de 1e tak van je If:
code:
1
2
3
4
5
6
   If PrinterFound Then
        ActiveSheet.PrintOut Copies:=Range("G5").Value
    Else
        MsgBox (PrinterName & vbCr & "Port niet gevonden, neem contact op met de beheerder van dit bestand")
    End If
Application.ActivePrinter = sCurrentPrinter

Je gebruikt nu twee variabelen die beide de oorspronkelijk ingestelde printer bevatten (sCurrentPrinter en STDprinter). Op zet je eerst de standaard printer terug op STDprinter en daarna op sCurrentPrinter. Is een beetje dubbelop.

sorry, dit is m'n oude programmeerleraar die me nog steeds als klein stemmetje in m'n hoofd op m'n donder geeft als de code niet netjes genoeg is en onnodige variabelen bevat O-)

Alle reacties


Acties:
  • 0 Henk 'm!

  • m-vw
  • Registratie: Mei 2013
  • Laatst online: 17:51

m-vw

Dus?

Gebruikt hij dezelfde printer?
Ik zie dat de printernaam hardcoded in de procedure staat.

Acties:
  • 0 Henk 'm!

  • 1of6Billion
  • Registratie: Januari 2010
  • Laatst online: 08-09 07:53
m-vw schreef op maandag 25 september 2023 @ 13:50:
Gebruikt hij dezelfde printer?
Ik zie dat de printernaam hardcoded in de procedure staat.
Ja. Om labeltjes te printen. Het is een netwerkprinter.

Acties:
  • +4 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 00:23
1of6Billion schreef op maandag 25 september 2023 @ 13:47:
Hij heeft windows+office op UK-engels staan. Ik op NL. Ik zie niet HOE dat het verschil kan uitmaken
code:
1
        PrinterFullName = PrinterName & " op " & PrinterPort
Ik gok dat als hij Windows in het Engels gebruikt dat de naam "printernaam on printerpoort" is en niet "printernaam op printerpoort"

Acties:
  • +1 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Lijkt me een hele goede gok :)

Activeer maar eens eerst de juiste printer in windows, ga dan naar de vba editor en type in het venster direct (ctrl+G) 'debug.print application.activeprinter'. Dan zie je meteen wat de correcte printernaam moet zijn. Maar anyway, robuust zal het nooit worden.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • 1of6Billion
  • Registratie: Januari 2010
  • Laatst online: 08-09 07:53
dixet schreef op maandag 25 september 2023 @ 16:03:
[...]


[...]

Ik gok dat als hij Windows in het Engels gebruikt dat de naam "printernaam on printerpoort" is en niet "printernaam op printerpoort"
Ik ben in de war: OP staat tussen aanhalingstekens. Is het dan geen tekst?
Mijn collega is er nu niet, maar als ik het in ON verander krijg IK die foutmelding. Dus ik ga er vanuit dat het andersom nu werkt. :)

Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 00:23
1of6Billion schreef op dinsdag 26 september 2023 @ 08:21:
[...]

Ik ben in de war: OP staat tussen aanhalingstekens. Is het dan geen tekst?
Dat is wel tekst. De VBA plakt de naam van de printer, het hard gecodeerde woordje "op" en de poortnaam aan elkaar.

Dus in jouw geval bouwt de VBA deze naam op:

"\\vm-002\PR-079 op Ne01"

en bij je collega moet het worden:

"\\vm-002\PR-079 on Ne01"

Extragratis tip 1:
Als je de code robuust wilt maken kan je de landinstellingen uitvragen met de volgende code
code:
1
lc = Application.International(xlCountrySetting)

Als lc nu de waarde 1 heeft staat Windows op Engels, de waarde 31 betekent Nederlands. Als in je organisatie nog meer talen gebruikt worden moet je de codes daarvan even googlen en toevoegen.


Extragratis tip 2:
GOTO is vies, bah! GOTO maakt je code al gauw onleesbaar en spaghetti
Voeg liever de code die je wilt uitvoeren gewoon toe aan de 1e tak van je If:
code:
1
2
3
4
5
6
   If PrinterFound Then
        ActiveSheet.PrintOut Copies:=Range("G5").Value
    Else
        MsgBox (PrinterName & vbCr & "Port niet gevonden, neem contact op met de beheerder van dit bestand")
    End If
Application.ActivePrinter = sCurrentPrinter

Je gebruikt nu twee variabelen die beide de oorspronkelijk ingestelde printer bevatten (sCurrentPrinter en STDprinter). Op zet je eerst de standaard printer terug op STDprinter en daarna op sCurrentPrinter. Is een beetje dubbelop.

sorry, dit is m'n oude programmeerleraar die me nog steeds als klein stemmetje in m'n hoofd op m'n donder geeft als de code niet netjes genoeg is en onnodige variabelen bevat O-)

Acties:
  • +1 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

dixet schreef op dinsdag 26 september 2023 @ 08:52:
[...]

Extragratis tip 1:
Als je de code robuust wilt maken kan je de landinstellingen uitvragen met de volgende code
code:
1
lc = Application.International(xlCountrySetting)

Als lc nu de waarde 1 heeft staat Windows op Engels, de waarde 31 betekent Nederlands. Als in je organisatie nog meer talen gebruikt worden moet je de codes daarvan even googlen en […]
Tip 1b :)
Gebruik de objecten die er zijn. ;)
Vraag met application.printers() de geïnstalleerde printers uit. Werkt in alle talen en ondervangt alle mogelijke rariteiten. Is imho beduidend netter dan brute force tig keer proberen een printer in te stellen en hopen dat dat een keertje goed gaat.
https://learn.microsoft.c...ist-of-installed-printers

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 00:23
Lustucru schreef op dinsdag 26 september 2023 @ 09:10:
[...]


Tip 1b :)
Gebruik de objecten die er zijn. ;)
Vraag met application.printers() de geïnstalleerde printers uit. Werkt in alle talen en ondervangt alle mogelijke rariteiten. Is imho beduidend netter dan brute force tig keer proberen een printer in te stellen en hopen dat dat een keertje goed gaat.
https://learn.microsoft.c...ist-of-installed-printers
Helaas kent Excel geen Application.Printers() collectie... dat is een object die alleen in MS Access zit :'(

Acties:
  • 0 Henk 'm!

  • 1of6Billion
  • Registratie: Januari 2010
  • Laatst online: 08-09 07:53
@dixet Dit verduidelijkt e.e.a.. Ik ga proberen om met jouw voorstellen die code wat op te schonen. Ik onderhoud liever 1 bestand dan 2

OK, GOTO = NOGO. IF/THEN mag wel? ;)

FYI: Ik heb geen achtergrond/opleiding in vba of programmeren. Ik steel stukjes code van internet en pruts het in elkaar tot het werkt.... Dit was oorspronkelijk gericht op een 'gedeelde printer' ipv een volwaardige netwerkprinter

[ Voor 12% gewijzigd door 1of6Billion op 26-09-2023 11:26 ]


Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

dixet schreef op dinsdag 26 september 2023 @ 09:33:
[...]

Helaas kent Excel geen Application.Printers() collectie... dat is een object die alleen in MS Access zit :'(
Dat dacht ik eerst ook, maar expliciet zoeken naar excel-application gaf hem weer wel. Maar je hebt gelijk. I stand corrected.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Pagina: 1