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: Diagramm aktualisiert nicht mit VBA
#1
Hallo Ihr Wissenden,

VBA 'verblüfft' mich aktuell:

In meinem (XL365, Win 10, 64bit) derzeitigen Arbeitsblatt habe ich ein eingebettetes x-y-Diagramm. Dieses bezieht seine Werte aus einer Tabelle, die per Power Query durch Auslesen externer ASCII-Dateien erzeugt wird.

Per VBA möchte ich nun die Diagramm-Achsen skalieren, sodass sie zu den Daten passen. Dazu bilde ich Double-Variable aus der Tabelle, sowohl für die Abszisse als auch die Ordinate.

Dazu habe ich Objektvariable gebildet, die sowohl das im Blatt eingebettete Chart-Objekt referenzieren, als auch das darin enthaltene Chart.
Über die .Axes(xlValue) bzw. .Axes(xlCategory) und deren jeweilige  .MinimumScale - Attribute setze ich nun die Skalierung der Achsen.

Im Step-Durchlauf (mit F8) tut auch alles, wie soll.

Wenn ich aber das Makro per Schaltfläche auf dem Arbeitsblatt ausführe, dann werden zwar die neuen Werte für die Datenreihe übernommen, aber die geänderten Achsenskalierungen sind nicht da - es bleibt bei den alten Min- und Max-Einstellungen beider Achsen.

Mir fällt nichts mehr ein, wie ich das Teil dazu bringe, im Durchlauf per Schaltfläche das zu machen, was es im Einzelschritt-Durchlauf einwandfrei ausführt.

Mit refresh, vorherigem Umschalten auf .MinimumScaleIsAuto = True und sonstigen Spielereien habe ich bereits experimentiert - alles nutzt nix. ...und die Funde mit Google waren bisher auch nicht hilfreich - wahrscheinlich habe ich nur wieder nicht die richtige Frage gestellt...?

Jetzt frage ich mal in die Runde, wie ich dem Herr werden kann. Nachfolgend mein Code, der hier relevant ist:

   
    Set wlRange = Tabelle2.ListObjects("Intensity").ListColumns("Lambda").DataBodyRange
    Set IntRange = Tabelle2.ListObjects("Intensity").ListColumns("Int%").DataBodyRange
    Set DiaObj = Tabelle2.ChartObjects("Dia_Int")
    Set DiaInt = DiaObj.Chart
    With DiaInt
        xMin = Application.WorksheetFunction.Min(wlRange)
        xMax = Application.WorksheetFunction.Max(wlRange)
        yMin = Application.WorksheetFunction.RoundDown(Application.WorksheetFunction.Max(0, 0.95 * Application.WorksheetFunction.Min(IntRange)), 0)
        yMax = Application.WorksheetFunction.RoundUp(1.05 * Application.WorksheetFunction.Max(IntRange), 0)
       
        With .Axes(xlValue)
            .MinimumScaleIsAuto = True
            .MaximumScaleIsAuto = True
        End With
        .Refresh
        With .Axes(xlValue)
            .MinimumScale = yMin
            .MaximumScale = yMax
        End With
        With .Axes(xlCategory)
            .MinimumScaleIsAuto = True
            .MaximumScaleIsAuto = True
        End With
        .Refresh
        With .Axes(xlCategory)
            .MinimumScale = xMin
            .MaximumScale = xMax
        End With
        .Refresh
    End With

   
    Application.Calculate

    Application.ActiveWorkbook.RefreshAll

    MsgBox "Die Messwerte der gewählten Datei sind aktuell", _
        vbOKOnly, "Messwerte aktualisiert"

Dabei sind:
Tabelle2: der Codename des Blattes, das sowohl die Daten als auch das Diagramm, um das es geht, enthält
wlRange: Datenspalte der Quelltabelle, in denen die Abszissenwerte stehen
intRange: Datenspalte der Quelltabelle, in denen die Ordinatenwerte stehen
DiaObj: das eingebettete Chart-Objekt im Tabellenblatt
DiaInt: das in DiaObj enthaltene Chart, dessen Achsen ich skalieren möchte

Kleine Zusatzfrage: ich hätte das Diagramm gerne aktualisiert, bevor die Message-Box am Ende des Codes erscheint. Aber - das gelingt mit den beschriebenen Routinen ebenso wenig.. - ein Tipp?

Ich habe eine Testdatei gebildet, die auf die hier genannten Punkte reduziert sein müsste - hoffe, Sie hilft bei der Veranschaulichung. Habe dabei auch die PQ-Routine entfernt und kann somit keine ASCII-.Datei mehr einlesen damit. Aber ich denke, beim Experimentieren kann man ja die Werte direkt in der Tabelle manipulieren, um den Effekt zu sehen - hoffentlich... ?
.xlsm   Test.xlsm (Größe: 77,41 KB / Downloads: 7)

Danke für Eure Hilfen und Ratschläge,
RaiSta
Antworten Top
#2
Hallöchen,

1)
also, das Diagramm wird auf die ermittelten Werte 86-97 und 400-800 eingestellt.

2)
Füge vor die Msgbox mal so was ein:
Dim i%
For i = 1 To 10: DoEvents: Next
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#3
Ok, das hilft erst mal, dass die Achsen jetzt richtig skaliert werden.

Was erreiche ich mit dem 'DoEvents', besonders, wenn ich es mehrfach hintereinander ausführe, eigentlich, dass Excel - oder VBA - beim Durchlauf tut, was die Befehlzeilen 'sagen', aber ohne DoEvents jedoch nicht ?

An den Hinweis mit DoEvents kann ich mich aus der Vergangenheit dunkel erinnern, aber so richtig begriffen, was das bewirkt, habe ich nicht - oder kann mich nicht mehr 'dran erinnern... beides möglich.

...und: wenn ich als letztes noch 'ne Messagebox einfüge, die berichtet, dass das Makro gelaufen ist, dann kommt die, bevor das Diagramm aktualisiert wird. Das geschieht dann erst später - ungeachtet der DoEvents... Geht das auch anders?

Ist mir irgendwie doof, dass ich hier VBA offenbar noch nachhelfen muss, zu tun, was es zu tun hat. Frustrierend!

Gruß und Dank,
RaiSta
Antworten Top
#4
Hallöchen,

beschrieben ist das mit "... DoEvents übergibt die Ablaufsteuerung an das Betriebssystem. Das Programm erhält erst dann die Steuerung wieder zurück, wenn das Betriebssystem alle wartenden Ereignisse verarbeitet hat ..."

Im Prinzip wird das Makro dadurch kurz unterbrochen und läuft anschließend weiter.
Deine MsgBox unterbricht die Ausführung ebenfalls, so lange, bis Du ok oder was auch immer drauf ist, drückst.

Das Diagramm wird, trotz anderslautender Reihenfolge im Makro, erst nach der Unterbrechung durch die MsgBox aktualisiert.
Alternativ habe ich DoEvents eingesetzt. Bei mir reichen die 10 Durchläufe von DoEvents als Unterbrechung, damit das Diagramm vor der MsgBox aktualisiert wird.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#5
(18.11.2022, 17:55)schauan schrieb: "... DoEvents übergibt die Ablaufsteuerung an das Betriebssystem. Das Programm erhält erst dann die Steuerung wieder zurück, wenn das Betriebssystem alle wartenden Ereignisse verarbeitet hat ..."

Im Prinzip wird das Makro dadurch kurz unterbrochen und läuft anschließend weiter.
Deine MsgBox unterbricht die Ausführung ebenfalls, so lange, bis Du ok oder was auch immer drauf ist, drückst.

Das Diagramm wird, trotz anderslautender Reihenfolge im Makro, erst nach der Unterbrechung durch die MsgBox aktualisiert.
Alternativ habe ich DoEvents eingesetzt. Bei mir reichen die 10 Durchläufe von DoEvents als Unterbrechung, damit das Diagramm vor der MsgBox aktualisiert wird.

Danke für Deine Erklärung! Dass DoEvents die Steuerung an das Betriebssystem übergibt und erst anschließend weiter abgearbeitet wird, hatte ich verstanden – was ich nicht verstehe ist aber, warum das Auswirkungen darauf hat, in welcher Reihenfolge die Befehle des Makros abgearbeitet werden (bzw. welche Befehle überhaupt – und wie – abgearbeitet werden). Warum läuft das Makro anders, wenn zuvor irgendwas im BS verarbeitet wird - was mit dem Inhalt des Makros wahrscheinlich erst mal gar nix zu tun hat?

Und warum wird mein Makro nicht in der Reihenfolge abgearbeitet, wie es das Makro vorgibt? Wozu schreibe ich denn überhaupt noch mein Makro in einer definierten Reihenfolge, wenn die Anwendung letztlich doch macht, was sie will? Das erschließt sich mir überhaupt nicht!

...und, ach ja, bei mir reichen die 10 Durchläufe nicht, um die Messagebox erst nach Aktualisierung des Diagramms aufzurufen... muss ich hier mit der Zahl der Durchläufe experimentieren? Was ist, wenn ich dann einen schnelleren (oder langsameren?) Rechner einsetze?

Alles irgendwie doch sehr sonderbar für mich.

Gruß und Dank,
RaiSta
Antworten Top
#6
Hallo RaiSta,

bitte verzichte auf das Zitieren ganzer Antworten. Das verbraucht nur unnötig viel Platz und bringt nichts.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#7
Hallöchen,

es gibt die eine oder andere Stelle, wo Excel angezeigte Objekte erst bei einer Codeunterbrechung auffrischt. Das ist nun nicht generell so und warum das so ist, ist vielleicht ein Geheimnis von MS.
Ja, und Du kannst die Anzahl der Schleifendurchläufe erhöhen.

Alternativ würde z.B. auch so ein Konstrukt gehen:

Code:
...
Application.OnTime Now + TimeValue("00:00:01"), "Meldung"
End Sub

Sub Meldung()
    MsgBox "Die Messwerte der gewählten Datei sind aktuell", _
        vbOKOnly, "Messwerte aktualisiert"
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#8
Hallo Klaus-Dieter,

ich habe auf jeden Abschnitt des Original-Posts Bezug genommen,
daher habe ich diesen diesmal komplett zitiert.

Im Übrigen hält sich der Ressourcenverbrauch beim digitalen Zitieren doch einigermaßen in Grenzen, daher kann ich auch aus dieser Sicht keine zwingende Notwendigkeit zum Kürzen erkennen.

Der Leser kann sich ja recht unaufwändig auf die Teile konzentrieren, die sie/ihn interessieren.

Gruß,
RaiSta

(20.11.2022, 10:39)schauan schrieb: Hallöchen,

es gibt die eine oder andere Stelle, wo Excel angezeigte Objekte erst bei einer Codeunterbrechung auffrischt. Das ist nun nicht generell so und warum das so ist, ist vielleicht ein Geheimnis von MS.
Ja, und Du kannst die Anzahl der Schleifendurchläufe erhöhen.

Alternativ würde z.B. auch so ein Konstrukt gehen: <...>

Hi Schauan,

Danke für Deine sehr konstruktiven Antworten!

...und den Hinweis auf die Geheimnisse von µS hatte ich befürchtet. Hinterlässt ein Gefühl der Hilflosigkeit, wenn programmieren dazu führt, dass ich raten muss, wie ich 'mein' Programm dazu kriege, so abzulaufen, wie ich es mir vorgestellt hatte. Insbesondere, wenn der automatisierte Ablauf ein anderer ist als der schrittweise. Insgesamt erinnert das doch sehr an die 'alten Zeiten', in der man mit NOPs und Zeitschleifen versuchte, Abläufe zu synchronisieren... Eigentlich dachte ich, das sei in Zeiten objektorientierter Programmierung obsolet...

Nun ja, Deinen Codevorschlag will ich dann mal in näheren Augenschein nehmen! Vielen Dank!

Gruß,
RaiSta
Antworten Top
#9
Hi RaiSta,
(25.11.2022, 15:56)RaiSta schrieb: Im Übrigen hält sich der Ressourcenverbrauch beim digitalen Zitieren doch einigermaßen in Grenzen, daher kann ich auch aus dieser Sicht keine zwingende Notwendigkeit zum Kürzen erkennen.
Es geht hier weniger um die Ressourcen beim Forumsbetreiber. Da machen die paar Bytes den Kohl wirklich nicht fett. Es geht eher um den Platzverbrauch auf dem Bildschirm. Vor allem wenn du dich sowieso auf jeden Abschnitt des Posts direkt vor die beziehst, ist ein Zitat vollkommen überflüssig - genau derselbe Text steht doch sowieso schon da.

Anders sieht es aus, wenn du dich auf einen einzigen Aspekt beziehst (so wie ich gier gerade), dann dient ein Zitat dem besseren Verständnis.

Wenn du dich auf einen älteren Beitrag beziehst, reicht es beim Bezug auf den ganzen Beitrag i.d.R. die Person anzusprechen. Nur wenn die Person zwischenzeitlich einen weiteren Beitrag geschrieben hat, und man sich auf einen ganzen älteren Beitrag dieser Person bezieht könnte man über ein Vollzitat nachdenken. Aber auch dann ist es besser sinnvoll zu kürzen.

Merke: Eine Notwendigkeit zum Kürzen ist so gut wie immer gegeben!
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
[-] Folgende(r) 2 Nutzer sagen Danke an HKindler für diesen Beitrag:
  • Klaus-Dieter, schauan
Antworten Top
#10
Hallo Helmut,

(27.11.2022, 11:01)HKindler schrieb: Hi RaiSta,
Es geht hier weniger um die Ressourcen beim Forumsbetreiber. Da machen die paar Bytes den Kohl wirklich nicht fett. Es geht eher um den Platzverbrauch auf dem Bildschirm. Vor allem wenn du dich sowieso auf jeden Abschnitt des Posts direkt vor die beziehst, ist ein Zitat vollkommen überflüssig - genau derselbe Text steht doch sowieso schon da.
[...]
Merke: Eine Notwendigkeit zum Kürzen ist so gut wie immer gegeben!
  • in den meisten meiner Beiträge bemühe ich mich um sinnerhaltende Kürzungen, sofern ich zitiere
  • da ich mich selber über leichte Erkennbarkeit der Sinnzusammenhänge (z.B. durch räumliche Nähe) freue, versuche ich, das den Lesern meiner Beiträge auch zu ermöglichen
  • aktuell scheitern meine Bemühungen leider oft noch an von mir nicht vollständig erfasster Funktionsweise der Forums-Software (Copy & Paste, mehrfaches Zitieren verschiedener Abschnitte eines Posts, etc.)
Mich wundert die hier stattfindende Fokussierung auf rein formale Aspekte statt inhaltlicher Beiträge. Erfahrungsgemäß hat das jedoch einige Nachteile:
  • Zeit wird verschwendet, ohne dass Beiträge zu Lösungen überhaupt auch nur angestrebt werden
  • aus diesen Vorwürfen werden schnell persönliche Anschuldigungen bis hin zu Beleidigungen
  • es handelt sich dabei oftmals erkennbar um Machtspielchen: wer definiert, wie sich geäußert werden darf; wer ist der Lehrer (Belehrende) und wer der bitteschön folgsame Schüler, etc.
  • insbesondere, wenn die geforderten Regeln eher undefiniert und eigentlich persönlichem Belieben unterworfen sind: Vorstufe zu Religionskriegen oder so
  • zumal niemand gezwungen wird, Beiträge zu lesen: lesen und antworten sind absolut freiwillige Aktivitäten

Stattdessen freue ich mich über hilfreiche Antworten, wenn meine Antworten anderen helfen, respektvoll miteinander umgegangen wird, auch wenn es Unterschiede in Ansichten gibt, etc. Eine inhaltlich vielleicht durchaus kontroverse, aber stets respektvolle Unterhaltung - das ist doch meines Erachtens Sinn und Zweck solcher Foren. Insbesondere der respektvolle Umgang - der ist doch Bestandteil so gut wie jedes Forums-Regelwerks in den Foren, in denen ich mich bewege...

In diesem Sinne: schönes Rest-WE!

Gruß,
RaiSta
Antworten Top


Gehe zu:


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