Autor
|
Thema: Diagramm: Achsen skalieren (22907 mal gelesen)
|
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 25. Feb. 2009 17:32 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe ein Diagramm mit 2 y-Achsen erstellt. Nun möchte ich, dass die gemeinsame x-Achse beide y-Achsen bei "0" schneidet. Gleichzeitig soll die Skalierung beider Y-Achsen dynamisch sein, d.h. wenn sich der max. Wert z.B. von 90 auf 200 ändert, soll sich die Skalierung automatisch anpassen. Zu diesem Zweck setzt man ja normalerweise bei "Achse formatieren-Skalierung" das Häkchen vor Kleinst-/Größtwert, dann paßt sich die Skalierung automatisch an. Nur ist es dann bei mir so, dass die x-Achse nicht beide Achsen bei 0 schneidet (siehe Beispielmappe erstes Diagramm). Es gibt noch die Möglichkeit "Größenachse x schneidet bei" einzustellen. Aber obwohl ich hier bei beiden Y-Achsen "0" eingebe, schneiden nicht beide Achsen bei 0. Und gleich noch ein zweites Problem: die x-Achse soll sich ebenfalls dynamisch ändern. Da der Haken bei "Achse formatieren-Skalierung" gesetzt ist funktioniert das auch. Aber die Skalierung der Achse wird von Excel immer etwas größer gewählt, als der max. x-Wert. Z.B. wenn xmax=4 --> Skalierung geht bis 4,5. Wenn xmax=50 --> Skalierung geht bis 60. Kann man Excel beibiegen, dass die Skalieung nur exakt bis 4 bzw. 50 gehen soll? ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 25. Feb. 2009 21:25 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Zitat: Nur ist es dann bei mir so, dass die x-Achse nicht beide Achsen bei 0 schneidet (siehe Beispielmappe erstes Diagramm). Es gibt noch die Möglichkeit "Größenachse x schneidet bei" einzustellen. Aber obwohl ich hier bei beiden Y-Achsen "0" eingebe, schneiden nicht beide Achsen bei 0.
Irgendwie hat sich auch die 2te Y-Achse sich auch noch nicht ersten Y-Achse vorgestellt, bzw. sich untereinander Bekannt gemacht, darum kommen sie auch nicht auf einen gemeinsamen Nenner, äh Null... - Will sagen, beide Achsen wissen von einander nichts ;) Somit braucht es Hilfe von Aussen. Formeln scheiden IMHO aus, bleibt nur Vba übrig. Grob: Wie gehe ich vor. Makroaufzeichnung Starten, Y1-Achse auf Auto Stellen, Y2 Achse min/Max Werte verändern. Die Aufzeichnung beenden. Ein wenig in den Code reinblicken, mir F8 schrittweisse ablaufen lassen, lesen verstehen und ausprobieren, grübeln, wie komme ich an die Y2.MinimumScale, Y2.MaximumScale Werte heran... wenn herausgefunden, diese Werte in Variablen schreiben, Y2min, und Y2max Nun noch eine mathematische Neuskalierung der Y1 Werte anhand der Y2 Werte Zurückschrieben der Werte in die Y1-Achse... Untenstehend ein VBA wie es funktioniert - ist bezogen auf deine Mappe/Diagramm. nur die Berechnung der Neuskalierung Der Y1 Achse mache ich nicht ;-) Weihnachten war schon und bis Ostern ist es noch eine Weile ;-) -Obwohl für Ostern gilt ja eher wer suchet der Findet ;) Egal - Deswegen stehen da Dummy-Werte Das ist dann eine Arbeit die du machen müsstest, die Neuskalierung der Werte. Ich habe bis auf das Ausdokumentierte nichts gross an der Makroaufzeichnung geändert, Nur die Select Anweisung, die braucht man hier nicht. ...und einige Deklarationen wie die Achsen Auszusehen haben, Würde ich auch noch rauswerfen ;) Hoffe irgendwie geholfen zu haben ,) Code: Sub Makro1()'Y1 ActiveSheet.ChartObjects("Diagramm 3").Activate With ActiveChart.Axes(xlValue) .MinimumScaleIsAuto = True .MaximumScaleIsAuto = True .MinorUnitIsAuto = True .MajorUnitIsAuto = True .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone Y1min = .MinimumScale 'bevor wir hier rausgehen, holen wie noch schnell die min-Max Werte ;- Y1max = .MaximumScale ' End With 'Y2 ActiveChart.Axes(xlValue, xlSecondary).Select With ActiveChart.Axes(xlValue, xlSecondary) .MinimumScaleIsAuto = True .MaximumScaleIsAuto = True .MinorUnitIsAuto = True .MajorUnitIsAuto = True .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone ' und auch hier die Werte nicht vergessen ;-) Y2min = .MinimumScale Y2max = .MaximumScale End With 'es folgen nun Rechenoperationen, die Y1min/max an die Werte von Y2min/max anpassen NeuerY1MinimWert = Rechenoperation ' von Y1min und Y2min... NeuerY1MaximumWert = Rechenoperation ' von Y1max und Y2max... NeuerY1MinimWert = -100 ' Dummy zum testen des Ablaufes NeuerY1MaximumWert = 100 ' Dummy zum testen des Ablaufes 'Y1 ActiveSheet.ChartObjects("Diagramm 3").Activate ActiveChart.Axes(xlValue).Select With ActiveChart.Axes(xlValue) .MinimumScale = NeuerY1MinimWert 'Zurückschreiben .MaximumScale = NeuerY1MaximumWert 'Zurückschreiben .MinorUnitIsAuto = True .MajorUnitIsAuto = True .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone End With End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 26. Feb. 2009 16:38 <-- editieren / zitieren --> Unities abgeben:
Zunächst mal Danke für den ausführlichen VBA-Code. Ich hatte gehofft es geht auch ohne, denn von VBA hab ich soviel Ahnung wie ne Kuh vom tanzen , aber Du hast ja schon gut vorgearbeitet Ich hab den Code mal in meine Beispielmappe reinkopiert und die Rechenoperation ergänzt. Wenn ich das Makro nun ausführe kommt immer die Fehlermeldung "Laufzeitfehler 438: Objekt unterstützt diese Methode oder Eigenschaft nicht" und zwar in der Zeile
Code:
.DisplayUnit = xlNone
Kannst Du mir vielleicht einen Tipp geben, was die Ursache dafür ist? Mit den Infos von Herrn google zu diesem Fehler komm ich leider nicht weiter. Es hängt wohl mit der von Dir angesprochenen "select Anweisung" zusammen? Zitat:
Irgendwie hat sich auch die 2te Y-Achse sich auch noch nicht ersten Y-Achse vorgestellt, bzw. sich untereinander Bekannt gemacht, darum kommen sie auch nicht auf einen gemeinsamen Nenner, äh Null... - Will sagen, beide Achsen wissen von einander nichts
Die Eingabemöglichkeit "Größenachse x schneidet bei: 0" sollte aber meinem Verständnis nach genau die Funktionalität erfüllen, die hier jetzt mühsam per VBA gebastelt wird. Es scheint aber nur solange zu funktionieren, wie mit nur einer Y-Achse gearbeitet wird und nicht mit 2 (Zumindest bei Excel97, vielleicht hat Excel bei den neueren Versionen ja dazugelernt). ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 26. Feb. 2009 19:07 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
... also deine Mappe läuft einwandfrei auf XL 2003 lasse einfach .DisplayUnit = xlNone weg, das kennt Das 97 Excel wohl noch nicht und auch Xl2003 stört es nicht wenn die zeile nicht existiert. '.DisplayUnit = xlThousands aka Einheiten anzeigen aus dem Achsenformatiermenue Mit der Select Anweisung hat das nicht zu zutun, die entsteht weil User ja ein Element auswählt mit Maus/Taste, das ist das Select. Da das Makro aber eh Diagramm3 Aktiv setzt und auch zwischenzeitlich im Ablauf nicht anderes Fokusiert wird, sind diese Selektanweisungen in fast allen Fällen überflüssig, irgendjemand sagte mal er kenne nur 2 Fälle wo die selectanweisung unabdingbar wäre Zitat: Die Eingabemöglichkeit "Größenachse x schneidet bei: 0" sollte aber meinem Verständnis nach genau die Funktionalität erfüllen, die hier jetzt mühsam per VBA gebastelt wird
Nein! Richtig lautet es Grössenachse (X) schneidet bei und zwar ist die X- Achse gemeint die zu Der Y - Achse gehört. das Betrifft die (PrimärAchse!) ;-) Deine 2 Werte Reihe (Secundärachse!) hat eine eigene Y-Achse und auch eine eigene X - Achse. auch wenn diese X-Achse die selbe Skalierung ausweist wie X- Achse aus der Primären Achse siehe Bild 2 X und 2 Y achsen ,) und mühsam ist was anderes und schön das du das mit der Umskalierung per Code hinbekommen hast ;-)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 26. Feb. 2009 20:03 <-- editieren / zitieren --> Unities abgeben:
Super jetzt funktioniert es bei mir auch. Zitat: ...und schön das du das mit der Umskalierung per Code hinbekommen hast ;-)
..ja, ich bin auch mächtig stolz auf mich. Und wo ich jetzt schon mal blut geleckt habe versuche ich das ganze noch etwas nach meinen Vorstellungen auszugestalten. ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 27. Feb. 2009 19:08 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe an dem Makro noch etwas rumgespielt und versucht, es automatisch starten zu lassen, wenn sich ein eingegebener Wert in einer Zelle (hier B1) ändert. Hier der Code: Code:
Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("B1") Then Application.Run "Skalierung_yAchse_anpassen" End If End Sub
Der funktioniert in der angehängten Testmappe auch einwandfrei. Nur wenn ich den Code in meine richtige Mappe kopiere, erhalte ich dort die Fehlermeldung "Laufzeitfehler 13: Typen unverträglich" und zwar in der Zeile Code:
If Target = Range("B1") Then
Die richtige (fehlerverursachende) Mappe kann ich leider nicht hochladen, aber hat vielleicht trotzdem jemand eine Ahnung was diesen Fehler verursachen könnte? Andere Makros o.ä. enthält die Mappe nicht. Des weiteren möchte ich für den automatischen start nicht nur eine einzelne Zelle (hier B1) abfragen sondern einen Bereich. Etwa in der Art:
Code:
If Target = Range("B1:C3") Then
Aber auch hier kommt der gleiche Laufzeitfehler (schon in der Testmappe). Beim Range-Befehl können doch nicht nur einzelne Zellen angegeben werden sondern auch Zellbereiche, also was mache ich falsch? ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 27. Feb. 2009 19:59 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
|
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 27. Feb. 2009 23:49 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Beispiel mappe lauft einwandfrei, kann es dann an verbundenen Zellen liegen? Ne Abwandlung von Rübes Vorschlag
Code: Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B1:B3")) Is Nothing Then Exit Sub Skalierung_yAchse_anpassen End Sub
@Rübe, Na jünger würde ich es so nicht bezeichnen, es war beim Facelifting ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 28. Feb. 2009 13:14 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von runkelruebe: hilft das mit dem Intersect?
Zitat: Original erstellt von Thomas Harmening: ...kann es dann an verbundenen Zellen liegen?
2xTreffer versenkt. Wenn ich die verbundenen Zellen trenne läuft mein eigener code ohne Fehlermeldung und mit dem intersect kann ich auch Zellbereiche ansprechen. Da ich die Zellen aber nicht trennen will nehme ich natürlich den code von Thomas bzw. den von Rübe, die beide auch mit verbundenen Zellen funktionieren. Somit Problem gelöst, Danke und Üs. ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 28. Feb. 2009 13:43 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Auch wenn es mit Intersect funktioniert, sind verbunden Zellen immer ein lästiges Schmakerl, sofern diese Zellen für weitere Formeln herhalten müssen, und daher zu vermeiden. - Alternativ diese Zelle über Auswahl zentriert formatieren wenn es denn unbedingt sein muss -aber ich denke immer, Excel ist kein Präsentations Programm - rechen muss es Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 28. Feb. 2009 14:00 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Hi Stefan, damit die X-Achse die Y-Achse genau in der Mitte schneidet, benötigt man kein VBA. Es reicht aus, eine zusätzliche Datenreihe aus einem Datenpunkt für jede der beiden Y-Achsen zu erstellen, die den Wert =-MAX(B7:B11) für die primäre und =WENN(ABS(MIN(C7:C11))>MAX(C7:C11);-MIN(C7:C11);-MAX(C7:C11)) für die sekundäre Y-Achse haben. Bei der Anpassung der X-Achse ist Excel ja leider stur , das geht eben nur mit VBA. Dazu hier ein Code (angepasst an deine Beispielmappe und bezogen auf das obere der beiden Diagramme): Code: Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A7:C11")) Is Nothing Then If Target.Count = 1 Then ActiveSheet.ChartObjects(1).Chart.Axes(xlCategory).MaximumScale = _ Application.WorksheetFunction.Max(Range("A7:A11")) End If End Sub
------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 28. Feb. 2009 19:38 <-- editieren / zitieren --> Unities abgeben:
Danke Beverly, das Makro für die x-Achse hilft mir weiter. Ich habe selbst auch schon dran rumgetüftelt, aber ich hatte es noch nicht am laufen. Dank Deiner Hilfe läuft es jetzt. Die Formellösung für die Y-Achse ist wie immer sehr trickreich von Dir. In meinem Fall muss die x-Achse die beiden y-Achsen jedoch nicht unbedingt mittig schneiden, sondern nur auf der gleichen Höhe. Wenn die negativen Werte z.B. weitaus kleiner sind als die positiven dann verschenke ich bei dieser Formelvariante einen Großteil des Anzeigebereichs. Da ich für die x-Achse eh eine VBA-Lösung brauche bleibe ich deshalb auch für die y-Achse dabei (außerdem hat mich jetzt der Ehrgeiz gepackt ). Trotzdem vielen Dank für die Formel. @runkelrübe: Du hattest mich freundlicherweise darauf hingewiesen, dass man in Excel97 ein Diagramm möglichst nicht erst aktivieren und über ActiveChart verändern soll, sondern direkt darauf zugreifen sollte. Genau dies möchte ich tun, denn wenn ich mein Excel-Tabellenblatt (mit dem zwischenzeitlich lauffähigen Makro) kopiere läuft auf demkopierten Tabellenblatt mein Makro nicht mehr und VBA meckert immer die erste Zeile mit dem activate an (siehe Codeauszug):
Code: 'Y1 ActiveSheet.ChartObjects("Diagramm 3").Activate With ActiveChart.Axes(xlValue) .MinimumScaleIsAuto = True .MaximumScaleIsAuto = True Y1min = .MinimumScale 'min-max Werte auslesen Y1max = .MaximumScale End With
Deshalb denke/hoffe ich, dass es an dem aktivieren liegt.Ich habe versucht das aktivieren wegzulassen und den code wie folgt abzuändern: Code: 'Y1 ActiveSheet.ChartObjects ("Diagramm 3") ActiveSheet.ChartObjects("Diagramm 3").Chart.Axes(xlValue).MinimumScaleIsAuto = True ActiveSheet.ChartObjects("Diagramm 3").Chart.Axes(xlValue).MaximumScaleIsAuto = True Y1min = ActiveSheet.ChartObjects("Diagramm 3").Chart.Axes(xlValue).MinimumScale Y1max = ActiveSheet.ChartObjects("Diagramm 3").Chart.Axes(xlValue).MaximumScale End
aber ohne Erfolg. Könntest Du mir eventuell anhand meines Codeauszug das direkte ansprechen eines Diagramms zeigen? Ich hab schon etliche Synatxvarianten durchprobiert aber es will nicht so recht klappen und in dem von Dir genannten file QUELLE (pdf) finde ich leider auch nicht den richtigen Syntaxansatz.PS: wieso funktioniert eigentlich der Makrostart mit dieser sub Code: Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B5:B9")) Is Nothing Then Application.Run "Skalierung_yAchse_anpassen" End If End Sub
nur dann, wenn man in eine der Zellen B5 bis B9 einen Zahlenwert durch direkte Werteingabe ändert und nicht, wenn der Wert einer der Zellen mittels Formel neu berechnet wird (siehe Beispielmappe)?PPS: rein interessehalber: ist der Makroname "Worksheet_Change" eigentlich obligatorisch, wenn ein Makro durch eine Eingabe im sheet gestartet werden soll? Ich hatte anfangs 2 getrennte subs für x und y Achse. Da dann logischerweise der identische Name von VBA moniert wurde wollte ich eine davon unbenennen, was aber ebenfalls moniert wurde. Deshalb habe ich gezwungenermaßen beide zusammengepackt. ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 28. Feb. 2009 20:38 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
N'Abend Stefan, Hmm,leider kommen wir damit wieder zu: Ich kann es nicht testen, ich habe kein XL97. Bei mir (XL2007) läuft es durch. Ich habe Deine Mappe genommen, das vorh. sheet kopiert und Zelle B5 geändert. -> Makro läuft durch [kontrolliert einfach nur durch gesetzten Haltepunkt, nicht ob es wirklich das tut, was es soll, so tief wollte ich nicht einsteigen ;-)] Ich persönlich bin kein Freund von ActiveSheet, ich lege den Sheet-Index lieber hart fest oder nutze den Namen. Vielleicht kannst Du daraufhin irgendwie ändern (z.B. durch Übergabe des Namens an die Sub, aber auch hier: ob es daran wirklich liegt: keine Ahnung) Wie komme ich darauf? : Da Du ja weiter unten schreibst, "wenn der Wert einer der Zellen mittels Formel neu berechnet wird" => Du bist während des Ansprechen der Sub Skalierung_yAchse_anpassen() aber auch ganz bestimmt auf dem richtigen sheet? Zitat: Könntest Du mir eventuell anhand meines Codeauszug das direkte ansprechen eines Diagramms zeigen
ich versuche es (auch direkt mal ohne ActiveSheet, aber noch fest auf Sheet(2) bezogen): Code: With Sheets(2).ChartObjects("Diagramm 3").Chart.Axes(xlValue) .MinimumScaleIsAuto = True .MaximumScaleIsAuto = True .MinorUnitIsAuto = True .MajorUnitIsAuto = True .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear Y1min = .MinimumScale 'min-max Werte auslesen Y1max = .MaximumScale End With
Zitat: rein interessehalber: ist der Makroname "Worksheet_Change" eigentlich obligatorisch, wenn ein Makro durch eine Eingabe im sheet gestartet werden soll?
Ja, das ist "ein von Excel vergebener" Name, sie reagieren auf bestimmte Ereignisse der Datei und sind somit zwingend vorgeschrieben. Es gibt noch weitere ähnlich arbeitende: z.B.: Private Sub Worksheet_Activate() Private Sub Worksheet_Calculate() Private Sub Worksheet_SelectionChange(ByVal Target As Range) Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) u.s.w. Ähnlich beim Workbook (DieseArbeitsmappe): Private Sub Workbook_Open() Private Sub Workbook_BeforeClose(Cancel As Boolean) Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) u.v.m. Und das beantwortet dann vielleicht auch die Frage: Zitat: wieso funktioniert eigentlich der Makrostart mit dieser sub Worksheet_Change nur dann, wenn man in eine der Zellen B5 bis B9 einen Zahlenwert durch direkte Werteingabe ändert und nicht, wenn der Wert einer der Zellen mittels Formel neu berechnet wird (siehe Beispielmappe)?
Da könnte dann Worksheet_Calculate greifen, Achtung: gilt bei jedem neu durchrechnen, könnte die ganze Mappe ausbremsen. Um das zu umgehen siehe z.B.: http://www.herber.de/forum/archiv/820to824/t820362.htm Zitat: Ich hatte anfangs 2 getrennte subs für x und y Achse.
die dürftest Du auch weiterhin haben, das bedarf eben der Anpassung im oberen Teil: Beispiel:
Code: Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B5:B9")) Is Nothing Then Application.Run "Skalierung_yAchse_anpassen" Else If Not Intersect(Target, Range("C5:C9")) Is Nothing Then MsgBox "Y2-Achse" End IfEnd If End Sub
Ich hoffe, ich konnte auch mit meinem gelifteten XL ein paar Deiner Fragen klären. Wenn nicht: immer weiter fragen, die community ist groß, taucht schon noch wer mit Ahnung auf ;-) ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info Excel -Suche RuA-Suche FAQ-ACAD Hilfe zu CAD.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 28. Feb. 2009 21:55 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Zitat: Original erstellt von stefga: Genau dies möchte ich tun, denn wenn ich mein Excel-Tabellenblatt (mit dem zwischenzeitlich lauffähigen Makro) kopiere läuft auf demkopierten Tabellenblatt mein Makro nicht mehr und VBA meckert immer die erste Zeile mit dem activate an (siehe Codeauszug):
Code: ActiveSheet.ChartObjects("Diagramm 3").Activate
hmm, lass mich raten... durch das kopieren hat das Diagramm nun eine andere Bezeichnung bekommen? Und das Script will ja Diagramm 3 aktivieren? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 28. Feb. 2009 22:43 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Hi, wenn sich Werte aus Formeln ergeben ist der günstigste Weg, diejenigen Zellen im Worksheets_Change Ereignis zu überwachen, die Einfluss auf die Formel haben - in der Beispielmappe A1. Da das Worksheet_Change Ereignis immer im aktiven Tabellenblatt ausgeführt wird, kann für die Achsenskalierung des Diagramms in diesem Fall immer ActiveSheet verwendet werden, man muss sich also nicht auf den Tabellennamen als solchen beziehen. Es nicht immer günstig, das Diagramm direkt mit seinem Namen anzusprechen, denn wenn das Tabellenblatt kopiert wird, ändert sich der Diagrammname automatisch. Besser ist es in diesem Fall, den Diagrammindex zu verwenden anstelle des Namen (s. mein Beispiel). Ein Teil des Codes kann weggelassen werden, denn der Markorekorder zeichnet auch Standardeinstellungen auf. Das betrifft die folgenden Zeilen: Code: .MinimumScaleIsAuto = True .MaximumScaleIsAuto = True .MinorUnitIsAuto = True .MajorUnitIsAuto = True .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear
------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 28. Feb. 2009 22:47 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
|
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 01. Mrz. 2009 09:59 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Moin Beverly, Zitat: denn wenn das Tabellenblatt kopiert wird, ändert sich der Diagrammname automatisch
Blöde Frage, weil ich's grade so nicht nachvollziehen kann: welchen Namen meinst Du denn? Dann wohl nicht Sheets( Index).Shapes(1).Name ? Und auch nicht der, der oben im Namensfeld steht, wenn man das Diagramm anklickt? Ich steh leider grade voll auf der Leitung Bei mir sind die beide "Chart 3" ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info Excel -Suche RuA-Suche FAQ-ACAD Hilfe zu CAD.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 01. Mrz. 2009 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
|
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 01. Mrz. 2009 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Und jetzt wird es spassig: Selbst dann heißen beide "Chart 3", egal wie oft ich die kopiere: immer "Chart 3" Das hab ich gestern schon nicht begriffen, weil ich dachte, das darf gar nicht sein.... Ein nächstes neu erstelltes heißt "Diagramm 3" jedes weitere wird "ordnungsgemäß" hochgezählt. Kopiere ich dagegen diese neu erstellten, wird ebenfalls "normal" hochgezählt. Was'n das jetzt schon wieder ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info Excel -Suche RuA-Suche FAQ-ACAD Hilfe zu CAD.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 01. Mrz. 2009 15:15 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
das kann ich nicht nachvollziehen. Wenn in einem Tabellenblatt ohne Diagramm ein Diagramm erstellt wird, heißt es "Diagramm 1". Wird es kopiert, erhält es den Namen "Diagramm 2". Ein im selben Tabellenblatt daraufhin neu erstelltes oder kopiertes Diagramm heißt "Diagramm 3". Löscht man ein beliebiges von den vorhandenen, wird das nächste erstellte Diagramm dennoch "Diagramm 4" genannt obwohl nur noch 2 vorhanden sind. Excel zählt intern für jedes Tabellenblatt immer weiter. ------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 01. Mrz. 2009 15:19 <-- editieren / zitieren --> Unities abgeben:
Also ich bin begeistert von den vielen Rückmeldungen und bin schon den ganzen Nachmittag am abarbeiten der vielen Tips: Zitat: Original erstellt von Thomas Harmening: hmm, lass mich raten... durch das kopieren hat das Diagramm nun eine andere Bezeichnung bekommen? Und das Script will ja Diagramm 3 aktivieren?
Nein, ausnahmsweise daneben. Auf den korrekten Diagrammnamen habe ich geachtet. In meiner richtigen Mappe bleibt der Diagrammname beim kopieren der Tabellenblätter identisch und somit muss ich im Makro den Aufrufenamen nicht ändern. In meiner hochgeladenen Beispielmappe muss ich zugeben, dass sich der Diagrammname beim kopieren des Tabellenblattes von "Diagramm 3" zu "Diagramm 1" ändert (wieso auch immer dies so ist. Vermutlich fängt Excel bei einem neuen Tabellenblatt mit der Diagrammnummerierung wieder bei 1 an? Aber dann müßte sich eigentlich auch in meiner Haupmappe der Name beim kopieren des Blattes ändern. Dies bringt mich zu der Frage, ob man den Diagrammnamen im Bedarfsfall auch selbst beeinflussen kann? Vermutlich gehts mit VBA;) , aber ich schweife ab...und hätte Beverlys Beitrag zum Diagrammindex auch gleich lesen sollen). Aber auch wenn ich in der Beispielmappe den Diagrammnamen im Makro in "Diagramm 1" ändere, läuft das Makro auf diesem Blatt nicht (bzw. es kommt immer ein Laufzeitfehler und eben die Zeile mit dem activate wird im VBA editor gelb markiert). Ich habe zwischenzeitlich aber festgestellt, wenn ich die Mappe nach dem kopieren eines Tabellenblattes zuerst speichere und dann erst das Makro laufen lasse funktioniert es! (warum auch immer, der Diagrammname ist jedenfalls vor und nach dem speichern der selbe). Noch besser ist es aber, wenn ich wie gedacht auf das aktivieren des Diagramms verzichte. Wenn ich, wie von rübe gezeigt, auf das activechart verzichte funktioniert es nähmlich (auch ohne vorheriges Speichern) einwandfrei. Wenn ich dann noch das activesheet wieder einfüge (damit es auf allen Tabellenblättern läuft) und den Diagrammnamen dank Beverlys Tip durch den Index ersetzte kommt folgendes raus: Code:
With ActiveSheet.ChartObjects(1).Chart.Axes(xlValue) .MinimumScaleIsAuto = True .MaximumScaleIsAuto = True .MinorUnitIsAuto = True .MajorUnitIsAuto = True .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear Y1min = .MinimumScale 'min-max Werte auslesen Y1max = .MaximumScale End With
Und damit läuft es wie gewünscht! @beverly:
Zitat: Es nicht immer günstig, das Diagramm direkt mit seinem Namen anzusprechen, denn wenn das Tabellenblatt kopiert wird, ändert sich der Diagrammname automatisch. Besser ist es in diesem Fall, den Diagrammindex zu verwenden anstelle des Namen (s. mein Beispiel).
Woher kenne ich diesen Index (in meinem Beispiel habe ich durch ausprobieren rausgefunden das es in meinem Fall (1) war, aber was mache ich wenn ich mehrere Diagramme habe? Ich kenne bisher nur den Diagrammnamen (indem ich ihn mir per Kopf/Fußzeile anzeigen lasse, oder geht das auch komfortabler?) Zitat: wenn sich Werte aus Formeln ergeben ist der günstigste Weg, diejenigen Zellen im Worksheets_Change Ereignis zu überwachen, die Einfluss auf die Formel haben
Ok, aber in meinem Fall finde ich es günstiger die per Formeln erzeugte Wertetabelle, aus der das Diagramm letztendlich erzeugt wird, zu überwachen, da es mühsam/fehleranfällig ist alle Zellen zu erfassen, die Einfluss auf die Formeln haben (sind etliche Zellen bei mir). Deshalb werde ich bei gelegenheit mal noch den Tipp von rübe mit "worksheet_calculate" ausprobieren. @all: Zitat: Wenn nicht: immer weiter fragen, die community ist groß, taucht schon noch wer mit Ahnung auf ;-)
...ich glaube der/die ist/sind schon lange anwesend. Danke mal wieder. ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 01. Mrz. 2009 15:56 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Hi Stefan, die Diagrammnamen kannst du dir noch auf andere Weise anzeigen lassen: 1. Rechtsklick auf das Diagramm -> Diagrammfenster. Da steht dann der Diagrammname einschließlich Arbeitsmappen- und Tabellenname 2. Diagramm bei gedrückter Shift-Taste markieren, dann wird der Name links oben im Namensfenster angezeigt wo sonst nur "Diagrammfläc...." zu sehen ist. Zitat: Deshalb werde ich bei gelegenheit mal noch den Tipp von rübe mit "worksheet_calculate" ausprobieren.
Du solltest dabei bedenken, dass bei Verwendung dieses Ereignisses die Neuberechnung immer ausgeführt wird, gleichgültig in welcher Formel sich ein Ergebnis ändert - also auch in anderen die nicht mit dem Diagramm verbunden sind. Wenn du sehr viele Formeln in deinem Tabellenblatt hast, bremst dies natürlich. Um den Diagrammindex zu ermitteln kannst du diesen Code im Einzelschrittmodus ablaufen lassen [code]Sub diagrammindex() Dim inDiagramm As Integer For inDiagramm = 1 To ActiveSheet.ChartObjects.Count ActiveSheet.ChartObjects(inDiagramm).Activate MsgBox inDiagramm Next inDiagramm End Sub [/code] ------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 01. Mrz. 2009 16:07 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
@beverly In jeder neuen Datei: Klar, das ist auch das "normale Verhalten". So hätte ich es verstanden. Aber: in dieser Datei (Diagramm4.xls) von Stefan ist genau das eben nicht der Fall. Daher die Frage "Was'n das schon wieder"? Ich schiebe es jetzt einfach auf Kompatibilitätsprobleme, das ist ein schönes Wort und ein guter Schuldiger @Stefan: Zitat: Woher kenne ich diesen Index (in meinem Beispiel habe ich durch ausprobieren rausgefunden das es in meinem Fall (1) war, aber was mache ich wenn ich mehrere Diagramme habe? Ich kenne bisher nur den Diagrammnamen (indem ich ihn mir per Kopf/Fußzeile anzeigen lasse, oder geht das auch komfortabler?)
Die Indexnummern werden hochgezählt, jedes neue Diagramm = neue Nummer Die kannst Du Dir z.B. so mal ausgeben lassen (im Direktbereich, kennste den? Menü -> Ansicht -> Direktfenster) Wenn es Dir nur um die charts geht: Code: Sub ChartNummern() For a = 1 To Sheets(2).ChartObjects.Count Debug.Print ActiveSheet.ChartObjects(a).Name & " hat die Nummer " & a Next a End Sub
Wenn es Dir um shapes i.A. geht:
Code: Sub IndexNummern() For a = 1 To Sheets(2).Shapes.Count Debug.Print Sheets(2).Shapes(a).Name & " hat die Index-Nummer " & a & " und ist ein " & Sheets(2).Shapes(a).Type Next a End Sub
Was die Nummern des Types bedeuten, kannst Du Dir in der Objektbibliothek (F2) unter msoShapeType raussuchen (Klartext bekomme ich auf die Schnelle nicht in den Code) Hilfreich ist auch immer das Lokalfenster:
Code: Sub Test() Set x = Sheets(1) Stop End Sub
Dann kannst Du Dir im Lokalfenster in aller Ruhe alles angucken, was sich so im Sheet(1) tummelt. Das erschlägt vielleicht anfangs ein wenig, aber mit der Zeit findet man das echt hilfreich. Zitat: finde ich es günstiger die per Formeln erzeugte Wertetabelle, aus der das Diagramm letztendlich erzeugt wird, zu überwachen, da es mühsam/fehleranfällig ist alle Zellen zu erfassen, die Einfluss auf die Formeln haben
Und es nicht zufällig ein Bereich dabei, der in allen betreffenden Formeln mitspielt? Denn wie oben (auch von Beverly) erwähnt, bremst das Worksheet_Calculate die ganze Mappe aus, daher auch der link zu herber, der das irgendwie umgeht. (Hab ich aber nicht getestet) So, jetzt duftet der Kaffee, ich muß weg ich denke Du hast für die nächsten paar Stunden wieder was zu tun ;-) ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info Excel -Suche RuA-Suche FAQ-ACAD Hilfe zu CAD.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 01. Mrz. 2009 20:11 <-- editieren / zitieren --> Unities abgeben:
Wie immer hilfreiche Tipps von euch beiden, Danke. Zitat: Original erstellt von runkelruebe: So, jetzt duftet der Kaffee, ich muß weg
Bei mir duftet zwar kein Kaffee, aber ich muss auch weg, und gleich für ein paar Tage. Du hast also in den nächsten Tagen wieder etwas mehr Ruhe ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|