Autor
|
Thema: Fortschrittsbalken für Schleife (1936 mal gelesen)
|
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 15. Jul. 2016 11:25 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe einen Fortschrittsbalken und dazu einen Backgroundworker. Etappenweise lasse ich den Fortschrittsbalken um einen Prozentsatz steigen, den ich aus der Zeit ermittle, die bis zu diesem Schritt benötigt wurde. Dann komme ich zu einer Schleife, die Werte in einer großen Excel Datei ausliest und in CATIA operationen durchführt. Bis zu der Schleife werden 40% angezeigt, dann steht der Balken für 10min und danach sprigt der Balken auf 80%, weil ich das so eingestellt habe. Wie kann ich sagen, dass in der Schleife auch der Balken fortschreitet? Also so ist es aufgebaut: Operation CATIA Operation CATIA Operation CATIA CatiaBackgroundWorker.ReportProgress(40) For ... große Excel Schleife + Operationen CATIA Next CatiaBackgroundWorker.ReportProgress(80) Zwischen 40 und 80 steht der Balken. Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 15. Jul. 2016 11:37 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
Servus Du kannst doch das "ReportProgress" auch in die Schleife einbauen und dort dann die Zwischenwerte über die Anzahl der Schleifendurchläufe berechnen (bei eine For-next-Schleife hast du ja die Anzahl) Gruß Bernd PS: Was ist bei dir "CatiaBackgroundWorker"? ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 15. Jul. 2016 11:45 <-- editieren / zitieren --> Unities abgeben:
Servus, aber meine Anzahl der Werte in der Schleife ist immer eine andere. Mal muss die Schleife 3000x durchlaufen, mal 5000x ... und mein Maximumwert ist 100. DAs habe ich jetzt nicht ganz verstanden. Meinen BackroundWorker habe ich so aufgebaut: Private CatiaBackgroundWorker As New BackgroundWorker() Sub XXX() AddHandler CatiaBackgroundWorker.DoWork, New DoWorkEventHandler(AddressOf bw_DoWork) AddHandler CatiaBackgroundWorker.ProgressChanged, AddressOf bw_ProgressChanged AddHandler CatiaBackgroundWorker.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted CatiaBackgroundWorker.WorkerReportsProgress = True
CatiaBackgroundWorker.RunWorkerAsync() End Sub Private Sub bw_DoWork(sender As Object, e As DoWorkEventArgs) Me.SUB_Start() End Sub Private Sub bw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Me.Fortschrittsbalken.Value = e.ProgressPercentage End Sub Private Sub bw_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Me.Fortschrittsbalken.Value = 100 Me.Fortschrittsbalken.Value = 0 MsgBox("Fertzsch!") End Sub Gruß
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 15. Jul. 2016 12:03 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
|
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 15. Jul. 2016 12:13 <-- editieren / zitieren --> Unities abgeben:
Hi, ich bin im Visual Studio mit vb.NET unterwegs. Ich weiß ja aber nie vorher wie viele Durchläufe es sind, oder kann ich das vorne weg abbfragen? Meine Range für Excel ist (P46:P7000) und gesucht wird dort nach einem bestimmten Wert, der nicht in jeder Zeile enthalten sein muss. Ich habe nun in der Schleife am Ende folgendes eingebaut: Fortschrittsbalken.Value += 1 Ich schau was passiert, aber wenn nach 40% mit der SChleife 3000 Durchläufe benötigt werden, dann habe ich am Ende der Durchläufe den Balken auf 3040% bei Max. 100%. Grüße
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 15. Jul. 2016 13:12 <-- editieren / zitieren --> Unities abgeben:
Ich habe es jetzt so am Ende der Schleife versucht: myAnzahl = xlsApp.Worksheets("VIP-Report-Verbindungsliste").UsedRange.Rows.Count CatiaBackgroundWorker.ReportProgress(Fortschrittsbalken.Value = Fortschrittsbalken.Value + 40 / myAnzahl) Da wird der Balken aber komplett zurückgesetzt und das Sub beendet. Außerdem habe ich mit "myAnzahl2 ALLE benutzten Zeile ermittelt, was ich nicht will. Ich brauche nur die Anzahl der Zeilen mit dem Wert 3 in Splate P. javascript:InsertSMI(' %20'); Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 15. Jul. 2016 14:06 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
Zitat: Fortschrittsbalken.Value + 40 / myAnzahl
Das dürfte falsch sein. Annahme: MyAnzahl=4000 Ein Prozent entspricht dann MyAnzahl/40 = 100 Durchläufe Gesamtfortschritt[%] = 40% + n * Durchläufe / 100; sprich alle 100 Durchläufe steigt der Fortschritt um 1%. Probier mal folgendes(VBA-Code):
Code:
Vor der Schleife:dim dblInc as double Dim iStartProgBar as integer dblInc = myAnzahl \ 40 'integerdivision durch 40% Gesamtfortschritt in der Schleife iStartProgBar = 40 '40% Fortschritt vor Eintritt in die Schleife
In der Schleife: Code:
CatiaBackgroundWorker.ReportProgress(Fortschrittsbalken.Value = iStartProgBar + n \ dblInc) 'wobei n der Schleifenzähler ist, gleich myAnzahl
Wie Du korrekt MyAnzahl ermittelst, kann ich Dir nicht sagen. Eventuell musst die Werte erstmal durchlaufen und die falschen aussortieren, d.h. die richtigen merken. Hope it helps, Joe ------------------ Inoffizielle Catia Hilfeseite Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 15. Jul. 2016 14:12 <-- editieren / zitieren --> Unities abgeben:
Hi, wie ich myAnzahl ermittle, habe ich raus: Dim myWertP As Long Dim myAnzahl As Long myWertP = 3 rng = xlsApp.Worksheets("VIP-Report-Verbindungsliste").Range("P47:P7000") myAnzahl = xlsApp.WorksheetFunction.CountIf(rng, myWertP) Als was deklarierst du das "n" in CatiaBackgroundWorker.ReportProgress(Fortschrittsbalken.Value = iStartProgBar + n \ dblInc)? Das meckert er mir noch an. Danke.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 15. Jul. 2016 14:15 <-- editieren / zitieren --> Unities abgeben:
|
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 15. Jul. 2016 14:52 <-- editieren / zitieren --> Unities abgeben:
Hi Joe, also das Ergebnis ist folgendes: Sobald die Schleife angefangen hat, wird der Fortschrittsbalken auf 0 heruntergefahren und bleibt auf 0 bis zum Ende der Schleife. Danach schießt er auf 80% hoch und läuft regulär bis zum ende durch. Hm. Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 15. Jul. 2016 16:14 <-- editieren / zitieren --> Unities abgeben:
So geht es: For Each ... If ... Then OPERATION CatiaBackgroundWorker.ReportProgress(Fortschrittsbalken.Value + (iStartProgBar / myAnzahl)) End if Next Ich teile die 40%, die ich für die Schleife zur Verfügung habe durch die Anzahl gefundener Elemente und zähle sie zum aktuellen Wert des Balkens dazu. Danke euch! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 15. Jul. 2016 16:38 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
Hi tweety, Zitat: (Fortschrittsbalken.Value + (iStartProgBar / myAnzahl))
Wenn Du jetzt noch die Rechnung (iStartProgBar / myAnzahl) vor der Schleife substituierst, zB dblInc = (iStartProgBar / myAnzahl), dann kannst (Fortschrittsbalken.Value + dblInc) schreiben. Läuft schneller. Bei 4000 Durchläufen sind's schnell ein paar Sekunden. Nur so als Idee. Tschau, Joe ------------------ Inoffizielle Catia Hilfeseite Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 15. Jul. 2016 18:52 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
Zitat:
Sobald die Schleife angefangen hat, wird der Fortschrittsbalken auf 0 heruntergefahren und bleibt auf 0 bis zum Ende der Schleife. Danach schießt er auf 80% hoch und läuft regulär bis zum ende durch.
Das Abarbeiten der Schleife verhindert vermutlich den Update der ProgBar. VBA hat für solche Probleme das 'DoEvents'. Tschau, Joe ------------------ Inoffizielle Catia Hilfeseite Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 19. Jul. 2016 12:56 <-- editieren / zitieren --> Unities abgeben:
Hey Joe, die Rechnung ergibt einen Fortschritt von 0,05% für 760 Elemente. Ich kann die Step Zahl aber nicht kleiner 1 stellen. Somit passiert wieder nix während der Schleife. Welche Einstellungen brauch ich für den Balken? Danke Ciao Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 19. Jul. 2016 13:03 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
Servus Dann nutze doch für den Zähler eine zweite Variable zB als Double. Diesen dann innerhalb der Schleife runden (zB mit CInt) und dem Fortschrittsbalken zuwiesen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 19. Jul. 2016 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
|
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 19. Jul. 2016 17:20 <-- editieren / zitieren --> Unities abgeben:
|
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 20. Jul. 2016 13:41 <-- editieren / zitieren --> Unities abgeben:
Ich habe es jetzt so aufgebaut: If dblInc < 1 Then dblIncRunden = (1 - dblInc) ElseIf dblInc >= 1 dblIncRunden = 0 End If 'dblIncRunden = CDbl(dblInc) CatiaBackgroundWorker.ReportProgress(Fortschrittsbalken.Value + dblIncRunden + dblInc) Aber da wird der Balken viel eher voll sein, als die Schleife durch ist. Und danach soll ja auch noch was kommen. Mit dblIncRunden = CDbl(dblInc) tut sich nix. Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 20. Jul. 2016 15:22 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
|