26. januar 2005 - 16:08Der 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.
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.
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?
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?
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.
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
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.
Jeg har desværre ikke kunne bruge nogle af løsningerne.
Synes godt om
Ny brugerNybegynder
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.