Makro Pause

Hallo Leute,

ich manipuliere mittels einer VBA-Schleife die Datensätze einer Access-Tabelle.
Nun sind das aber ca. 3,9 mio Datensätze.
Wie schaffe ich es, ein laufendes Makro zu unterbrechen und am Folgetag bei der letzten ID wieder anzusetzen ?

Außerdem habe ich mich gefragt wie ich die Tabelle beim öffnen mittels VBA auf oder absteigend zu sortieren.

Meine Tabelle öffne ich mit folgendem:
Set recLesen = db.OpenRecordset(„SELECT * FROM KUSYMA ORDER BY ID“)

Dann sind die Datensätze zwar aufsteigend sortiert, aber wie bekomme ich das absteigend hin ?

ascent / descent ?

Gruß Christian

Hallo Christian!

Wie schaffe ich es, ein laufendes Makro zu unterbrechen und am
Folgetag bei der letzten ID wieder anzusetzen ?

Soll das Makro zum Beispiel immer nach 10.000 Datensätzen unterbrechen? Oder quasi erst auf Knopfdruck?

Dann sind die Datensätze zwar aufsteigend sortiert, aber wie
bekomme ich das absteigend hin ?

ascent / descent ?

Die Schlüsselwörter sind „ASC“ und „DESC“. Also zum Beispiel

...ORDER BY ID DESC...

mfg
christoph

Hallo Christoph!

Soll das Makro zum Beispiel immer nach 10.000 Datensätzen
unterbrechen? Oder quasi erst auf Knopfdruck?

wenn geht bitte auf Knopfdruck.

Das eigentliche Problem ist, dass wenn ein Fehler auftaucht, ich das Makro unterbrechen muss, um den Datensatz zu bereinigen. Danach fange ich wieder von vorn beim Datensatz 1 an und das dauert jedesmal.

Ich kann einen Datensatz, der geöffnet ist, weil der Debugger auf diesem stehen geblieben ist eben nicht ändern !

Ich muss dann das makro erst abbrechen um in der Tabelle einzugreifen.

Gruß Christian

1 Like

Hallo Christian,

warum zeigst du nicht das ganze Makro und sagst in welcher zeile immer der Fehler, und welcher, kommt?

Soll das Makro zum Beispiel immer nach 10.000 Datensätzen
unterbrechen? Oder quasi erst auf Knopfdruck?

wenn geht bitte auf Knopfdruck.

Ich habs jetzt nicht getestet, bezweifle aber daß ein laufendes makro auf einen Knopfdruck der ein anderes makro starten soll, reagiert, einfach so.

Wie wäre esmit einem workaround? Alle k.A. 5.000 Datensätze erscheint für X Sekunden ein Fensterchen, wo du auf Abbrechen klicken kannst.
Kommt kein Klick läuft das Makro weiter.

D.h., das Makro läuft an sich komplett durch, alle 5.000 datensätze hast du die Chance es abzubrechen.

Im Abbruchfall kann man die aktuelle datensatznummer in der Datei speichern, in einer zelle oder in der Datei selbst.
Am nächsten Tag bei Makrostart wird dann genau dort weitergemacht.
Um in der Datei selbst etwas zu speichern gäbs CustomDocumentProperties, soferns das in Access gibt.

Das eigentliche Problem ist, dass wenn ein Fehler auftaucht,
ich das Makro unterbrechen muss, um den Datensatz zu
bereinigen. Danach fange ich wieder von vorn beim Datensatz 1
an und das dauert jedesmal.

Zu einem guten Makro gehört auch eine Fehlerbehandlungsroutine.
(On Error Goto …)
Dort könnte man sich wie oben angedeutet die aktuelle Datensatznummer merken.

Ich kann einen Datensatz, der geöffnet ist, weil der Debugger
auf diesem stehen geblieben ist eben nicht ändern !

Ich kenne mich in Access nicht aus, wenn also ein Makrofehler auftritt und der Debugger im Code eine Zeile gelb markiert, so kannst du dann in der Accesstabelle nix ändern?

Gruß
Reinhard

Hallo Reinhard,

Ich habs jetzt nicht getestet, bezweifle aber daß ein
laufendes makro auf einen Knopfdruck der ein anderes makro
starten soll, reagiert, einfach so.

…ich hatte gehofft, es gäbe eine Tastenkombination o.Ä…

Wie wäre esmit einem workaround? Alle k.A. 5.000 Datensätze
erscheint für X Sekunden ein Fensterchen, wo du auf Abbrechen
klicken kannst.
Kommt kein Klick läuft das Makro weiter.

D.h., das Makro läuft an sich komplett durch, alle 5.000
datensätze hast du die Chance es abzubrechen.

Hört sich interressant an - und wie sieht das dann Konkret aus ?
Das würde ja aber bedeuten, das auch hier ein laufendes Makro unterbrochen wird - oder legt das Makro alle 5ooo Datensätze eine Pause ein ?

Im Abbruchfall kann man die aktuelle datensatznummer in der
Datei speichern, in einer zelle oder in der Datei selbst.
Am nächsten Tag bei Makrostart wird dann genau dort
weitergemacht.

…das heißt, das Du am nächsten Tag genau an der Stelle ansetzt ?
Wie kannst Du das Makro denn ab einer bestimmten Stelle erst ansetzen ?

Zu einem guten Makro gehört auch eine
Fehlerbehandlungsroutine.
(On Error Goto …)
Dort könnte man sich wie oben angedeutet die aktuelle
Datensatznummer merken.

OK, das sehe ich natürlich ein !

Ich kenne mich in Access nicht aus, wenn also ein Makrofehler
auftritt und der Debugger im Code eine Zeile gelb markiert, so
kannst du dann in der Accesstabelle nix ändern?

Geeeeenau ! - so ist das in Access !

Gruß Christian

1 Like

Hallo Christian,

Ich habs jetzt nicht getestet, bezweifle aber daß ein
laufendes makro auf einen Knopfdruck der ein anderes makro
starten soll, reagiert, einfach so.

…ich hatte gehofft, es gäbe eine Tastenkombination o.Ä…

mags geben, aber dann?

D.h., das Makro läuft an sich komplett durch, alle 5.000
datensätze hast du die Chance es abzubrechen.

Hört sich interressant an - und wie sieht das dann Konkret
aus ?
Das würde ja aber bedeuten, das auch hier ein laufendes Makro
unterbrochen wird - oder legt das Makro alle 5ooo Datensätze
eine Pause ein ?

Das Letzere, alle 5.000 datensätze wirst du für 3 sec gefragt ob du beenden willst.
Und keine übliche MsgBox, wo du irgendwas anklicken mußt damit es weitergeht, sie steht da für 3 sec, danach ist sie wieder wech.

Im Abbruchfall kann man die aktuelle datensatznummer in der
Datei speichern, in einer zelle oder in der Datei selbst.
Am nächsten Tag bei Makrostart wird dann genau dort
weitergemacht.

…das heißt, das Du am nächsten Tag genau an der Stelle
ansetzt ?
Wie kannst Du das Makro denn ab einer bestimmten Stelle erst
ansetzen ?

? Wenn der letzte Datensatz vom Vortag der Satz 25234 war, macht halt das makro an der Stelle weiter und fängt nicht wieder bei datensatz 1 an.

Ich kenne mich in Access nicht aus, wenn also ein Makrofehler
auftritt und der Debugger im Code eine Zeile gelb markiert, so
kannst du dann in der Accesstabelle nix ändern?

Geeeeenau ! - so ist das in Access !

Okay, wenn das so ist, muß man halt das makro bei einem Fehler sauber beenden.
Es soll dann noch in den letzten Zuckungen :smile: sagen, welche Datensatznummer das ist und sich danach beenden.

Dann korrigierst du das in Access und startest das Makro neu und laut meinem Plan macht es dann genau an der Stelle weiter.

Gruß
Reinhard

alles krar Reinhard,

und wie muss das dann explizit aussehen ?

ich meine Starte makro ab Datensatz 43255 ?

und wie sieht die 3-Sekunden-Schleife aus ?

Christian

1 Like

Hallo Christian,

alles krar Reinhard,

„krar“? aha, alles klar, Freudsche Fehlleistung, hängt sicher mit dieser Mistkrake Paul zusammen die zu Spanien hielt *grins*

ich meine Starte makro ab Datensatz 43255 ?

Meine Accesskenntnisse sind quasi nicht vorhanden, ist jetzt keine Untertreibung, ich benutze es nie.
Was sicher grundsätzlich gut ist damit wir über die exakt gleiche Sache reden, kannst du deine mdb gewaltig verkürzen, ggfs. einige Einträge anonymisieren wegen datenschutz.

Dann hochladen mit rapidshare ( FAQ:2606 ) oder bessere Hochlader.
dann sehe ich den Code den du da hast und kann da ggfs. direkt dort etwas testen.

Dannn kann ich auch viel besser als jetzt ins Blaue hinein schauen wie man deinen Code ab einem bestimmten datensatz weiterlaufen läßt.

und wie sieht die 3-Sekunden-Schleife aus ?

? Ich meinte doch eine 3-Sek MsgBox *glaub*
Da das API ist hoffte ich Rainer würde das grad mal so aus dem Ärmel schütteln *lächel*
Ich habe inzwischen darüber neu nachgedacht, hab da einige Ansätze.
Wie wärs du brichst wann du willst das makro mit der ESC-taste ab?

Schau mal hier:
http://www.schmittis-page.de/index.html?/excel/vba/t…

Wie auch immer, eine aussagekräftige Beispielmappe an der man üben kann ist sicher hilfreich für alle Interessierten.

Gruß
Reinhard

Hallo Christian!

wenn geht bitte auf Knopfdruck.

Das eigentliche Problem ist, dass wenn ein Fehler auftaucht,
ich das Makro unterbrechen muss, um den Datensatz zu
bereinigen. Danach fange ich wieder von vorn beim Datensatz 1
an und das dauert jedesmal.

Da würde ich es nicht per Knopfdruck, sondern mit einer programmierten Fehlerbehandlung machen.
Ich stelle mir das so vor: Dein Makro läuft also die Daten der Reihe nach durch und verarbeitet sie. Wenn er nun auf einen Datensatz stößt, der nicht verarbeitbar ist (und sonst einen Abbruch verursachen würde), wird derjenige Datensatz aussortiert. Am Ende des Laufes werden dir dann einfach alle Datenzeilen angezeigt, die ein Problem verursachen würden. Die kannst du nun manuell berichtigen und dann nur mehr eben diese Restlichen fertig verarbeiten.
Andere Möglichkeit wäre auch, bei den problematischen Fällen das Skript zu pausieren und dir die Möglichkeit geben, die Daten direkt zu korrigieren.

Soweit einmal meine Ideen dazu.
mfg
christoph

Hallo Reinhard,

alles krar Reinhard,

„krar“? aha, alles klar, Freudsche Fehlleistung, hängt sicher
mit dieser Mistkrake Paul zusammen die zu Spanien hielt
*grins*

tut mir leid - Freudscher verschreiber !

ich meine Starte makro ab Datensatz 43255 ?

Dannn kann ich auch viel besser als jetzt ins Blaue hinein
schauen wie man deinen Code ab einem bestimmten datensatz
weiterlaufen läßt.

hochladen geht leider nicht aber hier ist die Schleife:

Public Sub DWHDatenüberarbeitung()

Dim db As Database
Set db = DBEngine.Workspaces(0).Databases(0)

Dim recLesen, recSchreiben, recDepotnummer As Recordset
Dim intpos As Integer
Dim Depotnummer As Double

'altDepotnummer = 0

Set recLesen = db.OpenRecordset(„SELECT * FROM KUSYMA ORDER BY ANREDE1 ASC“)
'Set recSchreiben = db.OpenRecordset(„Select * from Import_DWH_Daten“)

Do Until recLesen.EOF

'recSchreiben.AddNew

If Not IsNull(recLesen![Anrede1]) Then

intpos = InStr(7, recLesen![Anrede1], " ") 'letztes Leerzeichen Anrede
intpos1 = InStr(1, recLesen![Anrede1], " ") 'erstes Leerzeichen Anrede
intpos2 = InStr(1, recLesen![Nachname1], " ") 'erstes Leerzeichen Nachname
intpos3 = InStr(intpos2 + 1, recLesen![Nachname1], " ") 'zweites Leerzeichen Nachname

If intpos > 0 Then

recLesen![Anrede2] = LTrim(Mid(recLesen![Anrede1], intpos, 5))
recLesen![Anrede1] = RTrim(Mid(recLesen![Anrede1], 1, intpos1))
recLesen![Vorname2] = LTrim(Mid(recLesen![Nachname1], intpos2, (intpos3 - intpos2)))
recLesen![Nachname2] = LTrim(Mid(recLesen![Nachname1], intpos3, 25))

End If
If intpos3 > 0 And (recLesen![Anrede1] = „Frau“) Then
recLesen![Nachname1] = Trim(Mid(recLesen![Nachname1], 1, (intpos3 - intpos2)))
End If

If (recLesen![Anrede1] = „Frau und Herrn“) Then
'recLesen![Anrede2] = „Herrn“ And recLesen![Anrede1] = „Frau“
recLesen![Anrede1] = Replace(recLesen![Anrede1], „Frau und Herrn“, „Frau“)
End If
If (recLesen![Anrede1] = „Herrn und Frau“) Then
recLesen![Anrede1] = Replace(recLesen![Anrede1], „Herrn und Frau“, „Herrn“)
End If
Debug.Print recLesen![ID]
Debug.Print recLesen![Anrede2]
Debug.Print recLesen![Vorname2]
Debug.Print recLesen![Nachname2]
recLesen.Update
End If
recLesen.MoveNext
Loop
End Sub

? Ich meinte doch eine 3-Sek MsgBox *glaub*
Da das API ist hoffte ich Rainer würde das grad mal so aus dem
Ärmel schütteln *lächel*
Ich habe inzwischen darüber neu nachgedacht, hab da einige
Ansätze.

…na dann erzähl mal.

Wie wärs du brichst wann du willst das makro mit der ESC-taste
ab?

ohne, dass ich beim nächstenmal wieder von vorn anfangen muss ?

Gruß
Christian