HYPERLINK (Aus Formel in Excel generiert) mit VBA prüfen
Hallo,
ich habe eine Excel Tabelle mit etlichen Hyperlinks:
In Spalte H steht die Rechnungsnummer (z.B. 61789189)
In folgendem Ordner befinden sich die PDF Dateien die per Hyperlin geöffnet werden sollen: W:\Personal\Manuel\FACTURAS_VAUDE
In Spalte L wird der Hyperlink generiert: =Wenn(H10="";"";HIPERLINK("W:\Personal\Manuel\FACTURAS_VAUDE\"&H10&".pdf";"LINK"""))
In Spalte M soll nun per VBA Code ein "x" geschrieben werden, wenn der Hyperlin tot ist (also die entsprechende PDF Datei nicht existiert)
Momentan muss ich das manuell eintragen in dem ich jeden Hyperlin anklicke (entweder öffnet sich dann die PDF Datei oder ich bekomme eine Fehlermeldung)
Ich freue mich auf Eure Antworten
Viele Grüsse
Manfred
ich habe eine Excel Tabelle mit etlichen Hyperlinks:
In Spalte H steht die Rechnungsnummer (z.B. 61789189)
In folgendem Ordner befinden sich die PDF Dateien die per Hyperlin geöffnet werden sollen: W:\Personal\Manuel\FACTURAS_VAUDE
In Spalte L wird der Hyperlink generiert: =Wenn(H10="";"";HIPERLINK("W:\Personal\Manuel\FACTURAS_VAUDE\"&H10&".pdf";"LINK"""))
In Spalte M soll nun per VBA Code ein "x" geschrieben werden, wenn der Hyperlin tot ist (also die entsprechende PDF Datei nicht existiert)
Momentan muss ich das manuell eintragen in dem ich jeden Hyperlin anklicke (entweder öffnet sich dann die PDF Datei oder ich bekomme eine Fehlermeldung)
Ich freue mich auf Eure Antworten
Viele Grüsse
Manfred
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 130892
Url: https://administrator.de/forum/hyperlink-aus-formel-in-excel-generiert-mit-vba-pruefen-130892.html
Ausgedruckt am: 07.04.2025 um 15:04 Uhr
30 Kommentare
Neuester Kommentar

Hallo mreske!
Das folgende Makro überprüft alle Hyperlinks im aktiven Sheet und schreibt in der Folge-Spalte für False = x und für True = Leer.
Jenachdem ob Du Das Makro manuell oder lieber über einen Button starten möchtest, den Code im VB-Editor für manuell in ein Modul oder mit Button in das entsprechende Tabellenblatt kopieren.
Gruß Dieter
Das folgende Makro überprüft alle Hyperlinks im aktiven Sheet und schreibt in der Folge-Spalte für False = x und für True = Leer.
Jenachdem ob Du Das Makro manuell oder lieber über einen Button starten möchtest, den Code im VB-Editor für manuell in ein Modul oder mit Button in das entsprechende Tabellenblatt kopieren.
Sub TestHyperlinks()
Dim Fso As Object, Link As Hyperlink
Set Fso = CreateObject("Scripting.FileSystemObject")
For Each Link In ActiveSheet.Hyperlinks
If Fso.FileExists(Link.Address) = False Then
Link.Range.Offset(0, 1) = "x"
Else
Link.Range.Offset(0, 1) = ""
End If
Next
End Sub
Gruß Dieter

Hallo mreske!
Oha, ich hab's nur mit eingefügten Hyperlinks testen können
Dann sollte das eigentlich funktionieren:
Gruß Dieter
Oha, ich hab's nur mit eingefügten Hyperlinks testen können
Dann sollte das eigentlich funktionieren:
Const Zeile1 = 10 'Hyperlink-Zeilen Begin
Const Spalte = "L" 'Hyperlink-Spalte
Private Sub TestHyperlinks()
Dim Fso As Object, c As Range, EndLine As Long
Set Fso = CreateObject("Scripting.FileSystemObject")
EndLine = Cells(Cells.Rows.Count, Spalte).End(xlUp).Row
For Each c In Range(Cells(Zeile1, Spalte), Cells(EndLine, Spalte))
If c.Formula Like "*HIPERVINCULO*" And c.Text <> "" Then
If Fso.FileExists(c) = False Then
c.Offset(0, 1) = "x"
Else
c.Offset(0, 1) = ""
End If
End If
Next
End Sub
Gruß Dieter

Hallo Mreske!
Yep, gern geschehen. Freut mich, dass es funktioniert

Annsonsten, wäre noch sinnvoll den Beitrag als gelöst zu makieren.
Gruß Dieter
Yep, gern geschehen. Freut mich, dass es funktioniert
3. Anstatt "LINK" muss die Formel in Spalte L jeweils den PFAD angeben.
Desdewegen habe ich in weiser Voraussicht nur den Test <And c.Text <> ""> geschrieben, eben weil dieser Wert verändbar istAnnsonsten, wäre noch sinnvoll den Beitrag als gelöst zu makieren.
Gruß Dieter

Hallo Mreske!

Sollen alle/mehrere Pdf's nacheinander gedruckt oder per Selektierung der Zeile und PDF-Druck-Button einzeln gedruckt werden?
Gruß Dieter
Zitat von @mreske:
Gibt es eine Möglichkeit, die PDF Dateien, die existieren, per Macro zu öffnen und dann auszudrucken?
Ja das geht, aber das "wie genau" muss ich selber erst mal ausbrobieren und das dauert ein wenigGibt es eine Möglichkeit, die PDF Dateien, die existieren, per Macro zu öffnen und dann auszudrucken?
Sollen alle/mehrere Pdf's nacheinander gedruckt oder per Selektierung der Zeile und PDF-Druck-Button einzeln gedruckt werden?
Gruß Dieter

Hallo Mreske!
Hier nochmal komplett Version 1 <TestHyperlink> und <PrintPdf> wobei <Wenn True> der Pfad in Spalte L stehen muss.
Hier Version 2 <TestHyperlink> und <PrintPdf> wobei Du wieder die ursprüngliche Formel verwenden kannst (Zellinhalt = "Link"):
Die Konstante <PdfPfad> sollte stimmen. Die Konstante <AcrobatReader> muss angepasst werden, aber darauf achten, dass die Hochkommas so bleiben, wie sie sind. Das ist insofern wichtig, damit Programm- und Dateinamen Leerzeichen enthalten dürfen.
Bei Version 1 habe ich wohl etwas geschlafen und nicht bedacht, dass der Dateipfad unglücklicherweise in der Zelle stehen muss
In Version 2 wird der Dateipfad durch auslesen der Spalte H automatisch generiert, sodass in Spalte L ein belieber Text stehen kann
Der Druckvorgang für die PDF-Dateien klappt soweit, allerdings kann ich nicht vorhersagen, ob es auch in großem Umfang funktioniert. Getestet habe ich es mit 26 1-Seitigen Pdf-Dateien. Wieviel Druckaufträge letztendlich gesendet werden können, hängt davon ab, wieviel Druckaufträge die Druckerwarteschlange aufnehmen kann. Der AcrobatReader muss am Ende manuell geschlossen werden (Minimize Taskleiste).
Gruß Dieter
Hier nochmal komplett Version 1 <TestHyperlink> und <PrintPdf> wobei <Wenn True> der Pfad in Spalte L stehen muss.
Option Explicit
Const Zeile1 = 10 'Hyperlink-Zeilen Begin
Const Spalte = "L" 'Hyperlink-Spalte
Const AcrobatReader = """D:\Programme\Adobe\Reader 9.0\Reader\AcroRd32.exe"" /p /h """
Private Sub TestHyperlinks_Click()
Dim Fso As Object, c As Range, EndLine As Long
Set Fso = CreateObject("Scripting.FileSystemObject")
EndLine = Cells(Cells.Rows.Count, Spalte).End(xlUp).Row
For Each c In Range(Cells(Zeile1, Spalte), Cells(EndLine, Spalte))
If c.Formula Like "*HYPERLINK*" And c.Text <> "" Then
If Fso.FileExists(c) = False Then
c.Offset(0, 1) = "x"
Else
c.Offset(0, 1) = ""
End If
End If
Next
End Sub
Private Sub PrintPdf_Click()
Dim Fso As Object, c As Range, EndLine As Long
Set Fso = CreateObject("Scripting.FileSystemObject")
EndLine = Cells(Cells.Rows.Count, Spalte).End(xlUp).Row
For Each c In Range(Cells(Zeile1, Spalte), Cells(EndLine, Spalte))
If c.Formula Like "*HYPERLINK*" And c.Text <> "" Then
If Fso.FileExists(c) = True Then
Shell AcrobatReader & c & """", vbMinimizedNoFocus
End If
End If
Next
End Sub
Option Explicit
Const Zeile1 = 10 'Hyperlink-Zeilen Begin
Const Spalte = "L" 'Hyperlink-Spalte
Const PdfName = "H" 'Spalte Pdf-Name
'Pfad der Pdf-Dateien mit Variable (?) für Dateiname
Const PdfPfad = "W:\Personal\Manuel\Facturas_Vaude\?.pdf"
Const AcrobatReader = """D:\Programme\Adobe\Reader 9.0\Reader\AcroRd32.exe"" /p /h """
Private Sub TestHyperlinks_Click()
Dim Fso As Object, c As Range, EndLine As Long, Pdf As String
Set Fso = CreateObject("Scripting.FileSystemObject")
EndLine = Cells(Cells.Rows.Count, Spalte).End(xlUp).Row
For Each c In Range(Cells(Zeile1, Spalte), Cells(EndLine, Spalte))
If c.Formula Like "*HYPERLINK*" And c.Text <> "" Then
Pdf = Replace(PdfPfad, "?", Cells(c.Row, PdfName))
If Fso.FileExists(Pdf) = False Then
c.Offset(0, 1) = "x"
Else
c.Offset(0, 1) = ""
End If
End If
Next
End Sub
Private Sub PrintPdf_Click()
Dim Fso As Object, c As Range, EndLine As Long, Pdf As String
Set Fso = CreateObject("Scripting.FileSystemObject")
EndLine = Cells(Cells.Rows.Count, Spalte).End(xlUp).Row
For Each c In Range(Cells(Zeile1, Spalte), Cells(EndLine, Spalte))
If c.Formula Like "*HYPERLINK*" And c.Text <> "" Then
Pdf = Replace(PdfPfad, "?", Cells(c.Row, PdfName))
If Fso.FileExists(Pdf) = True Then
Shell AcrobatReader & Pdf & """", vbMinimizedNoFocus
End If
End If
Next
End Sub
Bei Version 1 habe ich wohl etwas geschlafen und nicht bedacht, dass der Dateipfad unglücklicherweise in der Zelle stehen muss
In Version 2 wird der Dateipfad durch auslesen der Spalte H automatisch generiert, sodass in Spalte L ein belieber Text stehen kann
Der Druckvorgang für die PDF-Dateien klappt soweit, allerdings kann ich nicht vorhersagen, ob es auch in großem Umfang funktioniert. Getestet habe ich es mit 26 1-Seitigen Pdf-Dateien. Wieviel Druckaufträge letztendlich gesendet werden können, hängt davon ab, wieviel Druckaufträge die Druckerwarteschlange aufnehmen kann. Der AcrobatReader muss am Ende manuell geschlossen werden (Minimize Taskleiste).
Gruß Dieter

Hallo MReske!
Yepp, gern geschehen
Wie das mit dem Drucken so ausgeht, würde mich schon interessieren und fände es daher toll, wenn Du bei Gelegenheit ein Feedback dazu abgibst.
Gruß Dieter
Yepp, gern geschehen
Wie das mit dem Drucken so ausgeht, würde mich schon interessieren und fände es daher toll, wenn Du bei Gelegenheit ein Feedback dazu abgibst.
Gruß Dieter

Hallo Mreske!

Gruß Dieter
Zitat von @mreske:
Hi Dieter,
jetzt habe ich das Makro getestet und es funktioniert perfekt (habe nur den Pfad vom Acrobat geändert). Wie das Script bei
grossen Druckaufträgen reagiert habe ich noch nicht getestet, lediglich mit ca.100 Druckaufträgen. Das probiere ich aber
noch aus und gebe hier dann die entsprechende Info.
Danke. 100 ist doch schon mal was und lass Dir ruhig Zeit mit dem Ganzen. Es hat überhaupt keine EileHi Dieter,
jetzt habe ich das Makro getestet und es funktioniert perfekt (habe nur den Pfad vom Acrobat geändert). Wie das Script bei
grossen Druckaufträgen reagiert habe ich noch nicht getestet, lediglich mit ca.100 Druckaufträgen. Das probiere ich aber
noch aus und gebe hier dann die entsprechende Info.
Gruß Dieter

Hallo Manfred!



Und welche der beiden Versionen verwendest Du jetzt? Version 1 oder Version 2
Gruß Dieter
Zitat von @mreske:
Tolldas Makro läuft seit gut einer Stunde und hat bisher ca.1500 Seiten gedruckt - alles läuft bestens ohne Probleme. Es
scheint also, als würde der Druckauftrag bei grosser Datenmenge nicht abbrechen.Jetzt habe ich schon ein schlechtes Gewissen, dich um eine Erweiterung zu fragen (im Internet finde ich aber nichts dazu).
Ein schlechtes Gewissen musst Du deswegen nicht haben. Ich kann ja erstens Nein sagen und zweitens ist es keine große SacheIch möchte jetzt eine CD anlegen, in der alle PDF Dateien, die in der Excel Tabelle mit einem "x" als existent
markiert sin, per Makro kopieren und in einen neuen Ordner (z.B.: W:\Personal\Manuel\FACTURAS_VAUDE_COPY) eingefügt werden
(also im Prinzip den "DRUCKEN"Befehl in ein COPY + PASTE Befehl umwandeln
Da haben wir jetzt schon ein kleines Missverständnis, weil es im Erstbeitrag hieß, dass die PDF's - die tot sind - ein "x" haben sollen und im meinen Codes auch so gehandhabt wurde?markiert sin, per Makro kopieren und in einen neuen Ordner (z.B.: W:\Personal\Manuel\FACTURAS_VAUDE_COPY) eingefügt werden
(also im Prinzip den "DRUCKEN"Befehl in ein COPY + PASTE Befehl umwandeln
Könntest Du mir mit diesem Befehl bitte noch einmal behilflich sein?
Ich werd's versuchenUnd welche der beiden Versionen verwendest Du jetzt? Version 1 oder Version 2
Gruß Dieter

Hallo Manfred!
Passend zum letzten Code weiter oben, CopyPdf Version 1 und 2.
Version 1:
Wobei die Const-Zeile 1 zu den anderen Konstanten am Anfang des Codes hinzuzufügen ist. Wenn vor dem kopieren der Kopie-Ordner geleert werden soll, dann in den Zeilen 8 und 10 die Kommentarzeichen entfernen. Funktion Zeile 8 ist [Kopie-Ordner löschen wenn er existiert] und Zeile 10 ist [Kopie-Ordner neu erstellen].
Version 2:
Die Zeile 1, 8 und 10, wie bei Version 1
Wenn das "x" die existierenden Pdf's repräsentieren soll, dann musst Du ja nur in True/False das "" und "x" vertauschen. In dem Fall könntest Du aber auch für False "" und für True ein kleines "ü" nehmen und in der Spalte das Schrift-Format "Windings 11 fett Schriftfarbe Grün" für ein Häkchen verwenden
Gruß Dieter
Passend zum letzten Code weiter oben, CopyPdf Version 1 und 2.
Version 1:
Const PdfCopyPfad = "W:\Personal\Manuel\Facturas_Vaude_Copy"
Private Sub CopyPdf_Click()
Dim Fso As Object, c As Range, EndLine As Long
Set Fso = CreateObject("Scripting.FileSystemObject")
'On Error Resume Next: Fso.DeleteFolder PdfCopyPfad, True: On Error GoTo 0
'Fso.CreateFolder PdfCopyPfad
EndLine = Cells(Cells.Rows.Count, Spalte).End(xlUp).Row
For Each c In Range(Cells(Zeile1, Spalte), Cells(EndLine, Spalte))
If c.Formula Like "*HYPERLINK*" And c.Text <> "" Then
If Fso.FileExists(c) = True Then Fso.CopyFile c, PdfCopyPfad & "\"
End If
Next
End Sub
Version 2:
Const PdfCopyPfad = "W:\Personal\Manuel\Facturas_Vaude_Copy"
Private Sub CopyPdf_Click()
Dim Fso As Object, c As Range, EndLine As Long, Pdf As String
Set Fso = CreateObject("Scripting.FileSystemObject")
'On Error Resume Next: Fso.DeleteFolder PdfCopyPfad, True: On Error GoTo 0
'Fso.CreateFolder PdfCopyPfad
EndLine = Cells(Cells.Rows.Count, Spalte).End(xlUp).Row
For Each c In Range(Cells(Zeile1, Spalte), Cells(EndLine, Spalte))
If c.Formula Like "*HYPERLINK*" And c.Text <> "" Then
Pdf = Replace(PdfPfad, "?", Cells(c.Row, PdfName))
If Fso.FileExists(Pdf) = True Then Fso.CopyFile Pdf, PdfCopyPfad & "\"
End If
Next
End Sub
Wenn das "x" die existierenden Pdf's repräsentieren soll, dann musst Du ja nur in True/False das "" und "x" vertauschen. In dem Fall könntest Du aber auch für False "" und für True ein kleines "ü" nehmen und in der Spalte das Schrift-Format "Windings 11 fett Schriftfarbe Grün" für ein Häkchen verwenden
Gruß Dieter

Hallo Manfred!


Gruß Dieter
Zitat von @mreske:
was soll ich sagen....?!.....die Version 1 hat auf Anhieb funktioniert ohne was am Code ändern zu müssen.
Freut mich, dass es auf Anhieb funktioniert hatwas soll ich sagen....?!.....die Version 1 hat auf Anhieb funktioniert ohne was am Code ändern zu müssen.
Vielen vielen Dank für die Super Hilfe Dieter, so was nenne ich mal professionell und unkompliziert!!!!
Gern geschehen. Man tut was man kann, um anderen die Arbeit etwas leichter zu machen Gruß Dieter
Hallo Dieter,
vielen, vielen Dank für den tollen Thread - ich habe auch seeeehr davon profitiert.
Allerdings stehe ich jetzt vor einem weiteren Problem: Kann ich bei dem Druckbefehl auch noch irgendwo einen Drucker angeben? Denn ich möchte meine PDFs nicht auf den Standarddrucker schicken. Also etwas wie
Shell AcrobatReader & LinkAdresse & """Druckername auf Ne00:", vbMinimizedNoFocus
(Ansonsten Konstanten und Variablen aus dem obigen Code).
Danke für jeden Hinweis!!!
Grüße
Tine
vielen, vielen Dank für den tollen Thread - ich habe auch seeeehr davon profitiert.
Allerdings stehe ich jetzt vor einem weiteren Problem: Kann ich bei dem Druckbefehl auch noch irgendwo einen Drucker angeben? Denn ich möchte meine PDFs nicht auf den Standarddrucker schicken. Also etwas wie
Shell AcrobatReader & LinkAdresse & """Druckername auf Ne00:", vbMinimizedNoFocus
(Ansonsten Konstanten und Variablen aus dem obigen Code).
Danke für jeden Hinweis!!!
Grüße
Tine

Hallo Tine!
Du kannst vor dem Druckauftrag den aktiven Standard-Druckernamen in eine Variable sichern und Deinen Wunsch-Drucker als Standard-Drucker festlegen. Nach dem Druckauftrag dann einfach den gesicherten Druckernamen wieder als Standard-Drucker festlegen.
Den Namen des Standard-Druckers kannst Du mit dieser Routine auslesen:
Drucker zum auslesen vorher als Standard-Drucker festlegen.
Gruß Dieter
Du kannst vor dem Druckauftrag den aktiven Standard-Druckernamen in eine Variable sichern und Deinen Wunsch-Drucker als Standard-Drucker festlegen. Nach dem Druckauftrag dann einfach den gesicherten Druckernamen wieder als Standard-Drucker festlegen.
Dim StdDrucker As String
StdDrucker = Application.ActivePrinter
Application.ActivePrinter = "Druckername auf Ne00:"
Shell AcrobatReader.....
Application.ActivePrinter = StdDrucker
Den Namen des Standard-Druckers kannst Du mit dieser Routine auslesen:
Sub GetStdPrinterName()
MsgBox "Die Druckerbezeichnung: " & Application.ActivePrinter
End Sub
Gruß Dieter
Hallo Dieter,
danke für die Antwort - klappt leider nicht. Der Druckauftrag geht auf den Standarddrucker.
Ich nutze Office XP, und da scheint die von Dir vorgeschlagene Routine nur den Excel-Standarddrucker zu beeinflussen und nicht den Windows-Standarddrucker, auf den ja dann offenbar Acrobat zugreift.....
Fällt Dir dazu noch was ein?
Danke!!!!
Grüße
Tine
danke für die Antwort - klappt leider nicht. Der Druckauftrag geht auf den Standarddrucker.
Ich nutze Office XP, und da scheint die von Dir vorgeschlagene Routine nur den Excel-Standarddrucker zu beeinflussen und nicht den Windows-Standarddrucker, auf den ja dann offenbar Acrobat zugreift.....
Fällt Dir dazu noch was ein?
Danke!!!!
Grüße
Tine

Hallo Tine!
Sorry, der Wechsel des Standard-Druckers hat natürlich nur Auswirkungen beim Drucken von Excel-Dateien.
U.a. habe ich folgendes gegoogelt und könnte Dir weiterhelfen:
The DDE command line parameters for Acrobat and Reader are as follows. These are unsupported but have worked for some developers.
AcroRd32.exe /p filename - executes the Reader and prints a file
AcroRd32.exe /t path printername drivername portname - Initiates
Acrobat Reader, prints a file while suppressing the Acrobat print dialog box, then terminates Reader.
The four parameters of the /t option evaluate to path,printername, drivername, and portname (all strings).
printername - The name of your printer.
drivername - Your printer driver’s name. Whatever appears in the Driver Used box when you view your printer’s properties.
portname - The printer's port. portname cannot contain any "/" characters; if it does, output is routed to the default port for that printer.
Gruß Dieter
Sorry, der Wechsel des Standard-Druckers hat natürlich nur Auswirkungen beim Drucken von Excel-Dateien.
U.a. habe ich folgendes gegoogelt und könnte Dir weiterhelfen:
The DDE command line parameters for Acrobat and Reader are as follows. These are unsupported but have worked for some developers.
AcroRd32.exe /p filename - executes the Reader and prints a file
AcroRd32.exe /t path printername drivername portname - Initiates
Acrobat Reader, prints a file while suppressing the Acrobat print dialog box, then terminates Reader.
The four parameters of the /t option evaluate to path,printername, drivername, and portname (all strings).
printername - The name of your printer.
drivername - Your printer driver’s name. Whatever appears in the Driver Used box when you view your printer’s properties.
portname - The printer's port. portname cannot contain any "/" characters; if it does, output is routed to the default port for that printer.
Gruß Dieter

Hallo Tine!
Falls der Versuch mit der Akrobat-Kommandozeile (/t) nicht klappt, könntest Du diesen Code mal testen. Bei mir funktionierts bestens
Falls beides USB-Drucker sind, kannst Du Sql-Anweisung auch ändern in:
Gruß Dieter
Falls der Versuch mit der Akrobat-Kommandozeile (/t) nicht klappt, könntest Du diesen Code mal testen. Bei mir funktionierts bestens
Option Explicit
Option Compare Text
Const strComputer = "."
Const PdfPrinter = "Canon MX850 series Printer"
Const ErrMsg = "Setzen des Standard-Druckers fehlgeschlagen"
Private Sub PrintPdf()
Dim StdPrinter As String
StdPrinter = GetStdPrinter
If SetStdPrinter(PdfPrinter) = False Then MsgBox ErrMsg, vbExclamation, "Fehler": Exit Sub
'Pdf's drucken...
If SetStdPrinter(StdPrinter) = False Then MsgBox ErrMsg, vbExclamation, "Fehler"
End Sub
Private Function GetStdPrinter() As String
Dim objWMIService As Object, colItems As Object, objItem As Object
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Printer", , 48)
For Each objItem In colItems
If objItem.Default = True Then GetStdPrinter = objItem.Name: Exit For
Next
End Function
Private Function SetStdPrinter(ByRef Printer) As Boolean
Dim objWMIService As Object, colItems As Object, objItem As Object
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Printer", , 48)
For Each objItem In colItems
If objItem.Name Like Printer Then objItem.SetDefaultPrinter: SetStdPrinter = True: Exit For
Next
End Function
Falls beides USB-Drucker sind, kannst Du Sql-Anweisung auch ändern in:
("SELECT * FROM Win32_Printer WHERE PortName LIKE 'USB%'", , 48)
Gruß Dieter
Hallo Dieter,
vielen, vielen Dank für die geduldige und ausführliche Hilfe: Ich habe es mit der Kommandozeilenvariante hinbekommen:
Ich musste ein paar Mal probieren, bis ich die Anführungszeichen richtig verteilt hatte, aber jetzt geht's - 1000 Dank!
Grüße
Tine
vielen, vielen Dank für die geduldige und ausführliche Hilfe: Ich habe es mit der Kommandozeilenvariante hinbekommen:
Shell """C:\Programme\Adobe\Reader 9.0\Reader\AcroRd32.exe"" /t " _
& LinkAdresse & " ""Druckername"" ""Druckertreiber"" ""Druckerport""", vbMinimizedNoFocus
Ich musste ein paar Mal probieren, bis ich die Anführungszeichen richtig verteilt hatte, aber jetzt geht's - 1000 Dank!
Grüße
Tine
PS: Hallo Dieter,
einen habe ich noch, vielleicht kannst Du mir da auch weiterhelfen......
Die Links der zu druckenden PDF-Dokumente holt sich VBA aus meiner Exceltabelle, Links können in den Spalten 15 bis 28 der jeweiligen Zeile stehen.
Die zugehörige Schleife habe ich mittels "Range" realisiert:
Leider arbeitet er die Zellen nicht von links nach rechts ab, sondern nimmt meistens erst das erste Dokument und dann von rechts nach links, unabhängig davon, wie in der Zeile "For Each c in Range" die Grenzen gesetzt sind (jeweils 2. Koordinate vertauscht). Ist das bei Range so? Muss ich dann doch eine For-Schleife machen, die die Zellen in der richtigen Reihenfolge abarbeitet?
Danke!!!!
Grüße
Tine
einen habe ich noch, vielleicht kannst Du mir da auch weiterhelfen......
Die Links der zu druckenden PDF-Dokumente holt sich VBA aus meiner Exceltabelle, Links können in den Spalten 15 bis 28 der jeweiligen Zeile stehen.
Die zugehörige Schleife habe ich mittels "Range" realisiert:
For Each c In Range(Cells(ZeilenNr, 15), Cells(ZeilenNr, 28))
If c.Hyperlinks.Count And c.Text <> "" Then
For Each Link In c.Hyperlinks
LinkAdresse = "K:\testordner\" + Link.Address
If Fso.FileExists(LinkAdresse) = True Then
Shell """C:\Programme\Adobe\Reader 9.0\Reader\AcroRd32.exe"" /t " _
& LinkAdresse & " ""Druckername"" ""Druckertreiber"" ""Druckerport""", vbMinimizedNoFocus
End If
Next
End If
Leider arbeitet er die Zellen nicht von links nach rechts ab, sondern nimmt meistens erst das erste Dokument und dann von rechts nach links, unabhängig davon, wie in der Zeile "For Each c in Range" die Grenzen gesetzt sind (jeweils 2. Koordinate vertauscht). Ist das bei Range so? Muss ich dann doch eine For-Schleife machen, die die Zellen in der richtigen Reihenfolge abarbeitet?
Danke!!!!
Grüße
Tine

Hallo Tine!
Find ich Toll, dass Du es doch mit der Akrobat-Kommandozeile hinbekommen hast
Die Schleifen würde ich in dem Fall so machen:
Dann wünsche ich Dir ein schönes WE
Gruß Dieter
Find ich Toll, dass Du es doch mit der Akrobat-Kommandozeile hinbekommen hast
Die Schleifen würde ich in dem Fall so machen:
For r = BegLine To EndLine
For c = 15 To 28
If Cells(r, c).Hyperlinks.Count Then
LinkAdresse = "K:\testordner\" + Cells(r, c).Hyperlinks(1).Address
If Fso.FileExists(LinkAdresse) = True Then
Shell """C:\Programme\Adobe\Reader 9.0\Reader\AcroRd32.exe"" /t " & LinkAdresse & _
" ""Druckername"" ""Druckertreiber"" ""Druckerport""", vbMinimizedNoFocus
End If
End If
Next
Next
Dann wünsche ich Dir ein schönes WE
Gruß Dieter
Hallo Dieter,
danke für den Hinweis. Ich habe festgestellt, dass das Problem nicht von Excel verursacht wird, sondern im weiteren Ablauf in der Kommunikation mit dem Drucker.
Auch mit der "For"-Schleife stimmt die Reihenfolge manchmal nicht, aber wenn ich in meinem Makro eine Verzögerung von 2s via application.wait einfüge, ist alles richtig. Die Range-Schleife funktioniert mit einer Verzögerung von 3s.
Dir auch ein schönes Wochenende,
Grüße
Tine
danke für den Hinweis. Ich habe festgestellt, dass das Problem nicht von Excel verursacht wird, sondern im weiteren Ablauf in der Kommunikation mit dem Drucker.
Auch mit der "For"-Schleife stimmt die Reihenfolge manchmal nicht, aber wenn ich in meinem Makro eine Verzögerung von 2s via application.wait einfüge, ist alles richtig. Die Range-Schleife funktioniert mit einer Verzögerung von 3s.
Dir auch ein schönes Wochenende,
Grüße
Tine

Hallo Tine!
Dann wäre eventuell die Methode mit setzen des Standard-Druckers doch sinnvoller. Da werden die Druckaufträge der Reihe nach in der Druckerwarteschlange gespoolt und der Reihe nach an den Drucker weitergegeben?
Gruß Dieter
Dann wäre eventuell die Methode mit setzen des Standard-Druckers doch sinnvoller. Da werden die Druckaufträge der Reihe nach in der Druckerwarteschlange gespoolt und der Reihe nach an den Drucker weitergegeben?
Gruß Dieter
Hallo Dieter,
die Routine mit dem Standarddrucker-Umsetzen funktioniert prinzipiell prima, allerdings ist folgendes zu beachten: Man muss aufpassen, dass vor dem Start der Druckroutine Acrobat noch nicht geöffnet ist, sonst bekommt Acrobat das Ändern des Standarddruckers nicht mit - ich schließe am Ende der Routine mittels:
Allerdings ist Excel schneller als Acrobat, wenn man den Schließbefehl normal am Ende der Druck-Sub aufruft, werden möglicherweise nicht alle Dokumente gedruckt, weil Acrobat schon geschlossen ist, bevor alle Dokumente gedruckt sind. D.h. ich füge hier auch wieder eine Verzögerung ein.
Und die Reihenfolge mit dem Drucken scheint wirklich an Acrobat zu hängen, denn auch bei der Standarddruckervariante stimmt die Reihenfolge manchmal nicht. Offenbar öffnet Acrobat ein File nach dem anderen, gibt aber kleine Dokumente schneller an den Drucker weiter als große.
Also bleibe ich wohl bei meiner Kommandozeilenvariante mit Wartezeit.....
Grüße
Tine
die Routine mit dem Standarddrucker-Umsetzen funktioniert prinzipiell prima, allerdings ist folgendes zu beachten: Man muss aufpassen, dass vor dem Start der Druckroutine Acrobat noch nicht geöffnet ist, sonst bekommt Acrobat das Ändern des Standarddruckers nicht mit - ich schließe am Ende der Routine mittels:
Private Sub AcroReaderBeenden()
Dim objWMI As Object
Dim objProcess As Object
Dim colSystem As Object
Set objWMI = GetObject("winmgmts:")
Set colSystem = objWMI.InstancesOf("win32_process")
For Each objProcess In colSystem
If objProcess.Name = "AcroRd32.exe" Then
objProcess.Terminate
End If
Next
Set colSystem = Nothing
Set objProcess = Nothing
Set objWMI = Nothing
End Sub
Allerdings ist Excel schneller als Acrobat, wenn man den Schließbefehl normal am Ende der Druck-Sub aufruft, werden möglicherweise nicht alle Dokumente gedruckt, weil Acrobat schon geschlossen ist, bevor alle Dokumente gedruckt sind. D.h. ich füge hier auch wieder eine Verzögerung ein.
Und die Reihenfolge mit dem Drucken scheint wirklich an Acrobat zu hängen, denn auch bei der Standarddruckervariante stimmt die Reihenfolge manchmal nicht. Offenbar öffnet Acrobat ein File nach dem anderen, gibt aber kleine Dokumente schneller an den Drucker weiter als große.
Also bleibe ich wohl bei meiner Kommandozeilenvariante mit Wartezeit.....
Grüße
Tine

Hallo Tine!
Naja, wenigstens funktioniert das Ganze
Wenn auch nicht so, wie ich mir das vorgestellt hatte.
Danke für die Hinweise
Gruß Dieter
Naja, wenigstens funktioniert das Ganze
Danke für die Hinweise
Gruß Dieter