So funktioniert JustAnswer:

  • Fragen Sie einen Experten
    Tausende Experten in über 200 Kategorien.
  • Erhalten Sie eine professionelle Antwort
    Per E-Mail oder sofortiger Benachrichtigung, während Sie auf unserer Website warten.
    Stellen Sie ggf. weitere Anschlussfragen.
  • 100%ige Zufriedenheit garantiert
    Bewerten Sie die erhaltene Antwort.

Stellen Sie Ihre Frage an IT-Fachinformat...

IT-Fachinformatiker
IT-Fachinformatiker, Systemadministrator
Kategorie: Computer
Zufriedene Kunden: 6838
Erfahrung:  Software Entwicklung, Projekt Erfahrung, Windows-Netzwerke, Linux-Netzwerke, Windows/Linux-Server
32504664
Geben Sie Ihre Frage in der Kategorie Computer hier ein
IT-Fachinformatiker ist jetzt online.

Hallo, ich drucke aus einem visual Basic Programm in Excel

Kundenfrage

Hallo,
ich drucke aus einem visual Basic Programm in Excel PDFs mit Hilfe von WIN2PDF. Etwa 10 % der PDFs können nicht geöffnet werden. Ich vermute, dass man einen Timer setzen muss, der genügend Zeit zum Fertigstellen des einzelnen PDFs lässt. Habe auch Ansätze gefunden, komme aber nicht klar.
Hilfe ist dringend nötig, Kosten sind nicht so wichtig.
Gepostet: vor 6 Jahren.
Kategorie: Computer
Experte:  Tronic hat geantwortet vor 6 Jahren.
Hallo,

vielen Dank, XXXXX XXXXX Justanswer benutzen.

Haben Sie es denn schon einmal mit einem anderen (besseren) PDF-Maker versucht? Zum Beispiel: http://www.chip.de/downloads/PDFCreator_13009777.html

Das dürfte Ihr Problem vermutlich schneller lösen als hier nach der Ursache zu suchen.
Kunde: hat geantwortet vor 6 Jahren.
PDFCreator wurde schon ausprobiert und funktioniert überhaupt nicht, da das Verfahren irgendwie anders ist, es werden dort keine dlls verwendet. Ich brauche einen Experten in visual Basic, denn ich bin mir sicher dass das Problem kein grosses ist, da ich Beispiellösungen gefunden habe, diese aber wegen meiner geringen Grundkenntnisse nicht auf mein Problkem übertragen kann.
Experte:  Tronic hat geantwortet vor 6 Jahren.
Ok, dann gebe ich Ihre Frage für unsere VB-Experten frei.
Bitte warten Sie, bis sich ein VB-Experte bei Ihnen meldet.
Kunde: hat geantwortet vor 6 Jahren.
Danke!
Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, mir fällt da was ein ich melde mich gleich einen Moment. Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.
Danke, XXXXX XXXXX
Kunde: hat geantwortet vor 6 Jahren.
Wann geht es weiter?
Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, also sagen Sie mir doch bitte, wie Sie das mit VB gelöst haben. Wenn es nur um den Faktor Zeit geht dann müssen Sie die Windows API Funktion Sleep() implementieren diese kann auf die Milisekunde genau aufgerufen werden. Das Problem ist offenbar, das der eine Vorgang noch nicht fertig ist, der nächste aber schon "ran" will. Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

GEnauso sehe ich das auch!

mein aktueller code in diesem Bereich ist:

 

Sheets("PRT").Select
aa$ = Worksheets("PRT").Range("B2").Value
BB$ = "Win2PDF"
Worksheets("PRT").PageSetup.PrintArea = "$b$8:$L$" & Range("H5").Value
Worksheets("PRT").PageSetup.Orientation = xlLandscape
ActiveSheet.PrintOut ActivePrinter:=BB$, PrToFileName:=aa$

 

Das funktioniert bisher mit Adobe4 einwandfrei, Adobe4 läuft jedoch nicht mehr auf windows 7, so dass ich Win2PDF mit den beschriebenen Problemen einsetze. Als Lösung habe ich im Netz gefunden:

 

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Dim WdApp As Object

Set WdApp = CreateObject("Word.Application")

'save path and file name in registry for Win2PDF, to bypass file prompt
SaveSetting "Dane Prairie Systems", "Win2PDF", "PDFPostFileName", "c:\myfile.pdf"

With WdApp
.Documents.Open FileName:="c:\myfile.doc"
.Options.PrintBackground = True
.ActivePrinter = "Win2PDF"
.Visible = False
.ActiveDocument.PrintOut
.Documents.Close savechanges:=False
End With
'Verify Win2PDF is done creating PDF file
Do
Sleep 10
PDFRegKey = GetSetting("Dane Prairie Systems", "Win2PDF", "PDFPostFileName", "")
Loop While PDFRegKey Empty

 

Ich weiss jetzt nicht, wie ich diese Wartefunktion auf meine Anwendung übertragen kann.

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo,

also total Easy:

1. neues Modul (nciht Klassenmodul) einfpgen
2. o.a. Declaration einfügen und zwar folgendermaßen:

Aus:
Private Declare

wird:
Public Declare

3. Modul speichern, Sleep steht nun überall sofort zur Verfügung

4. Sleep an der Stelle einsetzen, wo es aufgerufen werden soll das sollte das Problem lösen

VBA/VB-Problem allgemein ist, das ein Vorgang A nicht in Abhängigkeit eines Vorgangs B ablaufen kann also das klassische Problem der Nebenläufigkeit. Andere Lösung wäre, das man direkt nach dem PDF Druck eine Datei eine TMP-Datei mit einer Zufallszahl erzeugt und fragt, ob diese bereits existiert wenn ja alles klar falls nein muss der Druck ncoh im Gange sein.

Gruss Günter

Kunde: hat geantwortet vor 6 Jahren.

Der letzte Vorschlag mit der temp-Datei gefällt mir gut. Kannst Du mir eine Idee geben, wie der Code aussehen müsste?

Gruss Roman

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Haste denn schon das erstere gemacht? Also, mit der Datei um es plastisch mal auszudrücken würde ich es so machen:

Eine Routine z.B. für PDF-Creator um zu drucken sähe in etwa so aus:

Sub PDFOut ()

On Error GoTo eh:

Dim eingangsdrucker As String

'** alte Druckumgebung sichern
eingangsdrucker = ActivePrinter

'** PDF-Drucker setzen und Dokument ausdrucken
ActivePrinter = "\\srv1\PDF_BT"

Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _
wdPrintDocumentContent, Copies:=0, Pages:="", PageType:=wdPrintAllPages, _
ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:= _
False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
PrintZoomPaperHeight:=0

'** alte Druckumgebung wiederherstellen
ActivePrinter = eingangsdrucker

UserForm1.Show


eh:
Select Case Err '** absichtlich produzierter Fehler unser Tools nimmt's in die Hand!
Case 5148:
'DoEvents
Shell "\\srv1\deploy\pdfout.exe", vbNormalFocus
'** Da Programm evtl. nicht korrekt funktioniert muss das hier sein! Kopien=0
End Select

End Sub

Wichtig: Pfade etc. müssen angepasst werden!

Ein effektiverere Sleep ERsatz sähe so aus:

Public Sub sleep(t As Byte)
'** sleep Ersatz, da wir sonst nix haben
Dim ct As Long
Dim w As Long

'** aktuelle Zeit ermitteln
ct = Timer

Do
'** aktuelle Zeit minus ermittelte Zeit
w = Timer - ct
'** solange, bis w den Wert t erreicht hat
Loop Until w = t

End Sub

Im PDF-Creator z.B. lassen sich diverse Einstellungen vornehmen u.a. auch, wie der Dateiname aufgebaut ist dort kann man z.B. die Variable %RANDOM% nutzen um Zufallszahlen zu erzeugen das verhindert ein direktes überschreiben einer Datei sofern diese nicht überschrieben werden soll.

Warte, bis Vorgang abgeschlossen ist das könnte so aussehen:
Dim filename As String
Dim result As Variant

Call PrintPDF '** Hier die Routine zum drucken

'** Evtl. den Fokus auf das Formular oder Fenster setzen

'** Aktion wird erst durchgeführt, wenn PDF Druck fertig ist
filename = "c:\test" & Rnd * 10000 + Rnd * 100 & ".tmp"
Open filename For Output As #1

'** Jetzt prüfen, ob die Datei auch existiert:
result = Dir$(filename)

If result Then
MsgBox "Datei vorhanden. Druck abgeschlossen"
Else
MsgBox "nciht gefunden, der Druck läuft offenbar doch noch!"
End If

Wichtig: Du musst den Code natürlich entsprechend anpassen! Er soll nur eine Linie aufzeigen, in welche Richtung Du gehen musst.

Gruss Günter



Verändert von IT-Fachinformatiker am 20.07.2010 um 09:56 Uhr EST
Kunde: hat geantwortet vor 6 Jahren.

Ich habe die Variante mit dem tmp-file und mit Deinem Code versucht:

 

'jetzt Drucken
Sheets("PRT").Select
aa$ = Worksheets("PRT").Range("B2").Value
BB$ = "Win2PDF"
Worksheets("PRT").PageSetup.PrintArea = "$b$8:$L$" & Range("H5").Value
Worksheets("PRT").PageSetup.Orientation = xlLandscape
ActiveSheet.PrintOut ActivePrinter:=BB$, PrToFileName:=aa$
'hier anderes file drucken, wenn es existiert dann ist auch das pdf fertig
cc$ = Worksheets("PRT").Range("B3").Value & ".tmp"
schleife:
Open cc$ For Output As #1
result = Dir$(cc$)
If result Then GoTo pdffertig Else GoTo schleife

pdffertig:

 

 

Er stopt jetzt bei "If result Then" mit der Meldung: Typen unverträglich

 

Was habe ich falsch gemacht?

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Ho, also das erste was mir hier auffällt ist GOTO das solltest Du ganz schnell umgehen/anders lösen! GOTO ist mega schlecht gewöhne Dir das bitte nicht an! Also der Code sieht syntaktisch korrekt aus jedoch müsste ich ihn ja selbst teste. Dein Fehler bei If..Then:

If result Then

mal in:

If result = vbNormal Then

ändern. Die Dir$ Funktion ist eigentlich zjm ermitteln der Fileattribute da:

http://www.vbarchiv.net/commands/Dir.php

zum direkten prüfen der Datei kann man auch (noch besser) eine API-Funktion verwenden:

Public Function FileExists(ByVal sFile As String) As Boolean

' Der Parameter sFile enthält den zu prüfenden Dateinamen

Dim Size As Long
On Local Error Resume Next
Size = FileLen(sFile)
FileExists = (Err = 0)
On Local Error Goto 0
End Function

diese muss WIEDER in Dein Modul rein und entsprechend aufgerufen werden.

Gruss Günter

P.S. Hast Du denn das mit Sleep mal gemacht das sollte eigentlich sofort laufen.



Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo Roman,

so hier einmal ganz anschaulich (ich rate zu PDF-Creator) wie man das super handeln kann:

ein Worksheet in einer PDF:


Option Explicit

Sub PrintToPDF_Early()

'Macro Purpose: Print to PDF file using PDFCreator
' (Download from http://sourceforge.net/projects/pdfcreator/)
' Designed for early bind, set reference to PDFCreator

Dim pdfjob As PDFCreator.clsPDFCreator
Dim sPDFName As String
Dim sPDFPath As String

'/// Change the output file name here! ///
sPDFName = "testPDF.pdf"
sPDFPath = ActiveWorkbook.Path & Application.PathSeparator

'Check if worksheet is empty and exit if so
If IsEmpty(ActiveSheet.UsedRange) Then Exit Sub

Set pdfjob = New PDFCreator.clsPDFCreator

With pdfjob
If .cStart("/NoProcessingAtStartup") = False Then
MsgBox "Can't initialize PDFCreator.", vbCritical + _
vbOKOnly, "PrtPDFCreator"
Exit Sub
End If
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = sPDFPath
.cOption("AutosaveFilename") = sPDFName
.cOption("AutosaveFormat") = 0 ' 0 = PDF
.cClearCache
End With

'Print the document to PDF
ActiveSheet.PrintOut copies:=1, ActivePrinter:="PDFCreator"

'Wait until the print job has entered the print queue
Do Until pdfjob.cCountOfPrintjobs = 1
DoEvents
Loop
pdfjob.cPrinterStop = False

'Wait until PDF creator is finished then release the objects
Do Until pdfjob.cCountOfPrintjobs = 0
DoEvents
Loop
pdfjob.cClose
Set pdfjob = Nothing
End Sub


mehrere Worksheets in mehrere PDF:


Option Explicit

Sub PrintToPDF_MultiSheet_Early()

'Macro Purpose: Print to PDF file using PDFCreator
' (Download from http://sourceforge.net/projects/pdfcreator/)
' Designed for early bind, set reference to PDFCreator

Dim pdfjob As PDFCreator.clsPDFCreator
Dim sPDFName As String
Dim sPDFPath As String
Dim lSheet As Long

Set pdfjob = New PDFCreator.clsPDFCreator
sPDFPath = ActiveWorkbook.Path & Application.PathSeparator

If pdfjob.cStart("/NoProcessingAtStartup") = False Then
MsgBox "Can't initialize PDFCreator.", vbCritical + _
vbOKOnly, "PrtPDFCreator"
Exit Sub
End If

For lSheet = 1 To ActiveWorkbook.Sheets.Count
'Check if worksheet is empty and skip if so
If Not IsEmpty(ActiveSheet.UsedRange) Then
With pdfjob
'/// Change the output file name here! ///
sPDFName = "testPDF" & Sheets(lSheet).Name & ".pdf"
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = sPDFPath
.cOption("AutosaveFilename") = sPDFName
.cOption("AutosaveFormat") = 0 ' 0 = PDF
.cClearCache
End With

'Print the document to PDF
Worksheets(lSheet).PrintOut copies:=1, ActivePrinter:="PDFCreator"

'Wait until the print job has entered the print queue
Do Until pdfjob.cCountOfPrintjobs = 1
DoEvents
Loop
pdfjob.cPrinterStop = False

'Wait until PDF creator is finished then release the objects
Do Until pdfjob.cCountOfPrintjobs = 0
DoEvents
Loop
End If
Next lSheet
pdfjob.cClose
Set pdfjob = Nothing
End Sub


mehrere Worksheets in einer PDF:


Option Explicit

Sub PrintToPDF_MultiSheetToOne_Early()

'Macro Purpose: Print to PDF file using PDFCreator
' (Download from http://sourceforge.net/projects/pdfcreator/)
' Designed for early bind, set reference to PDFCreator

Dim pdfjob As PDFCreator.clsPDFCreator
Dim sPDFName As String
Dim sPDFPath As String
Dim lSheet As Long
Dim lTtlSheets As Long

'/// Change the output file name here! ///
sPDFName = "Consolidated.pdf"
sPDFPath = ActiveWorkbook.Path & Application.PathSeparator
Set pdfjob = New PDFCreator.clsPDFCreator

'Make sure the PDF printer can start
If pdfjob.cStart("/NoProcessingAtStartup") = False Then
MsgBox "Can't initialize PDFCreator.", vbCritical + _
vbOKOnly, "Error!"
Exit Sub
End If

'Set all defaults
With pdfjob
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = sPDFPath
.cOption("AutosaveFilename") = sPDFName
.cOption("AutosaveFormat") = 0 ' 0 = PDF
.cClearCache
End With

'Print the document to PDF
lTtlSheets = Application.Sheets.Count
For lSheet = 1 To Application.Sheets.Count
On Error Resume Next 'To deal with chart sheets
If Not IsEmpty(Application.Sheets(lSheet).UsedRange) Then
Application.Sheets(lSheet).PrintOut copies:=1, ActivePrinter:="PDFCreator"
Else
lTtlSheets = lTtlSheets - 1
End If
On Error GoTo 0
Next lSheet

'Wait until all print jobs have entered the print queue
Do Until pdfjob.cCountOfPrintjobs = lTtlSheets
DoEvents
Loop

'Combine all PDFs into a single file and stop the printer
With pdfjob
.cCombineAll
.cPrinterStop = False
End With

'Wait until PDF creator is finished then release the objects
Do Until pdfjob.cCountOfPrintjobs = 0
DoEvents
Loop
pdfjob.cClose
Set pdfjob = Nothing
End Sub

Bekannt aus:

 
 
 
„[...]mehr als Zehntausend Experten weltweit; 1500 davon in Deutschland. Acht Jahre nach dem Start ist das [...] Online-Unternehmen mit seinen 90 Mitarbeitern die größte Web-Seite für das Vermitteln von Experten von Anwälten über Ärzte bis hin zu Universitätsprofessoren.“
„Wer eine fachmänische Lösung für ein medizinisches, rechtliches oder technisches Problem sucht, kann das jetzt auch im Internet tun. Lebenshilfe auf die schnelle, unkomplizierte und vor allem erschwingliche Art bietet die Seite www.justanswer.de. Etwa 1500 Experten stehen per Mail für Fragen zu ca. 200 Fachgebieten rund um die Uhr zur Verfügung."
„Rat gewünscht? Rechtliche, medizinische oder allgemeine Fragen beantworten Experten unter www.justanswer.de."
„JustAnswer, die weltweit führende Online-Plattform für Expertenfragen und -antworten, bietet ab sofort noch mehr Sicherheit und Qualität für Verbraucher."
„Ob Vorbereitung, Notfall oder Reklamation nach dem Urlaub - JustAnswer bietet jederzeit schnelle, kompetente Antworten"
„Die Online-Plattform JustAnswer bringt Ratsuchende und Experten in über 200 Fachgebieten zusammen."
 
 
 

Was unsere Besucher über uns sagen:

 
 
 
  • Ich bedauere, dass ich nicht gleich bei Ihnen gelandet bin. Die Leerung des Cache hat das Problem gelöst. Danke Gerd Schönbuchner Grafrath
< Zurück | Weiter >
  • Ich bedauere, dass ich nicht gleich bei Ihnen gelandet bin. Die Leerung des Cache hat das Problem gelöst. Danke Gerd Schönbuchner Grafrath
  • Endlich ein Experte, der mir wirklich weiterhelfen konnte! DANKE! JustAnswer Kunde Taunusstein
  • Ihre Antwort hat mir sehr geholfen, die richtigen Entscheidungen zu treffen. Dass Sie mir darüber hinaus noch 2 Empfehlungen gegeben haben fand ich super. Vielen Dank! JustAnswer Kunde Freiburg
  • Die ausgearbeiteten Hilfen waren gut strukturiert, leicht verständlich und zu 100% hilfreich für mich. Vielen Dank Markus B. Karlsruhe
  • Sehr schnelle und kompetente Antwort, die für mich bares Geld bedeutet. Vielen Dank! S.Stober K.
  • Herzlichen Dank! Hab durch Ihre Antwort viel Geld gespart! Ben R. Deutschland
  • Sehr schnelle und kompetente Hilfestellung. Besonders für mich als Laien wurde alles sehr verständlich erklärt. Gerne wieder! Rosengl Bad Tölz
 
 
 

Lernen Sie unsere Experten kennen:

 
 
 
  • Tronic

    Tronic

    IT-Specialist

    Zufriedene Kunden:

    2269
    Elektroniker und EDV-Service
< Zurück | Weiter >
  • http://ww2.justanswer.com/uploads/PY/Pyroflash/2011-4-21_104934_tronic.64x64.jpg Avatar von Tronic

    Tronic

    IT-Specialist

    Zufriedene Kunden:

    2269
    Elektroniker und EDV-Service
  • http://ww2.justanswer.com/uploads/rufushoschi/2010-11-08_135947_bild.jpg Avatar von IT-Fachinformatiker

    IT-Fachinformatiker

    Systemadministrator

    Zufriedene Kunden:

    6338
    Software Entwicklung, Projekt Erfahrung, Windows-Netzwerke, Linux-Netzwerke, Windows/Linux-Server
  • http://ww2.justanswer.com/uploads/COMINAROSA/2010-02-03_172238_PASSBILD.JPG Avatar von COMIN IT-Service

    COMIN IT-Service

    Dipl.-Ing.

    Zufriedene Kunden:

    779
    Dipl.Ing (FH) ET, NT, IT
  • http://ww2.justanswer.com/uploads/RaubergerConcep/2010-03-02_102740_Portraet64.jpg Avatar von RaubergerConcept

    RaubergerConcept

    IT-Specialist

    Zufriedene Kunden:

    234
    Mehr als 10 Jahre Erfahrung in Softwareentwicklung und Netzwerktechnik
  • http://ww2.justanswer.com/uploads/LF/lfalkenburg/2015-2-8_01843_.64x64.jpg Avatar von Lutz Falkenburg

    Lutz Falkenburg

    IT-Specialist

    Zufriedene Kunden:

    96
    Seit über 20 Jahren beruflich im IT-/IUK-Bereich tätig. Egal ob EinzelPC der Netzwerk...
  • http://ww2.justanswer.com/uploads/BI/BigDaddyXD/2012-10-24_20126_WhySoSeriousJob.64x64.jpg Avatar von BigDaddyXD

    BigDaddyXD

    Informatiker

    Zufriedene Kunden:

    1588
    Microsoft Certified Professional, Microsoft Certified Desktop Support Technican,...
  • http://ww2.justanswer.com/uploads/PU/Pucky80/2011-5-14_54537_pucky80.64x64.jpg Avatar von Pucky80

    Pucky80

    IT-Systemkaufmann

    Zufriedene Kunden:

    1322
    MCITP (Microsoft Server 2008 Enterprise Administrator)
 
 
 

Ähnliche Fragen in der Kategorie Computer