Avatar billede tynde Nybegynder
26. januar 2005 - 16:08 Der er 12 kommentarer og
1 løsning

Print med bestemt printerindstilling på dokument

Kan man gemme printerindstilling med duplex og bakkevalg i en makro?
Jeg har et dokument, som jeg skal køre fra bakke 3 og printe på begge sider. Problemet er, at hvis jeg f.eks printer et andet dokument, f.eks til PDF, og skal tilbage og printe et dokument, som indeholder 8 regneark fra printer, husker den ikke de gamle indstillinger. Der skal køres fra forskellige skuffer, nogle på begge sider. Så jeg kunne godt tænke mig at køre en makro og printe alle 8 ark ud, med de rigtige indstillinger, hvergang!!!!!!! Uanset hvad jeg har lavet tidligere.
Avatar billede bak Forsker
26. januar 2005 - 17:55 #1
Intet er umuligt, men det her ligger ikke i excel's vba.
Det gør det ikke fordi det er ikke dokumentets opsætning, men printerens der skal rodes i og det kan standard vba ikke.
Jeg vil nok foreslå at du laver opsætningen som du vil have den og gemmer arket. Når du så vil printe PDF, laver du en klon af arket, ændrer dette til PDF udskriver og sletter arket igen.

Brug fx ActiveWorkbook.SaveCopyAs "C:\TEMP\KOPI.XLS"
Åbn  så kopien og sæt PDF til og print og slet.
Avatar billede tynde Nybegynder
27. januar 2005 - 08:01 #2
Det havde jeg nok lidt på fornemmelsen.
Er det muligt at omgå dette ved at lave en makro, som f.eks først laver en kopi ved hjælp af: ActiveWorkbook.SaveCopyAs "C:\TEMP\KOPI.XLS og derefter laver en pdf ved hjælp af et enkelt klik på en knap?
Avatar billede mip Nybegynder
31. januar 2005 - 22:12 #3
Den eneste måde man kan styre printeren med excel's vba er via sendkeys.
Avatar billede tynde Nybegynder
01. februar 2005 - 10:52 #4
Nu ved jeg ikke hvad sendkeys er, så det hjælper mig ikke umiddelbart.
Men kan man lave en makro som først gemmer en kopi som bak nævner ovenfor, og dereftet laver en pdf af kopien?
Derved bevares printerindstillingerne på det oprindelige dokument, eller hvad?
Avatar billede mip Nybegynder
01. februar 2005 - 18:45 #5
Hvis jeg forstår dig ret, skal du printe det samme dokument ud, som pdf dokument og som almindeligt dokument, hvor du dog styrer på kassetterne?
Avatar billede tynde Nybegynder
03. februar 2005 - 09:03 #6
Jep
Avatar billede mip Nybegynder
03. februar 2005 - 20:32 #7
Er din pdf printer adobe pdf creator eller en anden lokal printer, eller er den en netværks printer, og er din nomale printer en netværks printer?

Hvorfor jeg spørger er, hvis begge er en netværks printer kan man via en makro skifte printer og udskrive herfra.
Avatar billede mip Nybegynder
03. februar 2005 - 21:01 #8
Hvis du bruger adobes pdf writer, og en netværks printer, kan du prøve at lave en excel template hvor du insætter denne makro, udskifter canon printeren med dit eget printer navn.
Hvis den virker kan man istedet for printdialog box indsætte, noget der beskriver hvad der skal udskrives / hvordan og hvor mange kopier.
Den netværks printer man peger på kan sættes op standard til at udskrive på de kassetter man vil, evnt. sortere / hæfte ovs.


-------------------------------------------------------------------------

Option Explicit

Public Const PRINTER_ENUM_CONNECTIONS = &H4
Public Const PRINTER_ENUM_LOCAL = &H2

Public Type PRINTER_INFO_1
  flags As Long
  pDescription As String
  pName As String
  pComment As String
End Type

Public Type PRINTER_INFO_4
  pPrinterName As String
  pServerName As String
  Attributes As Long
End Type

Public Declare Function EnumPrinters Lib "winspool.drv" Alias _
  "EnumPrintersA" (ByVal flags As Long, ByVal name As String, _
  ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, _
  pcbNeeded As Long, pcReturned As Long) As Long
Public Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyA" _
  (ByVal retval As String, ByVal Ptr As Long) As Long
Public Declare Function StrLen Lib "kernel32" Alias "lstrlenA" _
  (ByVal Ptr As Long) As Long

Function EnumeratePrinters4() As Collection

'This is the enumeration of the printers bit
'Code has all been nicked from
'Microsoft KnowledgeBase article Q166008
'Returns a collection of all printers installed
'on the local PC

Dim success As Boolean, cbRequired As Long, cbBuffer As Long
Dim Buffer() As Long, nEntries As Long
Dim I As Long, pName As String, SName As String
Dim Attrib As Long, Temp As Long
Dim strPrinters As String

  cbBuffer = 3072
 
  ReDim Buffer((cbBuffer \ 4) - 1) As Long
 
  success = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                          PRINTER_ENUM_LOCAL, _
                          vbNullString, _
                          4, _
                          Buffer(0), _
                          cbBuffer, _
                          cbRequired, _
                          nEntries)
  If success Then
      If cbRequired > cbBuffer Then
          cbBuffer = cbRequired
          Debug.Print "Buffer too small. Trying again with " & _
          cbBuffer & " bytes."
          ReDim Buffer(cbBuffer \ 4) As Long
          success = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                                  PRINTER_ENUM_LOCAL, _
                                  vbNullString, _
                                  4, _
                                  Buffer(0), _
                                  cbBuffer, _
                                  cbRequired, _
                                  nEntries)
          If Not success Then
              Debug.Print "Error enumerating printers."
              Exit Function
          End If
      End If
     
      Dim colPrinters As Collection
     
      Set colPrinters = New Collection
     
      For I = 0 To nEntries - 1
          pName = Space$(StrLen(Buffer(I * 3)))
          Temp = PtrToStr(pName, Buffer(I * 3))
          SName = Space$(StrLen(Buffer(I * 3 + 1)))
          Temp = PtrToStr(SName, Buffer(I * 3 + 1))
          Attrib = Buffer(I * 3 + 2)
          colPrinters.Add pName
      Next I
  Else
      Debug.Print "Error enumerating printers."
  End If
 
  Set EnumeratePrinters4 = colPrinters

End Function

Public Function GetFullPrinterName(strQName As String) As String
Dim strPrinter As String
Dim varPrinter As Variant
Dim colPrinters As Collection
Dim iPNum As Integer
On Error GoTo GetFullPrinterName_Err

  iPNum = 0
  'Get a list of installed printers
  Set colPrinters = EnumeratePrinters4()
 
  'Find the specific printer we want
  'Looks for a particular set of characters that we know
  'will be in the printer name if its the one we want
  For Each varPrinter In colPrinters
      If InStr(1, varPrinter, strQName) Then
          strPrinter = varPrinter
          Exit For
      End If
  Next
 
  'Report back if there's no hit
  If strPrinter = "" Then
      MsgBox "Sorry, We were unable to find the appropriate printer.", vbInformation, "Print"
      Exit Function
  End If
 
  'Otherwise try to point to the new printer
  ActivePrinter = strPrinter & " på ne" & Format(iPNum, "00") & ":"
  GetFullPrinterName = ActivePrinter
  iPNum = 10

Exit_Here:
  Exit Function
 
GetFullPrinterName_Err:
  iPNum = iPNum + 1
  If iPNum > 10 Then
      MsgBox "Error Number: " & Err.Number & vbCrLf & _
              "Description: " & Err.Description
      GoTo Exit_Here
  Else
      Resume
  End If

End Function



Sub ChangeActivePrinter()
' Modified 16/05/2003 by Mik Agergaard

  Static x As Integer
  Dim Cancel As Boolean
  Dim defaultPrinter As String
  Dim newPrinter As String
  Dim nextPrinter As String
  On Error GoTo Errhandler
 
  'Save the current printer assignment
  defaultPrinter = Application.ActivePrinter
 
  'Try to set the printer to the main lobby Adobe PDF.
  newPrinter = GetFullPrinterName("Adobe PDF")
 
  'If the desired printer could not be found, leave.
  If newPrinter = "" Then
      Exit Sub
  End If
  ActivePrinter = newPrinter
 
  'Unmark colate in printdialog
    'If x = 2 Then
    '    x = 1
    '    Cancel = True
    '    Exit Sub
    'End If
    'x = 1
    'Application.SendKeys "{TAB}"
    'Application.SendKeys "s"
    'x = 2
   
    'Shows Print dialog
    Application.Dialogs(xlDialogPrint).Show

  'Try to set the printer to the main lobby Canon iR2270.
  nextPrinter = GetFullPrinterName("Canon iR2270")
 
  'If the desired printer could not be found, leave.
  If nextPrinter = "" Then
      Exit Sub
  End If
  ActivePrinter = nextPrinter
 
  'Unmark colate in printdialog
    'If x = 2 Then
    '    x = 1
    '    Cancel = True
    '    Exit Sub
    'End If
    'x = 1
    'Application.SendKeys "{TAB}"
    'Application.SendKeys "s"
    'x = 2
   
    'Shows Print dialog
    Application.Dialogs(xlDialogPrint).Show
 
  'reset the printer back to the default
  Application.ActivePrinter = defaultPrinter
 
  GoTo ExitPoint
 
Errhandler:

  MsgBox "Write down this message and notify your system administrator:" & vbCrLf & _
      Err.Number & vbCrLf & Err.Description
  Resume Next
 
ExitPoint:
End Sub
Avatar billede tynde Nybegynder
04. februar 2005 - 13:33 #9
Jeg har skiftet flg. ud:
nextPrinter = GetFullPrinterName("Canon iR2270")
med:
nextPrinter = GetFullPrinterName("HP LaserJet 2430 PCL 6 på Ne00:")

Der kommer en fejlmeddelelse der siger: Sorry, We were unable to find the appropriate printer

Jeg bruger Distiller til at lave en pdf, men hvis man kan bruge andet er jeg åben over for det.
Avatar billede mip Nybegynder
04. februar 2005 - 19:34 #10
Prøv at nøjes med at skifte
nextPrinter = GetFullPrinterName("Canon iR2270")
med:
nextPrinter = GetFullPrinterName("HP LaserJet 2430 PCL 6")
Det sidste skal makroen selv finde.
Avatar billede mip Nybegynder
04. februar 2005 - 19:36 #11
I Adobe parken skal der også være en PDF writer, der normalt installere sig sådan "Adobe PDF"
Avatar billede mip Nybegynder
17. februar 2005 - 23:22 #12
Hvordan går det, har du fået løst dit problem?
Avatar billede tynde Nybegynder
07. oktober 2005 - 00:39 #13
Jeg har desværre ikke kunne bruge nogle af løsningerne.
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
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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