Clever-Excel-Forum

Normale Version: Gesamtcode so ausführen wie Einzelcodes(Diagrammsegmente einblenden)
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
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 :)
Hallo Julia,

kann ich für den Fall (Code ein wenig gekürzt)

(14.11.2017, 04: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?
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.
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?
Hallo

evtl.hilft DoEvents nach jedem Formeleintrag?
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, 22: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, 22: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).
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 einschaltet
muß 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
jo - danke, ich werde gleich das gleiche mit meinem Kopfkissen tun ;)

(16.11.2017, 01: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!
Hallöchen,

dann versuch mal, den Diagrammnamen einzusetzen und nicht den Index Smile
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
Seiten: 1 2 3