Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro läuft nur im Einzelschritt korrekt durch

Forumthread: Makro läuft nur im Einzelschritt korrekt durch

Makro läuft nur im Einzelschritt korrekt durch
12.11.2018 15:47:31
Andreas
Hallo zusammen,
folgendes Problem:
Ich habe ein Makro geschrieben, welches einen Barcode anhand bestimmter Formularfelder erzeugt mit dem Plugin ActiveBarcode. Das sind nichts anderes als OLEObjects die man auch entsprechend ansprechen kann.
Nun habe ich eine Schleife erzeugt, die unter anderem den Inhalt des Barcodes verändert.
Abschließend wird das ganze als einzelne PDFs exportiert. (Später mal gedruckt)
Gehe ich per F8 im Einzelschritt durch ist alles in Ordnung, die Schleife zählt hoch und das Objekt aktualisiert richtig.
Lasse ich das Makro so laufen aktualisiert sich der Barcode nicht. Ich habe schon ein Application.Wait von 10 Sekunden eingefügt - bringt auch nichts.
Hat jemand eine Idee?
Anbei noch der Ausschnitt des Codes:

x = InputBox("Wie viele Kopien sollen gedruckt werden?")
ANester = Sheets("Lieferschein").Range("C8") 'Anzahl Nester speichern
Sheets("Lieferschein").Range("C8") = 1 'Beim ersten Nest beginnen
For i = 1 To ANester
'Anpassen eindeutige ID
Sheets("Lieferschein").Range("C15") = Sheets("Lieferschein").Range("C14") & "_" & Sheets("   _
_
_
Lieferschein").Range("C13") & "_" & Sheets("Lieferschein").Range("C8")
Sheets("CSV").Range("A" & i + 1) = Sheets("Lieferschein").Range("C2")
Sheets("CSV").Range("B" & i + 1) = Sheets("Lieferschein").Range("C3")
Sheets("CSV").Range("C" & i + 1) = Sheets("Lieferschein").Range("C4")
Sheets("CSV").Range("D" & i + 1) = Sheets("Lieferschein").Range("C8")
Sheets("CSV").Range("E" & i + 1) = Sheets("Lieferschein").Range("C9") & "_" & Sheets(" _
Lieferschein").Range("C10")
Sheets("CSV").Range("F" & i + 1) = Sheets("Lieferschein").Range("C11") & "_" & Sheets(" _
Lieferschein").Range("C12")
Sheets("CSV").Range("G" & i + 1) = Sheets("Lieferschein").Range("C13")
Sheets("CSV").Range("H" & i + 1) = Sheets("Lieferschein").Range("C14")
Sheets("CSV").Range("I" & i + 1) = Sheets("Lieferschein").Range("C15")
'Update DMC
Sheets("Lieferschein").OLEObjects("DMC1").Object.Text = Sheets("Lieferschein").Range("C15")
Application.Wait (Now + TimeValue("00:00:10"))
' +++ Aktivieren um später zu drucken +++
'ActiveWorkbook.Worksheets("Lieferschein").PrintOut Copies:=x
' +++ PDF Export fürs Testen +++
Sheets("Lieferschein").ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:CSV" & Worksheets(" _
Lieferschein").Range("C15") & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True,   _
_
IgnorePrintAreas:=False, OpenAfterPublish:=False
'Nest erhöhen
If Sheets("Lieferschein").Range("C8") 

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
XP MSOF
12.11.2018 16:02:38
lupo1
AW: Makro läuft nur im Einzelschritt korrekt durch
12.11.2018 16:07:25
Daniel
Hi
der Wait-Befehl ist meistens nutzlos, weil er dein komplettes Excel quasi in Tiefschlaf versetzt, dh nach dem Wait-Befehl macht Excel genau an der Stelle weiter, an der es mit dem Wait-Befehl angehalten hat.
das Problem ist, dass Excel mache Aktualisierungen erst dann durchführt, wenn alle Makros vollständig durchgelaufen sind und der Anwender wieder die Kontrolle bekommt.
Das Neuzeichnen von Grafikelementen ist meinen Erfahrungen nach hiervon betroffen.
Die Lösung wäre hier also, dass man das Ändern der Werte in ein eigenes Makro schreibt und das Ausdrucken des Blattes in ein zweites Makro.
dann führt man erst das Ändern aus und danach das Drucken.
Damit der Anwender davon nichts merkt oder gar gezungen ist, einen zweiten Button zu klicken um das Druckmakro zu starten, ruft man das zweite Makro mit Applicaiton.Ontime auf.
ein mit Applicaiton.Ontime gestartetes Makro wird im Gegensatz zu einem mit Call gestarteten Makro nicht sofort gestartet, sondern erst dann wenn das aufrufende Makro vollständig durchgelaufen ist.
in dieser Lücke zwischen den beiden Makros hat dann Excel zeit, die notwendigen Aktualisierungen durchzuführen.
Gruß Daniel
Anzeige
AW: Makro läuft nur im Einzelschritt korrekt durch
12.11.2018 16:24:30
Daniel
oh da war ich wohl mit meiner Antwort zu schnell.
Hättest vielleicht ... :-)
12.11.2018 16:26:23
lupo1
Wait einbauen müssen - oder zwei Beiträge verfassen :-)
AW: Hättest vielleicht ... :-)
12.11.2018 16:29:59
Daniel
man könnte seine Antwort ja auch schön über alle Foren verteilen, so in jedem Forum ein satz.
Schließlich erwartet der Fragesteller ja auch in jedem Forum eine Antwort.
Gruß Daniel
Anzeige
AW: Makro läuft nur im Einzelschritt korrekt durch
13.11.2018 09:18:22
Andreas
Hi Daniel,
gibt es beim Aufruf per OnTime einen Trick den ich nicht kenne?
Application.OnTime Now + TimeValue("0:0:1"), "Druckenp"
Führt dazu, dass mir Excel erzählt das Makro "Druckenp" sei in der Arbeitsmappe nicht verfügbar oder Makros deaktiviert. Das Sub steht im selben Modul genau unter dem aufrufenden Sub?
Anzeige
Makronamen richtig schreiben, das dürfte
13.11.2018 09:43:23
Daniel
der entscheidende Trick sein.
Der Fehler kommt dann wenn du den Makronamen im Application.Ontime falsch geschrieben hast.
Sollte das aufgerufene Makro nicht in einem allgemeinen Modul stehen sondern beispielsweise in einem Tabellenblattmodul, so musst du den Modulnamen voranstellen, damit VBA weiß in welchem Modul es das Makro suchen muss:
Application.OnTime Now + TimeValue("0:0:1"), "Tabelle1.Druckenp"
Gruß Daniel
Anzeige
AW: Makronamen richtig schreiben, das dürfte
13.11.2018 11:15:24
Andreas
Hallo Daniel,
das Kopieren in ein Allgemeines Modul (und Ergänzen) lässt zumindest das Makro loslaufen. Allerdings startet er in der Schleife die Prozedur nicht mehrfach, sodass ich nur noch ein PDF erhalte.
Ich habe es inzwischen etwas unelegant so gelöst:
Do
DoEvents
Application.Calculate
z=z+1
Loop Until z=10
Grundsätzlich würde es mich aber schon interessieren wieso ich den Aufruf nicht mehrfach starten kann.
Hatte beim OnTime auch schon versucht vorher das Now in eine Variable zu packen, trotzdem ruft er die Prozedur kein zweites Mal auf.
Per Google habe ich viele gefunden, die das Makro zyklisch aufrufen wollten und damit aus sich heraus erneut angesprochen haben. Das hilft mir aber nicht weiter, ich muss ja zurückspringen und mit aktualisierten Informationen aus der Schleife neustarten.
Anzeige
AW: Makronamen richtig schreiben, das dürfte
13.11.2018 11:24:46
Daniel
naja die klassische For-Next-Schleife funktioniert dann nicht mehr
um eine Schleife zu erzeugen, musst du am Ende des Druckmakros das erste Makro wieder mit Application.Ontime aufrufen, so dass eine Schleife entsteht.
als Schleifenvariable nimmst du eine Globlale Variable, diese behalten ihren Wert nach Makroende bzw bei einem erneuten Start des Makros und stehen in allen Makros zur Verfügung
im Druckmakro machst du natürlich eine Abfrage auf diesen Schleifenzähler, um entscheiden zu können ob das erste Makro nochmal aufgerufen werden muss oder ob die Schleife beendet werden kann.
Aber wenn es mit 10 DoEvents und Calculate auch funktioniert, ist es natürlich auch gut.
Gruß Daniel
Anzeige
XP auch in OL/p
12.11.2018 16:08:00
lupo1
;
Anzeige
Anzeige

Infobox / Tutorial

Makroprobleme in Excel: Schritt-für-Schritt-Lösungen


Schritt-für-Schritt-Anleitung

  1. Makro erstellen: Öffne Excel und gehe in den VBA-Editor (Alt + F11). Erstelle ein neues Modul und füge deinen Code ein.
  2. OLEObject ansprechen: Stelle sicher, dass du das ActiveBarcode OLEObject korrekt ansprichst. Hier ein Beispiel:
    Sheets("Lieferschein").OLEObjects("DMC1").Object.Text = "Neuer Text"
  3. Schleife implementieren: Verwende eine For-Next-Schleife, um die Werte zu aktualisieren und PDFs zu erstellen. Hier ein einfacher Code-Ausschnitt:
    For i = 1 To ANester
       Sheets("Lieferschein").Range("C15") = "Neuer Wert"
       ' PDF Export
       Sheets("Lieferschein").ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\CSV\Datei" & i & ".pdf"
    Next i
  4. OnTime verwenden: Um Aktualisierungen zu gewährleisten, kannst du das Druckmakro mit Application.OnTime aufrufen:
    Application.OnTime Now + TimeValue("0:0:1"), "Druckenp"
  5. Testen: Führe das Makro schrittweise aus (F8), um sicherzustellen, dass alles korrekt funktioniert.

Häufige Fehler und Lösungen

  • Barcode aktualisiert sich nicht: Wenn dein Barcode nicht aktualisiert wird, könnte das daran liegen, dass Excel die Aktualisierung erst nach dem vollständigen Durchlauf aller Makros vornimmt.

    • Lösung: Verwende DoEvents oder rufe das Druckmakro mit Application.OnTime auf, um sicherzustellen, dass Excel Zeit hat, die Aktualisierungen durchzuführen.
  • Makro nicht gefunden: Wenn Excel sagt, dass das Makro nicht vorhanden sei, überprüfe den Namen und den Modulpfad.

    • Lösung: Stelle sicher, dass das aufgerufene Makro in einem allgemeinen Modul gespeichert ist. Wenn es in einem Tabellenblattmodul ist, verwende den Modulnamen:
      Application.OnTime Now + TimeValue("0:0:1"), "Tabelle1.Druckenp"

Alternative Methoden

  • Schritt-für-Schritt-Ausführung: Wenn du das Makro schrittweise ausführen möchtest, kannst du dies tun, indem du in der VBA-Umgebung die F8-Taste verwendest.
  • Makros in separaten Modulen: Teile dein Makro in mehrere kleinere Makros auf. Zum Beispiel könnte ein Makro für das Aktualisieren der Werte und ein anderes für den Druck zuständig sein. Das hilft, die Übersichtlichkeit zu erhöhen.

Praktische Beispiele

Hier ist ein vollständiges Beispiel für ein Makro, das einen Barcode generiert und mehrere PDFs exportiert:

Sub BarcodeErzeugenUndExportieren()
    Dim ANester As Integer
    Dim i As Integer
    ANester = Sheets("Lieferschein").Range("C8").Value
    For i = 1 To ANester
        Sheets("Lieferschein").Range("C15").Value = "Barcode_" & i
        Sheets("Lieferschein").OLEObjects("DMC1").Object.Text = Sheets("Lieferschein").Range("C15").Value
        Application.OnTime Now + TimeValue("0:0:1"), "Druckenp"
    Next i
End Sub

Sub Druckenp()
    ActiveWorkbook.Worksheets("Lieferschein").PrintOut
End Sub

Tipps für Profis

  • Debugging: Nutze die Debugging-Funktion in VBA, um herauszufinden, wo genau dein Makro Probleme hat. Setze Haltepunkte und überprüfe die Variablenwerte.
  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung, um unerwartete Fehler abzufangen. Beispiel:
    On Error GoTo Fehlerbehandlung
    ' Code hier
    Exit Sub
    Fehlerbehandlung:
    MsgBox "Ein Fehler ist aufgetreten: " & Err.Description
  • Performance optimieren: Verwende Application.ScreenUpdating = False und Application.Calculation = xlCalculationManual, um die Geschwindigkeit deines Makros zu erhöhen, und stelle diese am Ende wieder zurück.

FAQ: Häufige Fragen

1. Warum funktioniert mein ActiveBarcode nicht? Stelle sicher, dass das ActiveBarcode-Plugin korrekt installiert ist und die OLEObjects richtig angesprochen werden.

2. Wie kann ich ein Makro schrittweise ausführen? Du kannst die F8-Taste im VBA-Editor verwenden, um dein Makro Schritt für Schritt auszuführen und den Verlauf zu beobachten.

3. Was ist der Vorteil von Application.OnTime? Application.OnTime ermöglicht es dir, ein Makro zu einem späteren Zeitpunkt auszuführen, was nützlich ist, um sicherzustellen, dass Excel genügend Zeit hat, Aktualisierungen durchzuführen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige