Vraag


Acties:
  • 0 Henk 'm!

  • ApOE
  • Registratie: Mei 2003
  • Laatst online: 25-07 10:36
Mijn vraag

Voor een bepaald proces heb ik een AutoOpen Word macro gemaakt welke als een bestandsnaam overeenkomt met de "ActiveDocument.Name" dan moet het document direct naar een in de macro vastgestelde printer worden verzonden, het document moet worden afgesloten en verwijderd.

Middels onderstaande code werkt het prima
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 Sub AutoOpen()
'
' AutoOpen Macro
'
'
If ActiveDocument.Name = "DHL Label.docx" = True Then

    Documents("DHL Label.docx").PrintOut
    Application.ActivePrinter = GK420D

Dim deletepath As String

deletepath = ActiveDocument.FullName

ActiveDocument.Close False

Kill (deletepath)

Application.Quit

End If

End Sub


Relevante software en hardware die ik gebruik
MS Word

Probleem
Ik wil in de zelfde macro graag meerdere documentnamen naar verschillende printers kunnen sturen. Dus stel het document heet test.docx dan moet deze met exact het zelfde proces worden afgehandeld als bovenstaande voorbeeld.

Hiervoor heb ik onderstaande code gemaakt:
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
Sub AutoOpen()
'
' AutoOpen Macro
'
'
If ActiveDocument.Name = "DHL Label.docx" = True Then

    Documents("DHL Label.docx").PrintOut
    Application.ActivePrinter = GK420D

ElseIf ActiveDocument.Name = "test.docx" = True Then

        Application.ActivePrinter = "OXH01141 PR11"
        Documents("test.docx").PrintOut , Range:=wdPrintAllDocument, Item:= _
        wdPrintDocumentWithMarkup, Copies:=1, Pages:="", PageType:= _
        wdPrintAllPages, Collate:=True, PrintToFile:=False, _
        PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
        PrintZoomPaperHeight:=0
    
' Sluit het document en wis het bestand

Dim deletepath As String

deletepath = ActiveDocument.FullName

ActiveDocument.Close False

Kill (deletepath)

Application.Quit

End If

End Sub

Deze code werkt niet goed, het script probeert zowel "DHL Label.docx" als "Test.docx" naar PR11 te sturen.

Zou iemand mij (opweg) kunnen helpen met het maken van een code waarin ik meerdere "Als bestand naam = X -> print dan op printer Y -> sluit en wis het document"?

Alle reacties


Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Je zet de GK als actieve printer -na- sturen van de opdracht aan de default printer. Dat werkt niet :P

Ook: je end if staat verkeerd. Edit: als A dan (print) anders als B dan (print en verwijder).

[ Voor 18% gewijzigd door F_J_K op 07-02-2020 09:45 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • +2 Henk 'm!

  • Marc H
  • Registratie: Juni 1999
  • Laatst online: 02:03

Marc H

- - Is wakker - -

Ik zou zoiets als dit doen.

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
Sub AutoOpen()
'
' AutoOpen Macro
'
'
select case ActiveDocument.Name

Case "DHL Label.docx" 
    Application.ActivePrinter = GK420D
    Documents("DHL Label.docx").PrintOut
    Goto verwijderen

case "test.docx" 
        Application.ActivePrinter = "OXH01141 PR11"
        Documents("test.docx").PrintOut , Range:=wdPrintAllDocument, Item:= _
        wdPrintDocumentWithMarkup, Copies:=1, Pages:="", PageType:= _
        wdPrintAllPages, Collate:=True, PrintToFile:=False, _
        PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
        PrintZoomPaperHeight:=0
    goto verwijderen

end Select
exit sub

verwijderen:
    
' Sluit het document en wis het bestand

Dim deletepath As String

deletepath = ActiveDocument.FullName

ActiveDocument.Close False

Kill (deletepath)

Application.Quit

End Sub


Ik zou alleen iets verwijderen als er iets is afgedrukt. Mocht de macro eens gestart worden met een verkeerd bestand, wordt er nu niets weggegooid. Bij jou verdwijnt hij meteen. Sowieso is hert verwijderen van een bestand vanuit een macro niet heel erg handig. Mocht er wat verkeerd gaan met printen, dan ben je het bestand kwijt. Je zou bijvoorbeeld een messagebox op het scherm zetten of het bestand goed geprint is voordat je het verwijderd.

En voor de programmeer nazi's, ja ik weet dat Goto's niet echt netjes zijn en dat je het ook met een functie kan doen.Maar voor een subje van nog geen 20 regels is het goed genoeg :)

Ik maak geen fouten, ik creëer leer momenten.


Acties:
  • +1 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Marc H schreef op vrijdag 7 februari 2020 @ 10:10:
En voor de programmeer nazi's, ja ik weet dat Goto's niet echt netjes zijn en dat je het ook met een functie kan doen.Maar voor een subje van nog geen 20 regels is het goed genoeg :)
offtopic:
Ik was inderdaad al bezig met quoten van Edsger Dijkstra. Go To Statement Considered Harmful :P

Maar ik zou dat juist willen afraden voor mensen die duidelijk nieuw zijn. Niet alleen om dan geen slechte gewoonte aan te leren, maar ook omdat het minder makkelijk is te volgen als het wat complexer wordt (zoals: huh, waarom die exit sub :P). Ik zou aanraden goto alleen bij On Error te gebruiken.


Goed punt voor wat betreft omgaan met fouten. Zie de link hierboven voor opties.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • +1 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Marc H schreef op vrijdag 7 februari 2020 @ 10:10:

En voor de programmeer nazi's, ja ik weet dat Goto's niet echt netjes zijn en dat je het ook met een functie kan doen.Maar voor een subje van nog geen 20 regels is het goed genoeg :)
Je hoeft geen nazi te zijn om zaken netjes te willen aanleren en boevnal over een paar maanden je code nog gewoon te kunnen lezen . 8) Zonder goto noch subroutine en een begrijpelijke exit sub:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'pseudocode:

ON ERROR GOTO fout

SELECT CASE ActiveDocument.name
  CASE "A"
       printer=x
  CASE "B", "C"
       printer=y
  CASE "D"
       printer=z
  CASE ELSE
       EXIT SUB
END SELECT

'print document
'verwijder document

fout:
'foutafhandeling

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


Acties:
  • 0 Henk 'm!

  • ApOE
  • Registratie: Mei 2003
  • Laatst online: 25-07 10:36
Bedankt voor de hulp allemaal, het werken met "Case" maakt het wel wat overzichtelijker.

Ik merk alleen dat (Windows?) nu wat vreemd gedrag vertoond. Zodra ik test.docx open wordt de default printer in Windows PR11. Als ik Daarna "DHL Label.docx" open probeert hij deze op PR11 af te drukken wat niet lukt vanwege het formaat van het document. (DHL Label.docx bevat ZPL code welke middels pass trough naar een labelprinter gaat). N.B. "mijn standaardprinter door Windows laten beheren" staat uit!

M.b.t. het risico van het direct verwijderen: dat is in dit geval niet erg. Het .docx bestand word als download aangeboden uit een ERP pakket. Chrome opent het bestand en als het documentnaam voorkomt in de macro moet deze direct worden afgehandeld en verwijderd om te voorkomen dat we "DHL Label(1).docx" "DHL Label(2).docx" etc hebben in de download map waardoor de macro niet meer werkt.

Onderstaand voorbeeld is nog iets te summier voor me om direct te begrijpen hoe ik de code afmaak, maar daar wil ik me nog wel in vastbijten als ik het probleem van de default printer weet te tackelen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pseudocode:

ON ERROR GOTO fout

SELECT CASE ActiveDocument.name
  CASE "A"
       printer=x
  CASE "B", "C"
       printer=y
  CASE "D"
       printer=z
  CASE ELSE
       EXIT SUB
END SELECT

'print document
'verwijder document

fout:
'foutafhandeling

Acties:
  • 0 Henk 'm!

  • Marc H
  • Registratie: Juni 1999
  • Laatst online: 02:03

Marc H

- - Is wakker - -

met welke code werk je nu?

Ik maak geen fouten, ik creëer leer momenten.


Acties:
  • +1 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

ApOE schreef op vrijdag 7 februari 2020 @ 11:34:
Ik merk alleen dat (Windows?) nu wat vreemd gedrag vertoond. Zodra ik test.docx open wordt de default printer in Windows PR11. Als ik Daarna "DHL Label.docx" open probeert hij deze op PR11 af te drukken wat niet lukt vanwege het formaat van het document. (DHL Label.docx bevat ZPL code welke middels pass trough naar een labelprinter gaat). N.B. "mijn standaardprinter door Windows laten beheren" staat uit!
Dat is wat ik eerder al aangaf. Let op de volgorde van printen en de default veranderen in je code. Bij de een zeg je eerst printen dan printer aanpassen, bij de ander andersom (wat logischer is). Bij geen van beide zet je het terug naar de oude default.

Case code: in plaats van 'printer=x' etc. zet je er alle regels code die relevant zijn voor die casus.

Ik en ik denk ook @Lustucru zetten liever geen concrete code neer. Juist zodat je zelf de code maakt en dus weet wat er gebeurt, en dan problemen zoals die print-volgorde niet voor gaan komen in je productie-code.

Geef inderdaad je concrete code en waar je twijfelt, dan denken we graag mee.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

  • ApOE
  • Registratie: Mei 2003
  • Laatst online: 25-07 10:36
Jouw voorbeeld:
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
 Sub AutoOpen()
'
' AutoOpen Macro
'
'
Select Case ActiveDocument.Name

Case "DHL Label.docx"
    Application.ActivePrinter = "GK420D"
    Documents("DHL Label.docx").PrintOut
    GoTo verwijderen

Case "test.docx"
        Application.ActivePrinter = "OXH01141 PR11"
        Documents("test.docx").PrintOut , Range:=wdPrintAllDocument, Item:= _
        wdPrintDocumentWithMarkup, Copies:=1, Pages:="", PageType:= _
        wdPrintAllPages, Collate:=True, PrintToFile:=False, _
        PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
        PrintZoomPaperHeight:=0
    GoTo verwijderen

End Select

End Sub


Ik het nu de GK420d ook tussen " " gezet, dit lijkt de oplossing? :D

[ Voor 14% gewijzigd door ApOE op 07-02-2020 11:51 ]


Acties:
  • +1 Henk 'm!

  • Marc H
  • Registratie: Juni 1999
  • Laatst online: 02:03

Marc H

- - Is wakker - -

Quotes vergeten: Application.ActivePrinter = GK420D

Printer kan daardoor niet gevonden worden en daarom wijzigt de printer niet.

Ik maak geen fouten, ik creëer leer momenten.


Acties:
  • 0 Henk 'm!

  • ApOE
  • Registratie: Mei 2003
  • Laatst online: 25-07 10:36
Super bedankt allen, ik had het inderdaad al aangepast!
Pagina: 1