Avatar billede herch59 Juniormester
07. marts 2018 - 11:49 Der er 7 kommentarer og
1 løsning

VBA - skifte standard-printer

Hej
findes der virkelig ikke en mulighed for, at man kan skifte ActivePrinter vha. af variabel?
Se nedennævnte kode - har opretter to printere, hvor den ene navnemæssigt slutter på "F" - og den virker.

På forhånd tak  ;-)

Public Sub PrintFarve(control As IRibbonControl)
Dim sCurrentPrinter As String
Dim sNewPrinter As String

sCurrentPrinter = Application.ActivePrinter

sCurrentPrinter = Right(STDprinter, 1)
If sCurrentPrinter <> "F" Then
    Application.ActivePrinter = Application.ActivePrinter & "F"

'******Når jeg kører nedennævnte linje - siger den " Printerfejl  "
    Application.ActivePrinter = sNewPrinter


    ActiveDocument.PrintOut
    Application.ActivePrinter = sCurrentPrinter
Else
    ActiveDocument.PrintOut
End If
End Sub
Avatar billede lene-fredborg Ekspert
07. marts 2018 - 13:01 #1
Så vidt jeg kan se er der flere problemer i din kode:

1) Hvad er formålet med at have ”(control As IRibbonControl)”?

2) Du bruger STDprinter, men det fremgår ikke af koden, hvad STDprinter er.

3) Du ændrer værdi af sCurrentPrinter fra priternavnet til kun at indeholde sidste tegn af STDprinter, og senere sætter du den aktive printer til at have denne værdi (kun ét tegn - ikke det oprindelige printernavn).

4) Du tildeler ikke på noget tidspunkt en værdi til sNewPrinter. Når du bruger den som printernavn, er navnet en tom streng.

Hvis du ikke kan være 100 % sikker på, at der er adgang til en printer med navnet på den aktive printer + F (eller STDprinter + F, hvis det var den, du ville bruge), skal du indbygge fejlhåndtering (brugeren kunne måske senest have haft valgt en anden printer end den, du forventer).

Måske det er noget i retning af nedenstående, du ville have lavet. Da jeg ikke kan vide, om det er en fejl, at du brugte STDprinter i din kode eller hvor værdien af STDprinter ellers kommer fra, er det muligt, at du skal ændre noget:


-------------MAKRO VERSION 1-------------

Public Sub PrintFarve()
    Dim sCurrentPrinter As String
    Dim sNewPrinter As String

    sCurrentPrinter = Application.ActivePrinter

    'hvis sidste tegn i printernavnet IKKE er "F",
    'så sæt sNewPrinter til sCurrentPrinter + F
    If Right(sCurrentPrinter, 1) <> "F" Then
        sNewPrinter = sCurrentPrinter & "F"

        Application.ActivePrinter = sNewPrinter

        ActiveDocument.PrintOut
       
        'sæt printer tilbage til den oprindelige
        Application.ActivePrinter = sCurrentPrinter
    Else
        'farveprinter var allerede valgt - ingen ændringer nødvendige
        ActiveDocument.PrintOut
    End If
End Sub

---------------------------
Men du kan reelt undlade at tildele farveprinterens navn til en variabel, da du kun skal bruge navnet den ene gang. Så kan det kortes ned til dette:

-------------MAKRO VERSION 2-------------

Public Sub PrintFarve2()
    Dim sCurrentPrinter As String

    sCurrentPrinter = Application.ActivePrinter

    'hvis sidste tegn i printernavnet IKKE er "F",
    'så sæt ActivePrinter til sCurrentPrinter + F
    If Right(sCurrentPrinter, 1) <> "F" Then
        Application.ActivePrinter = sCurrentPrinter & "F"

        ActiveDocument.PrintOut
       
        'sæt printer tilbage til den oprindelige
        Application.ActivePrinter = sCurrentPrinter
    Else
        'farveprinter var allerede valgt - ingen ændringer nødvendige
        ActiveDocument.PrintOut
    End If
End Sub
Avatar billede herch59 Juniormester
07. marts 2018 - 18:14 #2
Tusind tak for dit svar.
Du må undskylde jeg ikke har fået ryddet nok op, da jeg har forsøgt forskellige ting.

1) IRibbonControl er fordi jeg har lavet en knap i Ribbon-menuen.

2) Jeg har prøvet at sætte din kode ind, båden den første og den anden, men de giver stadig samme fejl "Printerfejl" i det øjeblik jeg kommer til linjen

    Application.ActivePrinter = sNewPrinter

Hvor    Application.ActivePrinter viser den bestående netværksprinter
og hvor  sNewPrinter er den samme printer men farve-versionen.

Måske kan jeg bare ikke lave det i VBA???
Avatar billede lene-fredborg Ekspert
07. marts 2018 - 19:00 #3
VBA kan absolut klare det uden problemer. Men du skal bruge korrekte data. Når du får den pågældende fejl, er printernavnet ikke korrekt.

Har du prøvet at steppe gennem VBA-koden med F8 og tjekke værdierne undervejs.

Linjen
Application.ActivePrinter = sNewPrinter
fejler, hvis der ikke er en printer med det navn.
Avatar billede herch59 Juniormester
07. marts 2018 - 19:40 #4
Det er den rigtige printer - har endda sat selve printerstien ind, men det gav samme fejl.
Nu skal det selvfølgelig siges, at printeren er en netværksprinter - som har følgende sti:  \\B5133S03\CTX65AK_BDD643
Avatar billede lene-fredborg Ekspert
07. marts 2018 - 20:28 #5
Hvilket err.number får du? Og hvilken err.description?

Jeg kan jo ikke teste, da jeg ikke har dine printere. Din kode forudsætter, at printernavnene er ens kun med den forskel, at farveprinteren har et ekstra ”F” til sidst.

Prøv at hente VBA-koden på denne side og brug den til at finde printernavnene.

https://wordmvp.com/FAQs/MacrosVBA/AvailablePrinters.htm

Tjek resultatet for de to printere, der er tale om.

Se evt. også C. Pearsons VBA-kode til at hente fulde navne på printere her: http://www.cpearson.com/excel/GetPrinters.aspx)
Avatar billede herch59 Juniormester
07. marts 2018 - 20:45 #6
Tusind tak så vidt, det nederste link vil jeg prøve i morgen, når jeg kommer på arbejde igen.
Det første link har jeg allerede testet i dag - og det viste de korrekte navne.
Avatar billede herch59 Juniormester
07. marts 2018 - 21:06 #7
Så fik jeg løst problemet med det sidste link, det viste sig, at printeren faktisk havde et andet navn - så det faktisk derfor koden fejlede.

Mange tak for hjælpen  :-)
Avatar billede lene-fredborg Ekspert
07. marts 2018 - 21:33 #8
Velbekomme. Det var godt, at det lykkedes. Hvis du markerer mit svar med de to links som et svar, kan det måske hjælpe andre på et tidspunkt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





CIO
Stort CIO-interview: Lemvigh-Müllers milliard-omsætning er blevet digital