Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1752to1756
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro mit Schleife für nächste Zeile

Makro mit Schleife für nächste Zeile
30.04.2020 11:18:05
Julian
Liebe VBA-Experten,
als Makro-Anfänger habe ich für eine automatisierte Anschreibenserstellung ein Makro geschrieben, dass eine Vorlage öffnet und bei gesetzten Bookmarks vorgefertigte Bilddateien einsetzt und das Dokument dann als .docx und als .pdf speichert.
Da das selbe Makro für mehrere Anschreiben verwendet werden soll, werden sowohl unterschiedliche Vorlagen, als auch unterschiedliche Bilddateien gezogen, die über den Dateipfad und das Worksheet mit Textkette in einer Zelle zusammengesetzt werden und dann durch das Makro mit range als feste Zellbezüge abgerufen werden.
Jetzt suche ich nach einer Möglichkeit, mit einer Schleife das Makro wiederholt für die nächste Zeile des Worksheets ablaufen zu lassen und anstelle der vier festen Zellbezüge (A8,H8,I8,I8) eine dynamische Ansprache der Zellwerte für jede folgende Zeile bis zur letzten gefüllten Zeile der Spalte A zu erreichen.
Bislang konnte ich keine Oline-Lösung für eine Schleife finden, die die festen Range Werte in mehreren Spalten jeweils für die nächste Zeile um +1 anpasst. Welche Schleife wäre am geeignetsten?
Wie könnte ich das Problem lösen? Vielen Dank schon einmal Voraus.

Sub Anschreiben()
Dim oWordApp As Object
Dim oWordDoc As Object
Dim oWord As Object
Dim FlName As String
Dim imagePath As String
Dim pathTemplate As String
Dim pathimageAnrede As String
Dim pathimageSignature As String
Dim pathdocx As String
Dim pathpdf As String
Dim filenametemplate As String
Dim filenameimageAnrede As String
Dim filenameimagesignatureRS As String
Dim filenameimagesignatureSM As String
Dim filenamesave As String
'Establish a Word application object
On Error Resume Next
Set oWordApp = GetObject(, "Word.Application")
oWordApp.Visible = True
If Err.Number  0 Then
Set oWordApp = CreateObject("Word.Application")
End If
Err.Clear
On Error GoTo 0
oWordApp.Visible = False
'Open Report Template
'Change filenametemplate = Range("H...").Text to applied workbook line.
With oWordDoc
pathTemplate = "C:\Users\...\"
filenametemplate = Range("H8").Text
Set oWordDoc = oWordApp.Documents.Open(pathTemplate & filenametemplate & ".docx")
'Change filenameimageAnrede = Range("A...").Text to applied workbook line.
pathimageAnrede = "C:\Users\...\"
filenameimageAnrede = Range("A8").Text
pathimageSignature = "C:\Users\...\"
filenameimagesignatureRS = Range("N3").Text
pathimageSignature = "C:\Users\...\"
filenameimagesignatureSM = Range("N4").Text
'Insert Images at manually added Bookmarks
imagePath = pathimageAnrede & filenameimageAnrede & ".jpg"
imagePath = "C:\Users\...jpg"
imagePath = "C:\Users\...jpg"
FlName = pathTemplate & filenametemplate & ".docx"
oWordDoc.Bookmarks("Anrede").Range.InlineShapes.AddPicture Filename:=pathimageAnrede &  _
filenameimageAnrede & ".jpg"
oWordDoc.Bookmarks("SignaturRS").Range.InlineShapes.AddPicture Filename:=pathimageSignature  _
_
& filenameimagesignatureRS & ".jpg"
oWordDoc.Bookmarks("SignaturSM").Range.InlineShapes.AddPicture Filename:=pathimageSignature  _
_
& filenameimagesignatureSM & ".jpg"
End With
'Save as DOC
'Change filenamesave = Range("I...").Text to applied workbook line.
With oWordApp
pathdocx = "C:\Users\...\"
filenamesave = Range("I8").Text
Application.DisplayAlerts = False
oWordApp.ActiveDocument.SaveAs Filename:=pathdocx & filenamesave & ".docx"
oWordApp.Application.DisplayAlerts = True
End With
'Save as PDF
'Change filenamesave = Range("I...").Text to applied workbook line.
With oWordDoc
pathpdf = "C:\Users\..."
filenamesave = Range("I8").Text
Application.DisplayAlerts = False
oWordDoc.ExportAsFixedFormat OutputFilename:=pathpdf & filenamesave & ".pdf", ExportFormat:= _
_
wdExportFormatPDF
oWordDoc.Application.DisplayAlerts = True
End With
With oWordApp
oWordApp.ActiveDocument.Close
End With
End Sub

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro mit Schleife für nächste Zeile
30.04.2020 11:37:39
MCO
Hallo Julian!
Hier die Schleife, alle gewünschten Zeilen ins array eintragen
Sub test()
Dim zeilen_arr  As Variant
zeilen_arr = Array(8, 5, 24, 36)
For Zeile = 0 To UBound(zeilen_arr)
MsgBox "Nimm Zeile " & zeilen_arr(Zeile)
Next
End Sub

Gruß, MCO
AW: Makro mit Schleife für nächste Zeile
30.04.2020 11:50:40
Julian
Danke für deine schnelle Antwort MCO. Wo bzw. wie muss ich die Schleife einfügen? Wenn ich den Sub nach meinem Script platziere, bekomme ich die Fehlermeldung "Variable ist nicht definiert". Entschuldige bitte die Anfängerfrage.
AW: Makro mit Schleife für nächste Zeile
30.04.2020 12:30:32
MCO
Hi!
Du mußt in deiner sub die Zeilenvariabel einfügen. Beispielsweise wird aus

filenametemplate = Range("H8").Text
filenametemplate = Range("H" & zl).Text
Dann fügst du deine Sub in die Schleife ein. Das würd ich mit einem Aufruf machen, um nicht den ganzen Code einfügen zu müssen
Vorher musst deine Sub umbennenen, bzw den Parameter hinzufügen:
sub Anschreiben (zl as single)

Damit heißt dann die Variable für die Zeile zl und muß auch nicht weiter dimensioniert werden.
Allerdings müssen wir auch die Zeilen dann in dem Format (Single) übergeben. Das erledigt die Umwandlungsfunktion Csng()
Daraus ergibt sich dann folgende kleine Spielerei

Sub test()
Dim zeilen_arr  As Variant
zeilen_arr = Array(8, 5, 24, 36)
For Zeile = 0 To UBound(zeilen_arr)
Anschreiben CSng(zeilen_arr(Zeile))
Next
End Sub
Sub Anschreiben(zl As Single)
MsgBox "Nimm Zeile " & zl
End Sub
Ich hoffe, ich hab alles ausreichend erklärt.
Gruß, MCO
Anzeige
AW: Makro mit Schleife für nächste Zeile
30.04.2020 15:23:06
Julian
Danke für die ausführliche Beschreibung MCO, so habe ich die Sub richtig einfügen können. Vor jedem Zugriff kommt allerdings immer ein Dialogfeld "Nimm Zeile 8" etc., das mit OK bestätigt werden muss. Gibt es eine Möglichkeit, diese Bestätigung zu automatisieren, damit das Makro einfach von Zeile 8 bis zur letzten befüllten Zeile durchlaufen kann?
AW: Makro mit Schleife für nächste Zeile
01.05.2020 15:03:37
Barbara
Hi,
nachdem MCO offensichtlich urlaubt, erlaube ich mir, einzuspringen.
Nimm MCOs Makro unter
"Daraus ergibt sich dann folgende kleine Spielerei" und setze dort Dein ursprüngliches Makro
"Anschreiben()", aber OHNE die erste ("Sub...") und OHNE die letzte Zeile ("End Sub") anstelle der Zeile
"MsgBox "Nimm Zeile " & zl"
ein und starte dann test().
Vielleicht grudsätzlich:
MCO hatte die glorreiche Idee, Dein Makro
"Anschreiben()" zu einem Unterprogramm namens
"Anschreiben(zl As Single)" und sein
"test()" zum Hauptmakro zu erheben.
LGB
Anzeige
AW: Makro mit Schleife für nächste Zeile
04.05.2020 11:58:25
Julian
Hallo Barbara,
danke dir für die Klarstellung. "MsgBox" herauszunehmen, hat natürlich geholfen - da hätte ich eigentlich auch selbst drauf kommen können.
Gibt es vielleicht noch eine Möglichkeit, wie man in der Aufzählung zeilen_arr = Array(x, y, ...) Zeilen, in denen Hx leer ist, auslassen bzw. in der Schleife zur nächsten Zeile übergehen kann? Danke für deine Hilfe.
AW: Makro mit Schleife für nächste Zeile
04.05.2020 12:45:16
Barbara
Hi
Ersetze
Anschreiben CSng(zeilen_arr(Zeile))

durch
If Range("H" & zl).Text  "" Then _
Anschreiben CSng(zeilen_arr(Zeile))

Bitte testen!
LGB
Anzeige
AW: Makro mit Schleife für nächste Zeile
04.05.2020 12:58:39
Julian
Hallo Barbara,
ich bekomme beim Testen die Fehlermeldung, dass "zl" nicht definiert ist. Habe ich etwas falsch gemacht bzw. wie müsste ich "zl" noch definieren? Danke im Voraus.
Sub test()
Dim zeilen_arr  As Variant
Dim Zeile As Long
zeilen_arr = Array(8, 9) '(2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,  _
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45)
For Zeile = 0 To UBound(zeilen_arr)
If Range("H" & zl).Text  "" Then _
Anschreiben CSng(zeilen_arr(Zeile))
Next
End Sub
Sub Anschreiben(zl As Single)
End Sub

Anzeige
AW: Makro mit Schleife für nächste Zeile
04.05.2020 13:06:01
Barbara
Sorry, das war mein Fehler.
If Range("H" & zeilen_arr(Zeile)).Text  "" Then _
Anschreiben CSng(zeilen_arr(Zeile))

AW: Makro mit Schleife für nächste Zeile
06.05.2020 16:27:51
Barbara
Passt es jetzt?
AW: Makro mit Schleife für nächste Zeile
06.05.2020 17:00:46
Julian
Ja, danke. Es hat funktioniert.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige