Registriert seit: 03.09.2017
Version(en): 2016
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
Registriert seit: 12.03.2016
Version(en): Excel 2003
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
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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 JeanieGruß Uwe
Registriert seit: 06.12.2015
Version(en): 2016
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
Registriert seit: 03.09.2017
Version(en): 2016
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
Registriert seit: 12.03.2016
Version(en): Excel 2003
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
Registriert seit: 03.09.2017
Version(en): 2016
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
Registriert seit: 12.04.2014
Version(en): Office 365
(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.
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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 JeanieGruß Uwe
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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? Gruß Uwe
|