Gelöst Excel Diagramm. Änderungen anzeigen während Makro läuft?

Dieser Thread ist Teil einer Diskussion zu einem Artikel:  Zum News-Artikel gehen

nochEinAndreas

Stammgast
Hallo Excel-Freaks,

ein Makro macht Änderungen an einem Diagramm. Diese Änderungen werden aber immer erst sichtbar, wenn der Makro zuende gelaufen ist.
ich habe hier ein kleines Beispiel angehängt. Der Code in der Mappe sieht so aus:

Code:
Option Explicit

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

Sub färben()
    
    ' Hier wird die Zeichnungsfläche rot gefärbt:
    ActiveSheet.ChartObjects(1).Chart.PlotArea.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
    
    ' Hier wird 3 sec gewartet:
    Sleep 3000
    
    ' Erst wenn der Makro hier zu ende ist, wird das Diagramm rot.
End Sub

Wenn ihr im Diagramm auf den Button klickt, läuft der Makro los. Die erste Zeile färbt den Plotbereich rot. Die zweite Zeile sorgt für eine Pause von 3 sec. Während dieser Pause passiert gar nichts. Erst wenn der Makro fertig ist, wird das Diagramm rot.

Ich hätte aber gerne, dass Änderungen, die der Makro im Diagramm ausführt, sofort angezeigt werden. Geht das irgendwie?
Im Netz gibt's diverse Tips mit
Application.ScreenUpdate = True
oder
DoEvents
oder
Chart.Refresh

Alles ausprobiert. Hilft nix. Das Diagramm ändert sich erst, wenn der Makro fertig ist.
Es ist auch völlig egal, welches Diagramm-Element man ändert. Es erscheint immer erst am Schluss.

Interessant ist auch: Wenn man per Makro die Werte für die Kurve in den Zellen ändert, werde die neuen Werte in der Tabelle sofort angezeigt. Die Kurve ändert sich aber auch wieder erst am Ende.

Wissende vor!

Danke und Gruß,
Andreas
 

Anhänge

  • Diagramm färben.zip
    20,7 KB · Aufrufe: 1

nochEinAndreas

Stammgast
Heureka, es ist gelöst!

Für alle die es interessiert. Es geht doch mit DoEvents. Aber es reicht nicht 1x, nicht 2x, nein, man muss es 3x hintereinander schreiben, damit es klappt. Hier der Code:

Code:
Option Explicit

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

Sub färben()
    
    ' Hier wird die Zeichnungsfläche rot gefärbt:
    ActiveSheet.ChartObjects(1).Chart.PlotArea.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
    
    ' Dann braucht es 3 DoEvents hintereinander. So wird es dann sofort aktualisiert.
    DoEvents
    DoEvents
    DoEvents
    
    ' Hier wird 3 sec gewartet
    Sleep 3000
End Sub

Fragt bitte nicht nach dem Sinn dahinter. Ich habe keine Ahnung. Hauptsache, es funktioniert.
Vielleicht hängt es ja irgendwie mit Goethes Faust zusammen. Da heißt es ja auch schon: "Du musst es dreimal sagen":

Gruß, Andreas
 

Anhänge

  • Diagramm färben, so klappt's.zip
    21,5 KB · Aufrufe: 1

nochEinAndreas

Stammgast
Danke Gaby. Ich würde das Thema gerne als gelöst markieren. Kriege ich aber nicht hin. Wie geht denn das?

Gruß, Andreas
 

Gaby Salvisberg

Super-Moderator
Hallo Andreas
Kollege slup hat das nun bei diesem Post gemacht.
Es ginge so: Oben rechts beim Eröffnungspost das 3-Punkte-Symbol (Weitere Einstellungen), dort "Thema bearbeiten". Hier sollte sich das Präfix auf Gelöst setzen lassen.
Herzliche Grüsse
Gaby
 

weer

Stammgast
Hallo Andreas
Es geht doch mit DoEvents. Aber es reicht nicht 1x, nicht 2x, nein, man muss es 3x hintereinander schreiben
Bei mir reicht es mit 2 DoEvents! - Office 2013
Nicht Goethe, nicht Beetlejuice, sondern einfach meine Grossmutter: "Doppelt genäht hält besser!"
Viele Grüsse Niclaus
 

nochEinAndreas

Stammgast
Also ich hab's bei mir zuhause probiert (Office 2019) und in der Firma (Office 365). Bei beiden braucht es Goethe bzw. Beetlejuice. Ich vermute, dass es da irgendwie Timing-Probleme zwischen Windows, Office und Grafik-Treiber oder -karte gibt.
Noch kritischer wird es bei meiner eigentlichen Anwendung: Ich möchte nach dem Umfärben der Fläche mit WinApi Funktionen die Pixelfarben auf dem Bildschirm auslesen. Da braucht es dann nach den 3 DoEvents zusätzlich noch ein Sleep. Noch mehr DoEvens helfen nicht. Ich vermute, dass nach den 3 alle Events abgearbeitet sind, aber die Grafik braucht wohl noch irgendwie Zeit, um alles zu erneuern. Das hängt wohl mit der Refresh-Rate des Grafik-Treibers zusammen. Alles echt tückisch und unschön.

Gruß, Andreas
 
Zuletzt bearbeitet:

weer

Stammgast
Hallo Andreas
Eine Frage zu Deinem Makro habe ich noch. Du färbst ja "nur" die Zeichnungsfläche rot ein.
Ich möchte aber auch den Diagrammbereich einfärben. Ich habe dazu eine zweite "Aktion" eingefügt.

' Hier wird die Zeichnungsfläche rot gefärbt:
ActiveSheet.ChartObjects(1).Chart.PlotArea.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)

' Diagrammbereich wird gefärbt - "äusserer" Teil des Diagrammes
ActiveSheet.Shapes(1).Fill.ForeColor.RGB = RGB(255, 0, 0)
Meine Frage: Geht das auch in einem Aufwaschen: Dass mit einem Code beide Bereiche eingefärbt werden?

Dank und Gruss
Niclaus
 

nochEinAndreas

Stammgast
Guten Abend Niclaus,

ich denke nicht, dass das auf einmal geht. Schließlich sind es zwei unterschiedliche Objekte. Wenn du das Färben ohne Makro machst, musst du sie ja auch einzeln anklicken und die Farben auswählen.

In meinem Code habe ich auch bewusst nur die PlotArea gefärbt: Im kompletten Makro folgt dann per Windows API-Funktionen die Suche nach genau dieser Farbe. So kann ich dann feststellen, von wo bis wo (in Pixeln) die PlotArea reicht. Vorher habe ich über ein MouseDown-Ereignis festgestellt, wo (auch in Pixeln) der Benutzer hingeklickt hat. Damit gelingt es mir dann hoffentlich endlich (nach Monate langen vergeblichen Versuchen auf anderen Wegen), rauszufinden, wo (in Koordinaten des Diagramms) der Benutzer hingeklickt hat.

Gruß und noch einen schönen Abend,
Andreas
 
Oben