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.

Gesamtcode so ausführen wie Einzelcodes(Diagrammsegmente einblenden)
#1
Question 
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 :)
Antworten Top
#2
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?
Gruß Stefan
Win 10 / Office 2016
Antworten Top
#3
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.
Antworten Top
#4
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?
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

Grüße aus Norderstedt, Peter
[-] Folgende(r) 1 Nutzer sagt Danke an Käpt'n Blaubär für diesen Beitrag:
  • o0Julia0o
Antworten Top
#5
Hallo

evtl.hilft DoEvents nach jedem Formeleintrag?
Willie
[-] Folgende(r) 1 Nutzer sagt Danke an Willie017 für diesen Beitrag:
  • o0Julia0o
Antworten Top
#6
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).
Antworten Top
#7
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
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

Grüße aus Norderstedt, Peter
[-] Folgende(r) 1 Nutzer sagt Danke an Käpt'n Blaubär für diesen Beitrag:
  • o0Julia0o
Antworten Top
#8
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!
Antworten Top
#9
Hallöchen,

dann versuch mal, den Diagrammnamen einzusetzen und nicht den Index Smile
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#10
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)
Antworten Top


Gehe zu:


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