Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1604to1608
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Schleife setzt Counter zurück (Endlosschleife)

Schleife setzt Counter zurück (Endlosschleife)
06.02.2018 07:17:38
Rainer
Hallo Excelfreunde,
ich habe mal was verrücktes entdeckt.
Ich habe eine Schleife, welche mehrere Datensätze über OLE an eine andere Anwendung schickt und dann Ergebisse zurückbekommt. Das klappt auch alles super.
Da man aber endlos viele Datensätze haben könnte, da habe ich gedacht, machen wir eine "Progress Bar" und dann sieht es hübscher aus.
Nun kommt das Problem. Der Code für die Schleife läuft einwandfrei.
Wenn ich den Code mit Progress Bar ausführe, dann läuft er auch einwandfrei, ABER nur wenn Excel die aktive Anwendung ist. Aktiviere ich z.B. das Fenster der anderen OLE-Anwendung oder jedes andere beliebige Fenster, dann setzt Excel den Zähler der Schleife immer wieder zurück und lädt immer wieder den ersten Datensatz.
Der Code für die Progress Bar (wird vom Button gestartet):
Private Sub UserForm_Activate()
'Puts the user form in the middle of the Excel screen when opened.
Me.StartupPosition = 0
Me.Top = (Application.Height / 2) - (Me.Height / 2)
Me.Left = (Application.Width / 2) - (Me.Width / 2)
UF5_Code
Unload UserForm5
End Sub
Der Code im Modul "UF5"
Public pctCompl_UF5 As Single
Sub UF5_Code()
Send_Spectra_to_Code
End Sub
Sub Progress_UF5(pctCompl_UF5 As Single)
'BarWidthMax = 200
UserForm5.Text.Caption = Int(pctCompl_UF5) & "% Completed"
UserForm5.Bar.Width = pctCompl_UF5 * 2
DoEvents
End Sub
... und noch die Sub mit der Schleife:

Public SpectraNo
Sub Send_Spectra_to_Code()
Dim ARR
pctCompl_UF5 = 0      'Progress for Userform
Progress_UF5 pctCompl_UF5           'Update UserForm "Progess Bar"
'Clean up
LastCol = Sheets(1).Cells(3, Sheets(1).Columns.Count).End(xlToLeft).Column
LastRow = Sheets(1).Cells(Sheets(1).Rows.Count, "A").End(xlUp).Row
If LastCol > 2 Then Sheets(1).Range(Sheets(1).Cells(3, 3), Sheets(1).Cells(LastRow, LastCol)) _
.Clear
'Check the Spectra Sheet Dimension
LastRow = Sheets(2).Cells(Sheets(2).Rows.Count, "A").End(xlUp).Row - 1
LastCol = Sheets(2).Cells(1, Sheets(2).Columns.Count).End(xlToLeft).Column
SpectraNo = 2   'Start with 2, 1 is WL
While SpectraNo 
Das gleiche Resultat habe ich auch wenn ich es versuche mit:
For SpectraNo = 2 To LastCol
Wenn ich die Sub "Send_Spectra_to_Code" alleine ausführe, dann habe ich keine Probleme und die Zählervariable zählt richtig hoch.
Damit der Code keinen Einfluss haben kann, lasse ich die Zählervariable extra in eine Zelle schreiben und hole sie mir wieder am Ende der Schleife. Aber Pustekuchen.
Dieser Mist lässt sich leider auch nicht im Debugger nachverfolgen, weil beim Debug Excel ja die aktive Anwendung ist.
Hat jemand eine Idee für dieses merkwürdige Benehmen?
Gruß,
Rainer

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife setzt Counter zurück (Endlosschleife)
06.02.2018 09:52:10
Luschi
Hallo Rainer,
so sieht es bei mir aus:
- der Aufruf der Userform (UF) mit dem Fortschrittsbalken muß mit dem Parameter
  'vbModeless' erfolgen
- die Prozeduren zur Steuerung liegen in einen normalen Modul
- die Variablen zur Steuerung des Laufbalkens müssen mit 'Static' deklariert sein
- während der Initialisierung der UF wird per API die Fenster-Handle-ID ermittelt
- um die UserForm immer auf den Bildschirmvordergrund bringen zu können (mit API),
  selbst wenn eine andere Anwendung aktiv ist.
Gruß von Luschi
aus klein-Paris
AW: Schleife setzt Counter zurück (Endlosschleife)
07.02.2018 07:15:41
Rainer
Hallo Luschi,
ja, mit "vbmodeless" geht es.
ich habe es zuerst nur bei der "Progressbar" angewendet, aber nicht bei der "UF2" (die mir anzeigt, dass die OLE-Anwendung beschäftigt ist). Dann ist er immer in der Endlosschleife, auch wenn Excel aktiv ist.
Aber mit "vbmodeless" für beide UF geht es.
Ich habe getan:
- der Aufruf der Userform (UF) mit dem Fortschrittsbalken muß mit dem Parameter
'vbModeless' erfolgen
CHECK
- die Prozeduren zur Steuerung liegen in einen normalen Modul
CHECK
- die Variablen zur Steuerung des Laufbalkens müssen mit 'Static' deklariert sein
CHECK, geändert.

- während der Initialisierung der UF wird per API die Fenster-Handle-ID ermittelt
- um die UserForm immer auf den Bildschirmvordergrund bringen zu können (mit API),
selbst wenn eine andere Anwendung aktiv ist.

Ich will eigentlich nicht, dass es mir die UF immer im Vordergrund hält. Die Berechnungen dauern pro Datensatz etwa 5 ... 15 Sekunden, meine Beispielmessreihe hat ca. 450 Datensätze. Solange kann Excel gern im Hintergrund sein.
Ein Nachteil ist aber, dass es die Userform UF2 nicht mehr positioniert. Somit verdeckt sie jetzt die UF5 mit dem Ladebalken.
Private Sub UserForm_Activate()
'Puts the user form in the middle of the Excel screen when opened.
Me.StartupPosition = 0
Me.Top = (Application.Height / 2) - (Me.Height / 2) + 100
Me.Left = (Application.Width / 2) - (Me.Width / 2)
UF2_Code
Unload UserForm2
End Sub
Auch der Inhalt der UserForm wird nicht geupdatet, aber der Code scheint richtig zu laufen.
"ProgressX" sind einfach nur Textlabel, welche nacheinander eingeblendet werden und wieder alle verschwinden. Dies funktioniert nicht, es bleiben alle "Visible".
Aber die "Warteschleife" funktioniert.

Sub UF2_Code()
UserForm2.Progress1.Visible = False
UserForm2.Progress2.Visible = False
UserForm2.Progress3.Visible = False
UserForm2.Progress4.Visible = False
UserForm2.Progress5.Visible = False
UserForm2.Progress6.Visible = False
'Create the wcd object
Set wcd = CreateObject("code.colors")
Fortschritt = 0
While wcd.fitting  0     'Check if CODE FIT is running
Fortschritt = Fortschritt + 1
Select Case Fortschritt
Case Is = 1
UserForm2.Progress1.Visible = True
Case Is = 2
UserForm2.Progress2.Visible = True
Case Is = 3
UserForm2.Progress3.Visible = True
Case Is = 4
UserForm2.Progress4.Visible = True
Case Is = 5
UserForm2.Progress5.Visible = True
Case Is = 6
UserForm2.Progress6.Visible = True
Case Else
UserForm2.Progress1.Visible = False
UserForm2.Progress2.Visible = False
UserForm2.Progress3.Visible = False
UserForm2.Progress4.Visible = False
UserForm2.Progress5.Visible = False
UserForm2.Progress6.Visible = False
Fortschritt = 0
End Select
Application.Wait Now + TimeSerial(0, 0, 1)    'Wait for 1 second if FIT not finished
Wend
End Sub
Ich hoffe du kannst mir noch folgen.
Danke für deine Hilfe,
Rainer
Anzeige
AW: Schleife setzt Counter zurück (Endlosschleife)
07.02.2018 07:20:27
Rainer
Hallo Luschi,
ein Update:
Bei genauerer Betrachtung aktualisiert der UF2 offenbar kurz vor dem Beenden von UF2, dann "springt" sie in die richtige Position bevor sie verschwindet.
Danke und Gruß,
Rainer

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige