VBA Wait Schleife lässt Datenabfrage nicht zu
#1
Einen wunderschönen guten Morgen,

Ich sitze vor meinem Excel 2016 Sheet und komme mit meinem VBA Code nicht weiter. Ich habe ein Makro geschrieben, das folgendes tun soll:

Es zieht sich beim Starten Daten aus dem Web via Webabfrage und fügt sie in das Sheet (Tabelle1; Feld I10) ein. Wenn die Abfrage beendet ist, soll diese Zahl von Feld I10 auf Feld A1 in Tabelle6 kopiert werden. Dann soll 60 Sekunden gewartet werden. Anschließend wieder Datenabfrage, kopieren des Feldes I10 in Feld A2, warten, und so weiter... Am Ende des Tages kann man dann in Tabelle 6 sehen, welche Werte I10 hatte. Folgendermaßen sieht mein Makro aus:


Code:
Sub intervall()
Dim Zeit As Double, SekPause As Double

beginning:
ActiveWorkbook.RefreshAll
With Sheets("Tabelle6")
.Range("A6500").End(xlUp).Offset(1, 0).Value = Sheets("Tabelle1").Range("I10").Value

   SekPause = 60
   Zeit = Timer
   Do While Timer < Zeit + SekPause
   DoEvents
   Loop

GoTo beginning
End With

End Sub

Das Ganze funktioniert auch eigentlich. Die Daten werden abgefragt, der Datensatz wird nach Tabelle 6 kopiert und das Makro wartet 60 Sekunden. Allerdings wird nicht gewartet, bis die Abfrage beendet ist. Das heißt, noch während die Abfrage läuft, wird nach Tabelle 6 kopiert. Und was noch viel schlimmer ist: Der darauf folgende Timer pausiert die laufende Abfrage, sodass diese nie zuende ausgeführt wird. Wie bringe ich das Makro dazu, zu warten, bis die Abfrage beendet ist? Ich bin mit meinen mini Programmierkenntnissen am Ende...

Vielen Dank im Voraus,
Freefall
Top
#2
Einen schönn guten Morgen

wenn man den Code auf seinem PC testen will, z.B. mit einer MsgBox, hat man eine wundervolle Todesschleife!
So nennt man bei Programmen Sprungbefehle die ein Programm -endlos ausführen-, ohne das es jemals gestoppt werden kann!

Ich weiss nicht wie und wo das Programm jetzt eingebunden ist. aber der Befehl - GoTo beginning ist tödlich!  Der gehört da m.E. nicht hin!
Rufe das Programm aus einem anderen Makro mit dem Call Befehl auf, dann wird zwischen jede neue Aktion eine gezielte Pausen eingefügt.

mfg Gast 123
Top
#3
Hallo Freefall,

teste mal so:



' **************************************************************
'  Modul:  Modul1  Typ = Allgemeines Modul
' **************************************************************


Option Explicit

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Intervall_Kuwer()
 Do While Len(Worksheets("Tabelle1").Range("B2").Value)  'Schleife solange in B2 etwas steht
   Sheets("Tabelle6").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Sheets("Tabelle1").Range("I10").Value
   DoEvents
   Sleep 60000
 Loop
End Sub

Code eingefügt mit: Excel Code Jeanie

Gruß Uwe
Top
#4
Hallo,

um eine Pause in ein Script einzubauen, dürfte es besser sein, folgende Konstruktion zu wählen (von Nepumuk)


Code:
Private Declare PtrSafe Sub Sleep Lib "kernel32.dll" ( _
   ByVal dwMilliseconds As Long)

Sub Pause()
   Call Sleep(500) '500 Millisekunden Pause
End Sub


mfg
Top
#5
Hallo,

vielen Dank erst einmal für eure Antworten! Die Version

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


bzw.

Code:
Private Declare PtrSafe Sub Sleep Lib "kernel32.dll" ( _
   ByVal dwMilliseconds As Long)

habe ich auch schon öfter gesehen. Allerdings bekomme ich dann immer eine Fehlermeldung, da "Declare-Anweisungen nicht als Public-Elemente von Objektmodulen zugelassen" sind. Was auch immer das heißen mag.

Den Lösungsvorschlag von Gast 123 würde ich auch gern ausprobieren, allerdings hab ich nicht ganz verstanden, was genau ich dafür tun muss...

Hat noch jemand eine Idee?

Gruß,
Freefall
Top
#6
Hallo

ich beziehe mich auf diesen Teil:
Zitat:Es zieht sich beim Starten Daten aus dem Web via Webabfrage

Für dieses Daten aus dem Web holen muss es meines Erachtens noch ein anderes Makro geben, das befindet sich dann in der Datei die den Web Aufruf macht.  Oder liege ich da völlig falsch. Habe selbst nie mit Web Aufruf gearbeitet!

Wenn das aber stimmt könnte man die Zeitverzögerung in dieses Makro mit einfügen. Ich nehme an das Makro hat eine Wiederholschleife, weil es ja immer wieder neu startet. Oder liege ich da falsch??  Da könnte man dieses Makro einbinden, oder den Vorschlag von Nepumuk mit Millisekunden Verzögerung einbauen.  Dazu müsste man das Makro aber kennen.  So kann ich mir das nur rein theoretisch ausdenken.  Obs dann klappt ist eine andere Frage???

mfg  Gast 123
Top
#7
Achso, dann versteh ich's jetzt ;)
Nein, für das Beziehen/Aktualisieren der Daten benutze ich kein Makro. Es gibt die Funktion in Excel, alle x Minuten die Daten neu abzurufen. Diese Funktion ist eingeschaltet. Allerdings ist es so, dass der Pause-Befehl in meinem selbst geschriebenen Makro alle Aktivitäten, die Excel durchführt, zu pausieren scheint. Deshalb wird die Aktualisierung auch nie abgeschlossen, weil für den immer wiederkehrenden Zeitraum von 60 Sekunden abgewartet wird.
Es wäre es cool, wenn einer eine Möglichkeit kennt, das Pausieren nur auf das Makro an sich zu begrenzen.

Gruß
Freefall
Top
#8
(03.09.2017, 13:29)freefall101 schrieb: Nein, für das Beziehen/Aktualisieren der Daten benutze ich kein Makro. Es gibt die Funktion in Excel, alle x Minuten die Daten neu abzurufen. Diese Funktion ist eingeschaltet.
Im selben Dialogfenster gibt es auch die Option "Aktualisierung im Hintergrund zulassen".
Schalte die mal ab.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Top
#9
Hallo Freefall,

(03.09.2017, 13:29)freefall101 schrieb: Es wäre es cool, wenn einer eine Möglichkeit kennt, das Pausieren nur auf das Makro an sich zu begrenzen.

dann die Variante mit Applicaton.OnTime:


' **************************************************************
'  Modul:  Modul2  Typ = Allgemeines Modul
' **************************************************************


'http://www.online-excel.de/excel/singsel_vba.php?f=133

Option Explicit

Dim iTimerSet As Double

Public Sub StartIntervall()
iTimerSet = Now + TimeValue("00:01:00")
Application.OnTime iTimerSet, "Intervall"
End Sub

Public Sub StopIntervall()
Application.OnTime iTimerSet, "Intervall", , False
End Sub

Private Sub Intervall()
 ActiveWorkbook.RefreshAll
 Sheets("Tabelle6").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Sheets("Tabelle1").Range("I10").Value
 StartIntervall
End Sub

Code eingefügt mit: Excel Code Jeanie

Gruß Uwe
Top
#10
Hallo Detlef,

(03.09.2017, 14:26)shift-del schrieb: Im selben Dialogfenster gibt es auch die Option "Aktualisierung im Hintergrund zulassen".
Schalte die mal ab.

wieso denn das jetzt?  Huh

Gruß Uwe
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste