Registriert seit: 08.07.2016
Version(en): 2016
14.11.2017, 05:57
(Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2017, 05:57 von o0Julia0o.)
hi, ich blende so die Segmente eines Diagrammes wieder ein: Code: Sub DiagrammEinblenden() ActiveSheet.ChartObjects("Diagramm 1").Activate Application.Wait Now + TimeSerial(0, 0, 0.6) ActiveChart.ChartGroups(1).FirstSliceAngle = 285 ActiveChart.FullSeriesCollection(1).Points(1).Select With Selection.Format.Fill .Visible = msoTrue End With Application.Wait Now + TimeSerial(0, 0, 1) ActiveChart.FullSeriesCollection(1).Points(2).Select With Selection.Format.Fill .Visible = msoTrue End With Application.Wait Now + TimeSerial(0, 0, 1) ActiveChart.FullSeriesCollection(1).Points(3).Select With Selection.Format.Fill .Visible = msoTrue End With Application.Wait Now + TimeSerial(0, 0, 1) ActiveChart.FullSeriesCollection(1).Points(4).Select With Selection.Format.Fill .Visible = msoTrue End With Application.Wait Now + TimeSerial(0, 0, 0.6) ActiveChart.FullSeriesCollection(1).Points(5).Select With Selection.Format.Fill .Visible = msoTrue End With Application.Wait Now + TimeSerial(0, 0, 0.6) ActiveChart.FullSeriesCollection(1).Points(6).Select With Selection.Format.Fill .Visible = msoTrue End With End Sub
Das funktioniert. Jedoch wartet der die Gesamtwartezeit ab und zeigt erst dann alle Segmente. Also so als würde man das Diagramm einfach wieder komplett einblenden. Es sollen jedoch die einzelnen Segmente eingeblendet werden. Wenn ich nur einen Teil des Codes ausführe, dann zeigt der auch nur ein Element an z.B. Wenn ich dann jeden Segmentabschnitt in ein Makro tue und die per Call aufrufe, dann wartet der trotzdem nur ab und blendet alle gleichzeitig ein. Wie bekomme ich es hin, dass die einzelnen Segmente eingeblendet werden? So als wenn ich 6x den Teilcode manuell starten würde? Das identsiche Problem mit einem anderem Code: Code: Sub DiagrammTextEin() Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" Application.Wait Now + TimeSerial(0, 0, 1) Worksheets("Rech").Range("B5").FormulaLocal = "=" & "F4" Application.Wait Now + TimeSerial(0, 0, 0.6) Worksheets("Rech").Range("B6").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 0.6) Worksheets("Rech").Range("B7").FormulaLocal = "=" & "F3" Application.Wait Now + TimeSerial(0, 0, 0.6) Worksheets("Rech").Range("B8").FormulaLocal = "=" & "F4" Application.Wait Now + TimeSerial(0, 0, 0.6) End Sub
Auch hier wird wieder erst gewartet & dann auf einen Schlag der Text hinzugefügt. In F2 usw. stehen die Texte. Ich kann auch eine MsgBox-Ausgabe einschieben. Trotzdem wird der Text erst später eingeblendet: Code: Sub DiagrammTextEin() Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) MsgBox ("Hello") Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3"
lieben Dank! Julia :)
Registriert seit: 11.04.2014
Version(en): Office 2007
14.11.2017, 11:01
(Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2017, 11:01 von Steffl.
Bearbeitungsgrund: Ergäntz um die Frage
)
Hallo Julia, kann ich für den Fall (Code ein wenig gekürzt) (14.11.2017, 05:57)o0Julia0o schrieb: Das identsiche Problem mit einem anderem Code:
Code: Sub DiagrammTextEin() Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" Application.Wait Now + TimeSerial(0, 0, 1) End Sub
Auch hier wird wieder erst gewartet & dann auf einen Schlag der Text hinzugefügt. In F2 usw. stehen die Texte. nicht bestätigen. Es wird bei mir gewartet und Schritt für Schritt eingetragen. Übrigens TimeSerial erwartet Integerzahlen, das heißt deine Zahlen werden gerundet. Verwendest Du vielleicht ScreenUpdating?
Gruß Stefan Win 10 / Office 2016
Registriert seit: 08.07.2016
Version(en): 2016
14.11.2017, 21:26
(Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2017, 21:26 von o0Julia0o.)
hi Steffan :) oh, danke. Die Werte werden auch mit Unterbrechnung eingetragen. Aber das Diagramm, welches sich auf die Werte bezieht, wird erst aktualisiert, sobald das Makro beendet ist. In dem Fall sind die Werte Namen, und diese sind die Beschriftungen in dem Diagramm.
Die möchte ich nacheinander einblenden. Doch erst wenn alle durch das Makro in die Felder eingetragen wurden, erscheinen sie GLEICHZEITIG im Diagramm. Und nicht so wie sie eingetragen werden nacheinander in die Zellen(wo das Diagramm hinguckt für um die Namen zu übernehmen).
@ScreeenUpdating Application.ScreenUpdating = True oder False hätte ich ja dann irgendwo setzten müssen. Habe ich aber nirgends. Habe ich jetzt testweise beides mal vorweg gemacht. Aber das ändert nichts.
Registriert seit: 11.04.2014
Version(en): '97 bis 2016; 365
14.11.2017, 23:04
(Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2017, 23:15 von Käpt'n Blaubär.)
Hallo Julia, Zitat:Application.ScreenUpdating = True oder False hätte ich ja dann irgendwo setzten müssen. Habe ich aber nirgends. Habe ich jetzt testweise beides mal vorweg gemacht. Aber das ändert nichts. ... und, darf man Deinen derzeitigen Code mal besichtigen? Wenn Du den änderst, dann ist ja jeder davor gepostete Code Schnee von gestern. Zitat:Habe ich jetzt testweise beides mal vorweg gemacht. Toll, und wo? Wie sich das liest ... einmal oben im Code und einmal unten, nehme ich an. Meine Fragen dann: ... und warum wunderst Du Dich, wenn der Code genau das tut, was Du ihm sagst? und was heißt testweise?
Registriert seit: 09.09.2017
Version(en): O365
Hallo
evtl.hilft DoEvents nach jedem Formeleintrag?
Willie
Registriert seit: 08.07.2016
Version(en): 2016
16.11.2017, 01:46
(Dieser Beitrag wurde zuletzt bearbeitet: 16.11.2017, 01:46 von o0Julia0o.)
Das hilft leider auch nix: Code: Sub DiagrammTextEin() Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) DoEvents Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" DoEvents End Sub
(14.11.2017, 23:04)Käpt\n Blaubär schrieb: einmal oben im Code und einmal unten, nehme ich an. und was heißt testweise? Mit Testweise meinte ich, dass ich Application.ScreenUpdating = True bzw. Application.ScreenUpdating = False je einmal vor den Code geschrieben habe, um zu testen, ob es etwas nützt. Selbst wenn ich es irgendwo angestellt hätte, wäre es ja dann deaktiviert für den folgecode. Ich hatte es einmal so getestet: Code: Sub DiagrammTextEin() Application.ScreenUpdating = True Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" End Sub
Und 1x so: Code: Sub DiagrammTextEin() Application.ScreenUpdating = False Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" End Sub
(14.11.2017, 23:04)Käpt\n Blaubär schrieb: Meine Fragen dann: ... und warum wunderst Du Dich, wenn der Code genau das tut, was Du ihm sagst? Wenn ich den Code aufsplitte in 1.: Code: Sub DiagrammTextEin() Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) End Sub
Und 2.: Code: Sub DiagrammTextEin() Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" Application.Wait Now + TimeSerial(0, 0, 1) End Sub
...wird das Diagramm(welches die Bezeichnungen aus Rech B3 und Rech B4 bezieht nacheinander mit den Bezeichnungen ausgestattet. Die Bezeichnungen werden also anezeigt, sobald in B3 ein Wert steht. Und sobald in B4 ein Wert steht. Wenn ich den Code aber samt Pause zwischen den einträgen in B3 und B4 ausführe, dann wird solange gewartet bis der Code im gesamten ausgeführt wurde & erst danach das Diagramm aktualisiert(also die Bezeichnungen von B3 und B4 dort sichtbar -> auf einen Schlag).
Registriert seit: 11.04.2014
Version(en): '97 bis 2016; 365
Hallo Julia, Du stellst hier mehrere Codes vor, die alle den gleichen Namen aber unterschiedliche Inhalte haben. Zitat:Sub DiagrammTextEin() ist da jeweils das gleiche Makro mit unterschiedlichen Codes um zu zeigen, was Du alles versucht hast, Dein Problem zu lösen oder stehen diese Makros tatsächlich quasi untereinander? Im ersten gezeigten Makro Zitat:Sub DiagrammTextEin() Application.ScreenUpdating = True Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" End Sub Schaltest Du dann oben Application.ScreenUpdating = True also ein. Das hätte aber nur dann einen Sinn, wenn dieses Makro beispielsweise von einem anderen Makro aufgerufen wurde, welches in Application.ScreenUpdating = False - Zustand, also dem Aus-Zustand verlassen wurde. Jedenfalls so wie Du den Code hier vorstellst, schaltest Du ein eingeschaltetes ScreenUpdating noch einmal ein, machst also im Grunde gar nichts und damit ist diese Zeile absolut überflüssig. Im zweiten gezeigten Code Zitat:Sub DiagrammTextEin() Application.ScreenUpdating = False Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" End Sub steht das Application.ScreenUpdating = False zwar an einer plausiblen Stelle, Du vergißt aber im weiteren Codeverlauf, es wieder einzuschalten. Im Grunde gilt bei VBA und eigentlich auch in jeder anderen Programmiersprache, was man einschaltetmuß man zwingend auch wieder ausschalten und umgekehrt.Tut man das nicht, dann kann man ganz, ganz bitterböse Überraschungen erleben. Das kann sich auch auf andere Dateien übertragen ... eine bittere Erfahrung, die ich als Anfänger auch gemacht habe. Das ist eben zu zahlendes Lehrgeld :22: Darum hier nochmal Dein Makro mit korrektem ScreenUpdating Zitat:Sub DiagrammTextEin() Application.ScreenUpdating = False ' AUSschalten der Bildschirmwiederholung Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Wait Now + TimeSerial(0, 0, 1) Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" Application.ScreenUpdating = True ' EINschalten der Bildschirmwiederholung End Sub Ich bin in diesem Posting nur auf das ScreenUpdating eingegangen. Um den restlichen Codeinhalt habe ich mich bisher noch nicht weiter gekümmert. Aber nun will ich erst mal dringend erkunden, was mir mein Kopfkissen in's Öhrchen flüstern will. Bis morgen, also A Gut's Nächtle
Registriert seit: 08.07.2016
Version(en): 2016
16.11.2017, 03:24
(Dieser Beitrag wurde zuletzt bearbeitet: 16.11.2017, 03:24 von o0Julia0o.)
jo - danke, ich werde gleich das gleiche mit meinem Kopfkissen tun ;) (16.11.2017, 02:51)Käpt\n Blaubär schrieb: ist da jeweils das gleiche Makro mit unterschiedlichen Codes um zu zeigen, was Du alles versucht hast, Dein Problem zu lösen genau so ist es. Und einschalten brauche ich nicht, da ich die Datei nicht speicher, da es ja nix gebracht hat. Ich habe noch folgendes entdeckt: https://msdn.microsoft.com/de-de/VBA/Excel-VBA/articles/refresh-method-graph Doch ich verstehe die Anwendung nicht. Excel sagt mir dann stets: Laufzeitfehler 9 -> "Index außerhalb des gültigen Bereichs": Code: Sub DiagrammTextEin() Worksheets("Rech").Range("B3").FormulaLocal = "=" & "F2" Application.Charts(1).Refresh Application.Wait Now + TimeSerial(0, 0, 1) Worksheets("Rech").Range("B4").FormulaLocal = "=" & "F3" End Sub
Das Diagramm heißt: "Diagramm 1". Das Makro wird von dem Tabellenblatt aus gestartet, wo sich auch das Diagramm befindet. Gute Nacht!
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallöchen, dann versuch mal, den Diagrammnamen einzusetzen und nicht den Index
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
Hallo Käpten Peter! Du hast natürlich Recht, wenn Du in den Raum stellst, dass alle Änderungen des default wieder zurückgestellt werden sollten. Ich schreibe absichtlich sollten und nicht müssen, weil VBA eigentlich keine "echte" Programmiersprache ist. Sie verzeiht (zu) viele "Anfängerfehler". Unter anderem setzt VBA das ScreenUpdating selbständig nach Ablauf des Makros auf True zurück. Ähnliches gilt für .DisplayAlerts und einigen anderen.
Aber dies sind nur zwei Cents, Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
|