Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

3 Allgemeine Fragen zu makros

Forumthread: 3 Allgemeine Fragen zu makros

3 Allgemeine Fragen zu makros
25.07.2024 07:51:13
Christian
Hallo,

Ich bitte euch darum, 3 Fragen zu meinem makro zu beantworten, allgemeine Fragen, die man auch zu jedem anderen makro stellen könnte.

Also, ich habe ein makro, welches 10x dasselbe makro aufruft, jedesmal mit einem anderen tabellenblatt als Parameter. Zur Zeit wird es mit den ersten 4 blättern ausgeführt, die anderen 6 sind auskommentiert.

Nun zu meinen fragen:
1. Kann ich das makro pausieren und später an der selben Stelle fortsetzen und wenn ja wie

2. Kann ich die Pause nutzen um das auskommentieren der 6 Blätter aufzuheben? Und trotzdem an derselben Stelle fortsetzen

3. Kann ich in der Pause an anderen blättern der Tabelle weiterarbeiten, welche nicht vom makro betroffen sind? Und weiterhin dann an der selben Stelle fortsetzen

Danke für eure Mühe
Christian
Anzeige

47
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 08:30:26
daniel
Hi
kannst d machen.
du kannst temporär einen Haltepunkt setzen (klick am Linken Rand des Codefensters auf der Höhe, an der der Halt erfolgen soll, oder über das Icon in der Menüleiste Debuggen) oder an der betroffenen Stelle den Befehl STOP einfügen.
Das Makro hält an dieser Stelle an, du kannst normal in Excel arbeiten und mit F5 bzw dem Icon "Makro ausführen" die Ausführung fortsetzen.
Du kannst auch andere Blätter bearbeiten. Allerdings sollte dein Marko dann auf jegliches .Select, .Activate und Selection. verzichten und konsequent mit vollständiger Referenzierung arbeiten.
Ansonsten müsstest du wieder auf das Blatt, dass beim Stop aktiv war, zurück wechseln und auch den Zellbereich selektieren, damit das Makro ordnungsgemäß weiter läuft.

Gruß Daniel
Anzeige
AW: Debug.Assert
25.07.2024 09:54:28
Fennek
Hallo,

mit dem genannte Befehl kann eine "If"-Bedingung definiert werden, wann der Code unterbrochen werden soll.


mfg
AW: 3 Allgemeine Fragen zu makros
25.07.2024 13:11:20
Onur
1) Wenn du willst, dass ein Makro auf die Pausetaste im Editor reagiert, musst du innerhalb der Schleife ein "DoEvents" einbauen.
2) Wie bereits gesagt, sollte kein solches Makro mehrere Stunden brauchen, es sei denn, man kann nicht gut programmieren.
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 13:55:36
Christian
Hallo Onur,

wie gesagt, es dauert so lange, weil das runterladen von Daten aus 25000 Internet seiten nunmal dauert und ich 25000 x 5 Sekunden Pause eingebaut habe, was knapp 35 Stunden Pause bedeutet. Als ich von der Dauer des Makros sprach, meinte ich einzig und alleine die Dauer der von mir eingebauten Pausen. Alles andere war da noch gar nicht mit eingerechnet.

Aber ich gebe dir recht, ich kann nicht gut programmieren.

Auf der anderen Seite, mir ist vorhin eine Lösungsmöglichkeit eingefallen, die ich gleich in einem eigenen Post beschreiben werde.

Gruß
Christian
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 13:59:34
Onur
Ich habe eigentlich immer noch nicht verstanden, wozu du die Pause genau eingesetzt hast.
AW: 3 Allgemeine Fragen zu makros
25.07.2024 15:00:35
Christian
kurz und knapp, ich weiß ja, es müssten 374 URL pro geöffneter Seite sein. Wenn ich die Pause nicht mache, werden komplette URL ausgelassen, sprich, er macht zwar den Schleifendurchlauf, aber es werden keine URL in die Tabelle eingetragen.
Hab dann einfach irgendwann rausgefunden, dass sich dieses Problem mit 5 Sek Pause umgehen lässt.
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 13:23:05
daniel
Hi
schau dir das mal an.

das Makro ist so aufgebaut, dass es nur genau eine Berechnung durchführt, nämlich mit dem Tabellenblatt und mit dem Schleifenzählerwert, der auf dem Blatt "Steuerung" hinterlegt ist.

damit das ganze auch als Schleife durchlaufen kann, muss es nach Abarbeitung im Steuerungsblatt den Schleifenzähler erhöhen und beim Erreichen des Schleifenendes das nächste Blatt auswählen.
die Schleife entsteht dann dadurch, dass sich das Makro selbst aufruft, aber mit der von dir gewünschten Zeitverzögerung von 5 Sekunden.
in dieser Zeit ist alle Makrotätigkeit beendet, dh. du kannst ganz normal in deiner oder in anderen Dateien arbeiten.
Das anhalten funktioniert dann durch Eintragen von "Stopp" in eine bestimmte Zelle.

schau dir mal das Beispiel an.
der Bearbeitungsschritt ist einfach das Eintragen von "xxx" in die Spalte A des jeweiligen Tabellenblatts.

Wenn du das Makro stoppst und dann wieder fortsetzt, dann wird dort weitergearbeitet, wo es aufgehört hat.
die jeweiligen Daten dazu sind ja im Blatt hinterlegt und werden beim nächsten Start verwendet.
https://www.herber.de/bbs/user/171244.xlsm
Gruß Daniel
Anzeige
eigener Ansatz
25.07.2024 14:14:39
Christian
ausgehend vom Folgenden:

1. ein Makro, welches ein weiteres Makro 10x nacheinander startet, jeweils mit einem anderen Tabellenblatt als Parameter, in dem es ausgeführt werden soll.
1.b. 10 Blätter, weil 9,35 Mio Zeilen nicht auf ein Blatt passen.

2. In jedem Blatt stehen in Spalte A 2500 URL's, insgesamt 25000.

3. In dem Makro gibt es eine Schleife, die nacheinander jede URL öffnet und in Spalte B die Hyperlinks, die es auf der Seite findet und in Spalte C den dazugehörigen OuterText Schreibt. Dies sind jeweils 374 URL's pro Hyperlink, macht 935.000 Zeilen pro Blatt, 9,35 Mio insgesamt.

Wenn ich die 5 Sekunden Pause nicht einbaue, fehlen Daten.

Das ist das was bereits existiert und funktioniert.

Ich habe jetzt das Glück, dass der letzte outerText auf jeder der Seiten identisch ist und nur einmal pro Seite vorkommt.
Das heißt, wenn ich zähle, wie oft dieser OuterText in Spalte C steht, weiß ich, wie oft die Schleife bereits durchgelaufen ist. Das geht sogar ohne VBA mit ner ZÄHLENWENN Formel.

Jetzt folgendes Szenario. Ich drücke auf Escape und Beende das Makro.

Dann sehe ich an den Zählern, welche Tabellenblätter komplett abgearbeitet sind und kann diese im Makro auskommentieren.
Und wenn jetzt bei dem nächsten erst 800 der 2500 Links abgearbeitet sind, kann ich die ersten 800 Links aus der Spalte A entfernen.

Und kann dann das Makro wieder von vorne starten, weil alle bereits abgearbeiteten URLS entweder in auskommentierten Blättern stehen oder gelöscht wurden.

Etwas umständlicher zwar als Start und Pause zu drücken aber für mich als Lösung akzeptabel.

Gruß
Christian


Anzeige
AW: eigener Ansatz
25.07.2024 14:18:43
Yal
Jein:
"Und wenn jetzt bei dem nächsten erst 800 der 2500 Links abgearbeitet sind, kann ich die ersten 800 Links aus der Spalte A entfernen."
Fragt lieber die Spalte C, ob den bekannten "outerText" vorhanden ist. Dann brauchst Du gar nicht die Spalte A zu leeren (brauchst eigentlich gar nichts tun :-)

VG
Yal
Anzeige
AW: eigener Ansatz
25.07.2024 14:26:16
Christian
Der OuterText in Spalte C steht ja im optimalen Fall 2500 mal da, einmal pro Schleifendurchlauf.

Wenn ich jetzt nur prüfe, ob vorhanden, sagt mir das ja nichts aus, wie oft die Schleife durchlaufen wurde oder?
AW: eigener Ansatz
25.07.2024 14:33:58
Yal
Du kannst mit VBA machen, was Dir lustig ist. Wenn Du schon die Zelle in Spalte C prüft, kannst Du zählen, wie oft der outerText vorkommt.
Anzeige
AW: eigener Ansatz
25.07.2024 14:19:14
Onur
Wozu immer wieder löschen und das Makro komplett neu starten, wenn du doch einfach in einer separaten Spalte ein "X" setzen könntest, wenn die Zeile abgearbeitet ist und das Makro nur Zeilen bearbeitet, die KEIN "X" in dieser Spalte haben ?
AW: eigener Ansatz
25.07.2024 14:27:57
Christian
Hallo Onur, ganz einfache Antwort, weil ich auf diese Idee nicht gekommen bin.

Ich schaue mal, ob ich das umgesetzt bekomme, wenn nicht melde ich mich wieder
Anzeige
AW: eigener Ansatz
25.07.2024 14:29:37
Onur
Dann kannst du sogar das Makro STOPPEN (statt pausieren) und bei Neustart wird alles, was schon bearbeitet wurde, einfach übersprungen.
AW: eigener Ansatz
25.07.2024 14:31:39
Onur
UND du kannst Zeile mit "X" einfach wegfiltern.
AW: eigener Ansatz
25.07.2024 15:03:45
Christian
Habe das Makro jetzt mal beendet, zwischen gestern Abend 23:30 und jetzt 15:03 wurden insgesamt 9411 der 25000 Links abgearbeitet.

Werde mich dann mal daran machen, die Idee mit den X umzusetzen. Melde mich dann wieder.
Anzeige
AW: eigener Ansatz
25.07.2024 15:27:03
Christian
Also habe jetzt folgendes gemacht:

Das ursprüngliche Makro


Public Sub Makro2(sh As String)
Dim objIE As Object
Dim objLinks As Object
Dim objLink As Object
Dim lngCount As Long
Dim lloRow As Long
Dim lshTab2 As Worksheet

Set lshTab2 = Sheets(sh)
Set objIE = CreateObject("InternetExplorer.Application")

With objIE
.Visible = False

For lloRow = 1 To lshTab2.Cells(lshTab2.Rows.Count, 1).End(xlUp).Row
.Navigate lshTab2.Range("A" & lloRow).Text

Do While .Busy Or .readyState > 4
DoEvents
Loop

' Check if the page loaded successfully
If .LocationURL > "about:blank" Then
Set objLinks = .document.Links

For Each objLink In objLinks
lngCount = lngCount + 1
lshTab2.Cells(lngCount, 2) = objLink.href
lshTab2.Cells(lngCount, 3) = "'" & objLink.outerText
Next objLink
End If

Application.Wait (Now + TimeValue("0:00:05"))
Next lloRow

.Quit
End With

Set objIE = Nothing
Set lshTab2 = Nothing
End Sub


erstmal habe ich gesagt, dass die Sachen in Spalte C und D eingetragen werden sollen, damit Spalte B für die X frei wird.

Public Sub Makro2(sh As String)

Dim objIE As Object
Dim objLinks As Object
Dim objLink As Object
Dim lngCount As Long
Dim lloRow As Long
Dim lshTab2 As Worksheet

Set lshTab2 = Sheets(sh)
Set objIE = CreateObject("InternetExplorer.Application")

With objIE
.Visible = False

For lloRow = 1 To lshTab2.Cells(lshTab2.Rows.Count, 1).End(xlUp).Row
.Navigate lshTab2.Range("A" & lloRow).Text

Do While .Busy Or .readyState > 4
DoEvents
Loop

' Check if the page loaded successfully
If .LocationURL > "about:blank" Then
Set objLinks = .document.Links

For Each objLink In objLinks
lngCount = lngCount + 1
lshTab2.Cells(lngCount, 3) = objLink.href
lshTab2.Cells(lngCount, 4) = "'" & objLink.outerText
Next objLink
End If

Application.Wait (Now + TimeValue("0:00:05"))
Next lloRow

.Quit
End With

Set objIE = Nothing
Set lshTab2 = Nothing
End Sub


dann habe ich gesagt, dass in jede abgearbeitete Zeile ein X geschrieben werden soll

Public Sub Makro2(sh As String)

Dim objIE As Object
Dim objLinks As Object
Dim objLink As Object
Dim lngCount As Long
Dim lloRow As Long
Dim lshTab2 As Worksheet

Set lshTab2 = Sheets(sh)
Set objIE = CreateObject("InternetExplorer.Application")

With objIE
.Visible = False

For lloRow = 1 To lshTab2.Cells(lshTab2.Rows.Count, 1).End(xlUp).Row
.Navigate lshTab2.Range("A" & lloRow).Text

Do While .Busy Or .readyState > 4
DoEvents
Loop

' Check if the page loaded successfully
If .LocationURL > "about:blank" Then
Set objLinks = .document.Links

For Each objLink In objLinks
lngCount = lngCount + 1
lshTab2.Cells(lngCount, 3) = objLink.href
lshTab2.Cells(lngCount, 4) = "'" & objLink.outerText
Next objLink
End If

lshTab2.Cells(lloRow, 2) = "X"

Application.Wait (Now + TimeValue("0:00:05"))
Next lloRow

.Quit
End With

Set objIE = Nothing
Set lshTab2 = Nothing
End Sub


und im 3. Schritt nur Links abarbeiten, neben denen kein X steht

Public Sub Makro2(sh As String)

Dim objIE As Object
Dim objLinks As Object
Dim objLink As Object
Dim lngCount As Long
Dim lloRow As Long
Dim lshTab2 As Worksheet

Set lshTab2 = Sheets(sh)
Set objIE = CreateObject("InternetExplorer.Application")

With objIE
.Visible = False

For lloRow = 1 To lshTab2.Cells(lshTab2.Rows.Count, 1).End(xlUp).Row
' Prüfen, ob in Spalte B bereits ein "X" steht
If lshTab2.Cells(lloRow, 2).Text > "X" Then
.Navigate lshTab2.Range("A" & lloRow).Text

Do While .Busy Or .readyState > 4
DoEvents
Loop

' Check if the page loaded successfully
If .LocationURL > "about:blank" Then
Set objLinks = .document.Links

For Each objLink In objLinks
lngCount = lngCount + 1
lshTab2.Cells(lngCount, 3) = objLink.href
lshTab2.Cells(lngCount, 4) = "'" & objLink.outerText
Next objLink
End If

lshTab2.Cells(lloRow, 2) = "X"

Application.Wait (Now + TimeValue("0:00:05"))
End If
Next lloRow

.Quit
End With

Set objIE = Nothing
Set lshTab2 = Nothing
End Sub


dann noch die Prüfung, ob alle Einträge in einer Tabelle bereits ein X haben

Public Sub Makro2(sh As String)

Dim objIE As Object
Dim objLinks As Object
Dim objLink As Object
Dim lngCount As Long
Dim lloRow As Long
Dim lshTab2 As Worksheet
Dim allX As Boolean

Set lshTab2 = Sheets(sh)
Set objIE = CreateObject("InternetExplorer.Application")

With objIE
.Visible = False

' Überprüfen, ob alle Zellen in Spalte B ein "X" enthalten
allX = True
For lloRow = 1 To lshTab2.Cells(lshTab2.Rows.Count, 1).End(xlUp).Row
If lshTab2.Cells(lloRow, 2).Text > "X" Then
allX = False
Exit For
End If
Next lloRow

' Wenn nicht alle Zellen in Spalte B ein "X" enthalten, das Makro ausführen
If Not allX Then
For lloRow = 1 To lshTab2.Cells(lshTab2.Rows.Count, 1).End(xlUp).Row
' Prüfen, ob in Spalte B bereits ein "X" steht
If lshTab2.Cells(lloRow, 2).Text > "X" Then
.Navigate lshTab2.Range("A" & lloRow).Text

Do While .Busy Or .readyState > 4
DoEvents
Loop

' Check if the page loaded successfully
If .LocationURL > "about:blank" Then
Set objLinks = .document.Links

For Each objLink In objLinks
lngCount = lngCount + 1
lshTab2.Cells(lngCount, 3) = objLink.href ' Link in Spalte C
lshTab2.Cells(lngCount, 4) = "'" & objLink.outerText ' Linktext in Spalte D
Next objLink
End If

' Schreib "X" in Spalte B neben den abgearbeiteten Link
lshTab2.Cells(lloRow, 2) = "X"

Application.Wait (Now + TimeValue("0:00:05"))
End If
Next lloRow
End If

.Quit
End With

Set objIE = Nothing
Set lshTab2 = Nothing
End Sub


das Hauptmakro


Public Sub Start()

Call Makro2("Tabelle1")
Call Makro2("Tabelle2")
Call Makro2("Tabelle3")
Call Makro2("Tabelle4")
Call Makro2("Tabelle5")
Call Makro2("Tabelle6")
Call Makro2("Tabelle7")
Call Makro2("Tabelle8")
Call Makro2("Tabelle9")
Call Makro2("Tabelle10")
End Sub


habe ich unverändert gelassen.

Was meint ihr dazu? bislang noch ungetestet

Anzeige
AW: eigener Ansatz
25.07.2024 15:45:03
Christian
hab noch die Zeile

lngCount = lshTab2.Cells(lshTab2.Rows.Count, 3).End(xlUp).Row + 1

eingefügt, damit bei noch nicht vollständig abgearbeiten Blättern keine früheren Einträge in Spalten C und D überschrieben werden.
AW: eigener Ansatz
25.07.2024 15:50:35
Christian
also aus meiner Sicht scheint das zu funktionieren, die Blätter bei denen überall ein X steht werden übergangen,
die X in abgearbeiteten Zeilen werden geschrieben, es werden keine vorhandenen Einträge überschrieben
Das weitermachen an der gewünschten Stelle funktioniert auch.

Dank an alle für eure Beiträge und Unterstützung für meine Lösung. Wünsche euch noch einen schönen Abend
Christian
Anzeige
Wäre Power Query eine Alternativ?
25.07.2024 14:15:31
Yal
Mit Power Query kannst Du mehrere Webseiten abfragen und ein Teil davon in einer Tabelle zusammengefasst zurückgeben.

Siehe https://excelhero.de/power-query/power-query-ganz-einfach-erklaert/

Alternativ, braucht aber mehr Programmierkompetenz: Selenium-Framework für VBA. Siehe https://www.wiseowl.co.uk/vba-macros/videos/vba-scrape-websites/selenium-get-started/
(habe damit 2,5 Mio Einzeldaten von einem Datendienst gelesen und strukturiert abgelegt. Dauerte ca. 14 Std)

VG
Yal
Anzeige
AW: Wäre Power Query eine Alternativ?
25.07.2024 14:22:44
Christian
Ich hatte es zumindest mal probiert, eine der URL da in der Datenabfrage - aus Web einzugeben, ein paar Sachen aus der Seite wurden auch angezeigt, aber nicht das was ich gesucht hatte. Auf der anderen Seite, das Makro läuft seit gestern Abend 23:30, wenn ich es 35 Stunden durchlaufen lasse, ist das Thema sowieso erledigt. In Zukunft werde ich es dann nur noch für kleinere Mengen von ich schätze mal 60 URL brauchen. Irgendwie habe ich das Gefühl, der Aufwand da jetzt mit PQ anzufangen, lohnt sich nicht.

Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 13:59:13
Christian
Hallo Daniel,

würde ich mir ja gerne anschauen, aber du kannst dir mein Dilemma sicher schon denken, dazu müsste ich das laufende Makro stoppen und weiß zu diesem Zeitpunkt noch nicht wie ich es wieder starten kann.

Ich werde jetzt erstmal einen anderen Ansatz verfolgen, der mir vorhin selbst eingefallen ist und ich gleich in einem gesonderten Post beschreiben werde. Wenn das machbar ist, werde ich mal schaun, ob sich meine Idee durch deine ersetzen lässt.

DAnke auf jeden Fall dass du dich doch entschieden hast, weiter zu helfen.

Gruß
Christian
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 15:53:27
Christian
Hallo Daniel,

nun nochmal zu dir, wie gesagt, erstmal danke, dass du dich trotzdem entschieden hast, mir weiter zu helfen.
Ich werde mir jetzt deinen Vorschlag in Ruhe anschauen, in wiefern mich das weiterbringt und dann mal schauen, welche Lösung ich im Endeffekt nehme. Melde mich dann nachher wieder.

Gruß
Christian
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 16:07:36
Christian
Hallo Daniel,

also ich glaube das Prinzip habe ich verstanden.
Ich bin allerdings am überlegen, wie ich den Schleifenzähler anpasse.

Ich habe ja in meinem Makro bereits die Zeile

lngCount = lngCount + 1

stehen, was da lngCount ja bei 1 beginnt in meinem Makro gleich der Anzahl der Durchläufe wäre.

Kann ich dann in deinem Makro einfach die Variable i durch die Variable lngCount ersetzen?

Gruß
Christian




Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 16:12:57
daniel
du kannst alles machen, was du willst.
ich stelle dir mein Makro zur verfügung, du darfst es uneingeschränkt verwenden und damit auch abändern, oder auch einfach nur Teile davon in dein Makro übernehmen oder wie auch immer.
und ob du jetzt i oder lngZeile ins Tabellenblatt schreibst, ist ja auch egal, du musst dir halt irgendwo merken, wo du gerade in der Bearbeitung stehst, damit du damit beim nächsten mal weitermachen kannst.
Wie du das machst und wie du deine Variablen benennst, ist deine Sache.
Gruß Daniel
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 16:17:25
Christian
So war die Frage nicht gemeint,

ich wollte dich nicht um Erlaubnis bitten, sondern fragen ob es, wenn du dir dein und mein Makro anschaust, zu probleme mit dieser Variable kommen kann, wenn ich das mache.

Public Sub Makro2(sh As String)

Dim objIE As Object
Dim objLinks As Object
Dim objLink As Object
Dim lngCount As Long
Dim lloRow As Long
Dim lshTab2 As Worksheet

Set lshTab2 = Sheets(sh)
Set objIE = CreateObject("InternetExplorer.Application")

With objIE
.Visible = False

For lloRow = 1 To lshTab2.Cells(lshTab2.Rows.Count, 1).End(xlUp).Row
.Navigate lshTab2.Range("A" & lloRow).Text

Do While .Busy Or .readyState > 4
DoEvents
Loop

' Check if the page loaded successfully
If .LocationURL > "about:blank" Then
Set objLinks = .document.Links

For Each objLink In objLinks
lngCount = lngCount + 1
lshTab2.Cells(lngCount, 2) = objLink.href
lshTab2.Cells(lngCount, 3) = "'" & objLink.outerText
Next objLink
End If

Application.Wait (Now + TimeValue("0:00:05"))
Next lloRow

.Quit
End With

Set objIE = Nothing
Set lshTab2 = Nothing
End Sub


Wobei das jetzt das ursprüngliche Makro ist, nicht das an die andere Lösungsidee angepasste.
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 18:17:46
daniel
kann ich dir nicht sagen.
musst du testen.
AW: 3 Allgemeine Fragen zu makros
25.07.2024 18:51:57
Christian
du hast mich jetzt auf eine andere Idee gebracht. Ich habe mein erstelltes Makro getestet, wie es sich verhält, wenn ich es abbreche und du hattest recht, es fehlen Daten.

Ich habe jetzt auch mal dahin gehend eine Lösung für mein vorhin erstelltes Makro gesucht und bin dabei auf GetAsyncKeyState gestoßen, was wohl nach jedem Schleifendurchlauf prüfen kann, ob währenddessen der Key mit dem Code schlag mich tot bei Escape 27 gedrückt wurde.

Habe jetzt lange gebraucht das einzubauen, da kam und kam ein Fehler, den ich nicht wegbekam und ich keine Ahnung hatte, wo er hekommt (Im Endeffekt lag es daran, dass wenn man einen Parameter an ein Makro übergibt, die Variable auch den selben Typ haben muss, der auch vom Makro erwartet wird.

Habe in dem Zug dann noch ErrorHandler eingebaut um zu schauen was los ist und die ganzen Tabellenblätter in ein Array gepackt, das Ganze sieht dann jetzt so aus und funktioniert:

' Globale Variable zur Steuerung des Abbruchs

Public abortRequested As Boolean

' API-Deklaration für die Überprüfung der Escape-Taste
Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Public Sub CheckForAbort()
Dim key As Integer
key = 27 ' Escape-Taste hat den Code 27
If GetAsyncKeyState(key) > 0 Then
abortRequested = True
End If
End Sub

Public Sub Start()
On Error GoTo ErrorHandler
Dim wsNames As Variant
wsNames = Array("Tabelle1", "Tabelle2", "Tabelle3", "Tabelle4", "Tabelle5", "Tabelle6", "Tabelle7", "Tabelle8", "Tabelle9", "Tabelle10")

Dim i As Integer
For i = LBound(wsNames) To UBound(wsNames)
Makro2 wsNames(i) ' Parameterübergabe ohne Call
Next i

Exit Sub

ErrorHandler:
MsgBox "An error occurred: " & Err.Description
Resume Next
End Sub

Public Sub Makro2(sh As Variant)
On Error GoTo ErrorHandler
Dim objIE As Object
Dim objLinks As Object
Dim objLink As Object
Dim lngCount As Long
Dim lloRow As Long
Dim lshTab2 As Worksheet
Dim allX As Boolean
Dim checkInterval As Integer
Dim iterationCount As Integer

Set lshTab2 = Sheets(sh)
Set objIE = CreateObject("InternetExplorer.Application")

' Finde die erste freie Zeile in Spalte C
lngCount = lshTab2.Cells(lshTab2.Rows.Count, 3).End(xlUp).Row + 1

With objIE
.Visible = False

' Überprüfen, ob alle Zellen in Spalte B ein "X" enthalten
allX = True
For lloRow = 1 To lshTab2.Cells(lshTab2.Rows.Count, 1).End(xlUp).Row
If lshTab2.Cells(lloRow, 2).Text > "X" Then
allX = False
Exit For
End If
Next lloRow

' Wenn nicht alle Zellen in Spalte B ein "X" enthalten, das Makro ausführen
If Not allX Then
checkInterval = 1 ' Überprüfen alle 10 Iterationen
iterationCount = 0

For lloRow = 1 To lshTab2.Cells(lshTab2.Rows.Count, 1).End(xlUp).Row
' Prüfen, ob in Spalte B bereits ein "X" steht
If lshTab2.Cells(lloRow, 2).Text > "X" Then
.Navigate lshTab2.Range("A" & lloRow).Text

Do While .Busy Or .readyState > 4
DoEvents
iterationCount = iterationCount + 1

' Überprüfung der Escape-Taste nur alle checkInterval Iterationen
If iterationCount >= checkInterval Then
CheckForAbort
If abortRequested Then
' Setze das "X" in Spalte B, auch wenn das Makro abgebrochen wird
'lshTab2.Cells(lloRow, 2).Value = "X"
Exit For
End If
iterationCount = 0
End If
Loop

' Wenn die Escape-Taste gedrückt wurde, beenden wir die Schleife
If abortRequested Then
Exit For
End If

' Check if the page loaded successfully
If .LocationURL > "about:blank" Then
Set objLinks = .document.Links

For Each objLink In objLinks
lshTab2.Cells(lngCount, 3).Value = objLink.href ' Link in Spalte C
lshTab2.Cells(lngCount, 4).Value = "'" & objLink.outerText ' Linktext in Spalte D
lngCount = lngCount + 1
Next objLink
End If

' Schreib "X" in Spalte B neben den abgearbeiteten Link
lshTab2.Cells(lloRow, 2).Value = "X"

Application.Wait (Now + TimeValue("0:00:05"))
End If
Next lloRow
End If

.Quit
End With

Set objIE = Nothing
Set lshTab2 = Nothing
abortRequested = False ' Reset the abort flag after completion

Exit Sub

ErrorHandler:
MsgBox "An error occurred: " & Err.Description
abortRequested = False
Resume Next
End Sub


Jetzt kümmere ich mich weiter um dein Makro, das sind aber im Moment noch ziemliche böhmische Dörfer, wie ich den Part des eigentlichen Makros ersetzen soll, damit das immer noch mit dem Rest des Makros funktioniert.


Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 16:00:32
daniel
nun, zumindest brauchst du hier keine weiteren Spalten in den Tabellen, die dir markieren, was schon bearbeitet wurde.
du kannst den Einstiegspunkt selbst wählen, in dem du die Felder vorab von Hand ausfüllst
das Anhalten geschieht immer gezielt nach Abschluss eines Bearbeitungsschritts und nicht irgendwo mitten drin.
außerdem kannst du die Wartezeit nutzen, um uneingeschränkt mit Excel weiter zu arbeiten, sei es in dieser Datei oder in einer anderen.
Gruß Daniel
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 16:56:08
Christian
also mit anderen Worten genau das was ich wollte...

das mit dem Anhalten nach Abschluss ist wirklich ein guter Aspekt.

Gruß
Christian
AW: 3 Allgemeine Fragen zu makros
25.07.2024 14:10:08
Yal
Hallo Christian,

wenn ich es richtig verstehe, möchtest Du das Makro nicht vollständig stoppen, sondern während dem Lauf, am Blatt arbeiten können.

Folgende Code gibt Dir innerhalb von 5 Sek die Hand:

Public Sub Blatt1_behandeln(): Blatt_behandeln "Blatt1": End Sub

Public Sub Blatt2_behandeln(): Blatt_behandeln "Blatt2": End Sub
Public Sub Blatt3_behandeln(): Blatt_behandeln "Blatt3": End Sub

Private Sub Blatt_behandeln(ByVal BlattName As Text)
Dim T As Single
Dim Z As Range

With Worksheets(BlattName)
For Each Z In .UsedRange.Columns(1) 'für jede Zelle in erste Spalte des benutzten Bereich (wenn die Spalte A leer ist, wird es nicht die Spalte A sein)
'mache hier mit der Zelle irgendwas
...
'warte für die Verarbeitung von nächste Zelle
T = Timer + 5 ' 5 Sek in die Zukünft
Do While Timer T
DoEvents
Loop
Next Z
End With
End Sub


Eine andere Alternativ (lässt sich kombinieren): deine Bearbeitung legt in jeder bearbeiteten Zeile einen Marker, und das Makro behandelt nach Neustart wieder alle Zeilen, aber springt bei vorhandenen Marker sofort auf die nächste Zeile.

VG
Yal
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 14:18:08
Christian
Hallo Yal,

fast, ich möchte nicht mal eins der Blätter, die das Makro betreffen bearbeiten, sondern ein anderes in derselben Mappe.
Aber wir reden nicht von 5 Sek. sondern solange bis ich es wieder weiterlaufen lassen will. Wir reden da eher von 3 Std. aber die Zeitspanne ist jedesmal eine andere.

Schau dir doch mal meinen inzwischen geposteten eigenen Vorschlag an.

Gruß
Christian
Anzeige
AW: Debug.Assert
25.07.2024 12:01:41
Christian
Hallo fennek,

Erstmal danke für deinen Rat. Aber auch dabei habe ich das Problem, ich muss beim Starten des makros bereits wissen, an welcher Stelle ich es unterbrechen will. Sowas habe ich ja bereits, in dem ich ein makro 10mal ausführe mit verschiedenen Parametern. Da kann ich bereits sagen durch auskommentieren, welche Teile der 10 ich genau ausgeführt haben möchte oder eben nicht. Trotzdem dauert jeder Teil immer noch 3,5 Stunden. Ich hatte nach einer Möglichkeit gesucht, quasi wie bei einem Video jederzeit stoppen zu können und irgendwann weitermachen.

Gruß Christian
Anzeige
AW: Laufzeit
25.07.2024 12:22:29
Fennek
Hallo,

aus den Erfahrungen mit einem Kunden:

Wenn es Code, auch bei mehreren 100k Zeilen, mehr als 10 Sekunden braucht, ist die Ursache schlechte Programmierung.

Als Konzept

- im ersten Schritt alle benötigten Zellen in ein Array kopieren (dim Ar: Ar = cells(1,1).currentregion
- alles Berechnungen im Array
- das Array zurück kopieren (cells(1,1).resize(ubound(Ar), ubound(Ar,2)) = Ar


mfg
Anzeige
AW: Laufzeit
25.07.2024 13:05:15
Christian
Hallo, danke für den Tipp, aber in dem Fall ist der Flaschenhals dass 25000 Internetseiten geöffnet werden und Daten da rausgezogen werden, mit jeweils 5 sek Wartezeit damit keine Daten verloren gehen.
AW: 3 Allgemeine Fragen zu makros
25.07.2024 08:36:36
Christian
Und wie komme ich in den Editor, wenn das makro bereits läuft? Oder hätte ich das stoppen einfügen müssen, bevor ich das makro gestartet habe?
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 09:12:01
daniel
ja, das musst du vorher festlegen.
wenn du das Makro gestartet hast, dann läuft es bis zum Ende durch.
es gibt zwar angeblich eine Taste, um einen Makrolauf zu unterbrechen, aber die ist nicht zuverlässig und du kannst nicht bestimmen, wann die Unterbrechung erfolgt.
Gruß Daniel
AW: 3 Allgemeine Fragen zu makros
25.07.2024 09:22:15
Christian
Ok, das ändert das ganze. Mir ging es darum, ein makro, dass pro Blatt eine schleife mit 2500 durchlaufen und nach jedem Durchlauf 5 sek Pause hat beliebig pausieren und fortführen zu können. Wenn ich da so einen stoppen einfüge, habe ich den in jedem Durchlauf. Das ist nicht das an was ich gedacht habe.
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 09:53:58
Yal
Hallo Christian,

es ist vieles möglich, aber nicht alles sinnvoll. Der Weg über das Unterbrechen des Codes und das Wiederstarten, da wo es gestoppt hat, ist keine stabile Lösung. Es kann höchstens zum Testzweck verwendet werden. Stabil ist nur, wenn ein Code von Anfang bis Ende ohne Unterbrechnung durchläuft. Darin können aber "Bedingungen" behandelt werden.

Was Du machen kannst, ist in einem separaten Blatt alle Blätter aufzulisten, daneben eine Eintrag, ob diese Verarbeitet werden soll ("SollVerarbeitet") und als dritte Spalte, einen Marker, ob oder wann das Blatt verarbeitet wurde ("WannVerarbeitet"). In den beiden ersten Spalten trägst Du selber ein, die Dritte wird vom Makro befüllt, kann aber von Dir zurückgesetzt werden.

Das Makro läuft dann so:
für jede Element der Liste,
wenn der Eintrag SollVerarbeitet > 0 und WannVerarbeitet > ""
dann verarbeiten und am Ende aktuelle Zeit in WannVerarbeitet schreiben.

Es läuft damit jedesmal alle Einträge durch, verarbeitet nur wenn die Bedingung stimmen. Du kannst immer zwischen 2 Durchlauf entweder SollVerarbeitet ändern, oder WannVerarbeitet löschen. Und somit zuverlässig steuern, was das Makro zu tun hat.

VG
Yal
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 10:52:00
Christian
Hallo yal, korrigier mich bitte wenn ich falsch liege, aber damit steuere ich doch nur, wann ich welches Blatt abarbeite, oder? Das mache ich ja bislang bereits, in dem ich ein makro nehme, dass das eigentliche makro 10x startet, jedesmal mit einem anderen tabellenblatt als Parameter, da kann ich ja die Blätter auskommentieren, wie und wann ich möchte und erstmal nur ein Teil ablaufen lassen und irgendwann dann mal mit einem anderen Teil weitermachen. Das ist ja bereits mein bisheriger weg.

Das was ich erreichen will ist wie bei einem Video beliebig auf play und Pause drücken zu können, da das abarbeiten eines einzelnen Blattes 3,5 Stunden dauert und das dann oft nicht mit der Zeit zusammenpasst, wann ich Zeit hätte an anderen Stellen der Tabelle schonmal weiterzuarbeiten. Ich will einfach die Zeit optimieren, wann das ganze fertig wird. Also solange ich keine Zeit habe an der Mappe weiterzuarbeiten das makro laufen lassen und wenn ich Zeit habe das makro so lange zu stoppen.

Die Möglichkeit, das malro Blätter einzeln abarbeiten zu lassen habe ich jetzt schon, aber habe dabei halt bis zu 3,5 Std Wartezeit

Zu Daniels frage, die 5 sek Wartezeit sind nach jedem schleifendurchlauf, also 2500x pro Blatt und 25000 mal für das komplette makro. Das hängt damit zusammen, dass Daten aus dem Internet runtergeladen werden und ohne die Pause Daten fehlen.

Aber wenn ich euch richtig verstehe ist das was ich mir vorstelle zwar möglich, aber sehr fehlerbehaftet. Da ich ja bereits eine Lösung habe, einzelne Blätter abzuarbeiten, ist es anscheinend besser, dabei zu bleiben, auch wenn es unterm Strich länger dauert als spontan pausieren zu können, oder?
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 10:13:17
daniel
Hi
beschreibe bitte mal ganz genau, was du vor hast.
bisher habe ich es so verstanden, dass du ein Makro hast, welches mehrere Tabellenblätter bearbeiten soll.
du möchtest nach der Bearbeitung eines Tabellenblatts 5 Sekunden zeit bekommen, um zu entscheiden, ob das nächste Tabellenblatt bearbeitet werden soll oder ob das Makro beendet werden soll.
Wenn du nach einer beendigung das Makro erneut startest, soll nicht mit dem ersten Blatt begonnen werden, sondern mit dem Tabellenblatt, bei dem gestoppt wurde.
ist das korrekt?

Gruß Daniel
Anzeige
AW: 3 Allgemeine Fragen zu makros
25.07.2024 10:53:07
Christian
Hallo Daniel,

Habe deine Frage im Zuge meiner Antwort auf yals Beitrag beantwortet.

Christian
AW: 3 Allgemeine Fragen zu makros
25.07.2024 11:05:18
daniel
ich hätte es schöner gefunden, wenn du auch mir geantwortet hättest.
hab zwar ne Idee, bin jetzt aber nicht mehr so richtig motiviert dir zu helfen.
AW: 3 Allgemeine Fragen zu makros
25.07.2024 11:21:36
Christian
Hallo Daniel,

Dann wenigstens danke für deine Ehrlichkeit, dann bin ich aber auch ehrlich. Ich wollte vermeiden, dass jeder weitere Helfer sich 2 verschiedene Beiträge durchlesen muss. Das ist der einzige Grund, weshalb du keine ausführliche Antwort bekommen hast.

Gruß Christian
Anzeige
mach dir nix draus ... (owT)
25.07.2024 11:40:44
Pierre
AW: mach dir nix draus ... (owT)
25.07.2024 11:48:16
Christian
Ich denke, auch Daniel sollte klar sein, dass es für mich viel einfacher gewesen wäre copy+paste zu machen oder die Antwort auf 2 Beiträge aufzuteilen, als noch einen zusätzlichen Beitrag zu schreiben, weshalb seine Antwort woanders steht. Ich bin der Überzeugung dass ich im Sinne der Helfer gehandelt habe, wenn sie sich die Informationen nicht aus mehreren verschiedenen Beiträgen zusammensuchen müssen. Wenn daniel dafür kein Verständnis hat, ist das halt so, ich kann damit leben.
Anzeige
AW: mach dir nix draus ... (owT)
25.07.2024 11:52:12
daniel
wir Helfer sind manchmal ein bisschen eitel.
Bitte sieh es uns nach, die Bestätigung unseres Egos ist der einzige Lohn, den wir hier bekommen, du solltest großzügig damit umgehen.
;

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