Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

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
Antworten 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
Antworten 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
Antworten 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
Antworten 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
Antworten 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
Antworten 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
Antworten Top
#8
(03.09.2017, 12: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.

Antworten Top
#9
Hallo Freefall,

(03.09.2017, 12: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
Antworten Top
#10
Hallo Detlef,

(03.09.2017, 13: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
Antworten Top


Gehe zu:


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