Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
488to492
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
488to492
488to492
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Diagramme positionieren

Diagramme positionieren
24.09.2004 17:41:53
Reinhard
Hallo Wissende,
ich mache jetzt schon seit Stunden an der Beantwortung vom Thread: https://www.herber.de/forum/messages/489559.html herum.
Aktuell geht es mir um die Datei https://www.herber.de/bbs/user/11281.xls
Mehrere Diagramme solllen in ein Diagrammblatt.
Der nachstehende Code bricht an der markierten Stelle bei
.HasTitle = True
mit Laufzeitfehler&mystischerZahlenreihe, Automatiserungsfehler ab.
Zeichne ich aber an der Abbruchstelle ein Makro auf, so klappt dort der Befehl .HasTitle = True.

Sub Makro12()
With ActiveChart
.HasTitle = True 'Keine Probleme
.ChartTitle.Characters.Text = "test"
End With
ActiveChart.ChartArea.Select
End Sub

Wer kann mal bitte über den Code sehen und ihn mal anschubsen.
Wahrscheinlich treten später noch Probleme mit Height usw auf *seuz*
Dankeschön
Reinhard

Sub verteilung()
Dim vorh As Boolean
Dim n As Integer
Application.DisplayAlerts = False
For n = Sheets.Count To 1 Step -1
If Sheets(n).Name = "Verteilung" Or Sheets(n).Name Like "Dia*" Then Sheets(n).Delete
Next n
Application.DisplayAlerts = True
Charts.Add
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Verteilung"
Call vert("A50:G50,A52:G52", "Statusverteilung in %", 260, 300, 35, 600)
'Call vert("A50:G50,A51:G51", "Statusverteilung", 260, 300, 35, 240)
'Call vert("A45:E45,A47:E47", "Prioritätsverteilung in %", 255, 300, 324, 600)
'Call vert("A45:E45,A46:E46", "Prioritätsverteilung", 255, 300, 324, 240)
End Sub
Sub vert(rang As String, tex As String, h As Integer, w As Integer, t As Integer, l As Integer)
Charts.Add
With ActiveChart
.Name = "dia"
.ChartType = xlCylinderColClustered
.SetSourceData Source:=Worksheets("Tabelle1").Range(rang), PlotBy:=xlColumns
.Location Where:=xlLocationAsObject, Name:="Verteilung"
.HasTitle = True '###################laufzeitfehler, Automatisierungsfehler
.ChartTitle.Characters.Text = "Statusverteilung in %"
.Axes(xlCategory).HasTitle = False
.Axes(xlSeries).HasTitle = False
.Axes(xlValue).HasTitle = False
.HasAxis(xlCategory) = False
.HasAxis(xlSeries) = False
.HasAxis(xlValue) = True
.Axes(xlCategory).CategoryType = xlAutomatic
.HasDataTable = False
End With
With ActiveSheet
.ChartObjects(dia).Height = h
.ChartObjects(dia).Width = w
.ChartObjects(dia).Top = t
.ChartObjects(dia).Left = l
End With
End Sub
Sub Makro12()
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "test"
End With
ActiveChart.ChartArea.Select
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Diagramme positionieren
K.Rola
Hallo,
das mit mehreren Diagrammen im Diagrammsheet würde ich mir an deiner Stelle abschminken.
Was soll auch für einen Vorteil haben?
Diagramme in Diagrammsheets m´üssen teilweise anders angesprochen werden als in einer
Tabelle.
https://www.herber.de/bbs/user/11288.xls
Gruß K.Rola
AW: Diagramme positionieren
Reinhard
Hallo K.Rola,
danke dir sehr.
Wenn ich viel Zeit in etwas investiert habe, will ich auch wissen wie und ob man das lösen kann, dann spielt Brauchbarkeit keine Rolle mehr.
Lieben Gruß
Reinhard
AW: Diagramme positionieren
K.Rola
Hallo,
gib Laut, wenn es dir gelungen ist, mehrere Chart in einem Diagrammsheet zu platzieren.
Gruß K.Rola
Anzeige
AW: Diagramme positionieren
Reinhard
Hallo K.Rola,
ich und mein Helfer, der Makrorekorder machten das mit links :-)
https://www.herber.de/bbs/user/11297.xls
Jetzt müsste das nur so umgeschrieben werden als Sub, wie im nachfolgenden (nicht funktionierenden) vert()-Code angedacht.
Gruß
Reinhard

Sub verteilung()
Dim vorh As Boolean
Dim n As Integer
Application.DisplayAlerts = False
For n = Sheets.Count To 1 Step -1
If Sheets(n).Name = "Verteilung" Or Sheets(n).Name Like "Dia*" Then Sheets(n).Delete
Next n
Application.DisplayAlerts = True
Charts.Add
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Verteilung"
Call vert("A50:G50,A52:G52", "Statusverteilung in %", 260, 300, 35, 600)
'Call vert("A50:G50,A51:G51", "Statusverteilung", 260, 300, 35, 240)
'Call vert("A45:E45,A47:E47", "Prioritätsverteilung in %", 255, 300, 324, 600)
'Call vert("A45:E45,A46:E46", "Prioritätsverteilung", 255, 300, 324, 240)
End Sub


Sub vert(rang As String, tex As String, h As Integer, w As Integer, t As Integer, l As Integer)
Charts.Add
With ActiveChart
.Name = "dia"
.ChartType = xlCylinderColClustered
.SetSourceData Source:=Worksheets("Tabelle1").Range(rang), PlotBy:=xlColumns
.Location Where:=xlLocationAsObject, Name:="Verteilung"
.HasTitle = True '###################laufzeitfehler, Automatisierungsfehler
.ChartTitle.Characters.Text = "Statusverteilung in %"
.Axes(xlCategory).HasTitle = False
.Axes(xlSeries).HasTitle = False
.Axes(xlValue).HasTitle = False
.HasAxis(xlCategory) = False
.HasAxis(xlSeries) = False
.HasAxis(xlValue) = True
.Axes(xlCategory).CategoryType = xlAutomatic
.HasDataTable = False
End With
With ActiveSheet
.ChartObjects(dia).Height = h
.ChartObjects(dia).Width = w
.ChartObjects(dia).Top = t
.ChartObjects(dia).Left = l
End With
End Sub


Sub Makro12()
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "test"
End With
ActiveChart.ChartArea.Select
End Sub

Anzeige
Mehrere Diagramme in einem Diasheet
Reinhard
Hallo K.Rola,
oder auch jeder andere der mir helfen könnte.
https://www.herber.de/bbs/user/11301.xls funktioniert jetzt so wie ich mir das vorstellte.
Siehe auch nachstehenden Code.
Zwei Fragen habe ich noch.
1.Frage:
Gibt es einen VBA-Refresh-Befehl, der die Diagramme/den Bildschirm neu zeichnet?
Seit Einfügen der Screenupdating=false Funktion werden die Diagramme nicht komplett
angezeigt, erst bei Wiederanwahl des Sheets. Es ist egal ob ich die das
Sccreenupdating=False in dem Haupt- oder/und UnterMakro durchführe.
Ohne Screenupdatinng=False flackert es wie erwartet, aber die Anzeige ist korrekt.
2.Frage:
Wenn ich die zwei "With ActiveChart"-Routinen zu einer "With ActiveChart"-Routine
vereinige. kommt Automatisierungsfehler bei ":HasTitle=True".
Da mich das wahnsinnig Zeit gekostet hat dies festzustellen, warum ist das so?
Ein Zeitproblem ist es nicht denn ich habe an der Stelle schon mal den Wait-Befehl
ausprobiert.
Danke für jede Information
Gruß
Reinhard

Sub MehrereDiagramme()
Dim vorh As Boolean
Dim n As Integer
Dim anz As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For n = Sheets.Count To 1 Step -1
If Sheets(n).Name = "testdia" Or Sheets(n).Name Like "Dia*" Then Sheets(n).Delete
Next n
Application.DisplayAlerts = True
Charts.Add
ActiveChart.SetSourceData Source:=Sheets("Tabelle1").Range("A65536")
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="testdia"
Call DiaErzeugen("testdia", "A1:B12", "Dia1", xlColumnClustered, 200, 300, 0, 0)
Call DiaErzeugen("testdia", "A1:B12", "Dia2", xlCylinderColClustered, 200, 300, 300, 0)
Call DiaErzeugen("testdia", "A1:B12", "Dia3", xlBarStacked, 200, 300, 0, 300)
Call DiaErzeugen("testdia", "A1:B12", "Dia4", xl3DPie, 200, 300, 300, 300)
Application.ScreenUpdating = True
End Sub


Sub DiaErzeugen(Blattname As String, Bereich As String, DiaTitel As String, _
DiaTyp As String, Höhe As Integer, Breite As Integer, Oben As Integer, Links As Integer)
'Application.ScreenUpdating = False
Charts.Add
With ActiveChart
.ChartType = DiaTyp
.SetSourceData Source:=Sheets("Tabelle1").Range(Bereich), PlotBy:=xlColumns
.Location Where:=xlLocationAsObject, Name:=Blattname
End With
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = DiaTitel
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
End With
anz = ActiveSheet.Shapes.Count
With ActiveSheet.Shapes(anz)
.Height = Höhe
.Width = Breite
.Top = Oben
.Left = Links
End With
'Application.ScreenUpdating = True
End Sub

Anzeige
AW: Mehrere Diagramme in einem Diasheet
K.Rola
Hallo,
"...funktioniert jetzt so wie ich mir das vorstellte."
Ein kurzer Blick in deinen Code zeigt, dass die Bemaßung so nicht stimmen kann,
wie das Ergebnis aussieht. Ohne das groß analisiert zu haben, denke ich, dass die
Charts im falschen Blatt erzeugt werden. Ich würde dir empfehlen, mit Objektvariablen
zu hantieren, das macht unabhängig vom "ActiveChart".
Aufgrund des Tipps von Franz von gestern hab ich das nun endlich auch begriffen und
auch umgesetzt. Wenn du Interesse hast, poste ich dir einen kommentierten Code.
Gruß K.Rola
AW: Mehrere Diagramme in einem Diasheet
Reinhard
Hallo K.Rola,
natürlich habe ich Interesse daran, poste es bitte.
Das "im falschen Blatt" verstehe ich nicht. Wenn ich Einzelschrittmodus mache werden die 4 Diagramme immer erst als neues Blatt angelegt bei charts.Add, aber schon nach .location stehen sie als Objekt im richtihen Diagrammblatt.
Deshalb ist mir immer noch sehr unklar warum

With ActiveChart
'irgendwas
End With
With ActiveChart
.HasTitle = True
'irgendwas2
End With
funktioniert, aber
With ActiveChart
'irgendwas1
.HasTitle = True 'Fehler
'irgendwas2
End With

nicht funktioniert
Gruß
Reinhard
Anzeige
AW: Mehrere Diagramme in einem Diasheet
K.Rola
Hallo,
mit "im falschen Blatt" meine ich, dass die einzelnen Charts im Tabellenblatt
erzeugt werden müssen und nach Fertigstellung in das Chartsheet übertragen werden.
Da in einem Tabellenblatt das Objekt Chart das Diagramm ist, in einem Chartsheet
das Objekt Chart aber das Chartsheet selbst ist, kommt es bei deiner Variante zu
Konflikten. Wie schon geschrieben, Objektvariable verwenden, dann kann das nicht
passieren.
''Erstellt am: 26.09.2004
''Autor:       K.Rola
''Die Verwendung von Konstanten ist bei umfangreicherem Code deutlich langsamer
''als die Verwendung der entsprechenden Long-Werte. Bei Codes mit Late-Binding,
''also, wenn kein Verweis auf eine entsprechende Bibliothek gesetzt ist, können
''die Konstanten ohnehin nicht verwendet werden, z.B. bei VBS oder wenn Excel
''extern gesteuert wird.
''xlLocationAsNewSheet = 1
''xlLocationAsObject = 2
''xlColumnClustered = 51
''xlCylinderColClustered = 92
''xlBarStacked = 58
''xl3DPie = -4102
Option Explicit
''Name für das ChartSheet
Const BNAME As String = "4Charts"
''Namen für die Diagramme
Const DIA1$ = "KRola"
Const DIA2$ = "LVira"
Const DIA3$ = "Rubdi"
Const DIA4$ = "Rabdu"
Dim ShAktiv As String
Sub makeChartSheet()
Dim Sh As Object, Ch1 As Chart
ShAktiv = ActiveSheet.Name
Application.ScreenUpdating = False
Application.DisplayAlerts = False
''Falls ChartSheet vorhanden ist, löschen.
If BTest Then Sh.Delete
Application.DisplayAlerts = True
Set Ch1 = Charts.Add
Ch1.Location 1, BNAME
''Die Diagrammtitel stehen in D2:D5 der Quelltabelle(ShAktiv).
Call makeCh(DIA1, BNAME, "A1:B10", "R2C4", 51, 220, 320, 0, 0)
Call makeCh(DIA2, BNAME, "A1:B10", "R3C4", 92, 220, 320, 225, 0)
Call makeCh(DIA3, BNAME, "A1:B10", "R4C4", 58, 220, 320, 0, 325)
'Kreisdiagramm können nur eine Datenreihe haben!
Call makeCh(DIA4, BNAME, "A1:A10", "R5C4", -4102, 220, 320, 225, 325)
'Falls kein Wechsel auf das Diagrammblatt gewünscht ist.
'Sheets(ShAktiv).Activate
Application.ScreenUpdating = True
End Sub
Sub makeCh(ChName$, ShName$, Quelle$, ChTitel$, ChTyp&, h#, w#, t#, L#)
'Der Diagrammtyp ist vom Datentyp Long(&)
'Width, Height, Top und Left sind bei Diagrammen vom Datentyp Double(#)
Dim Ch As Chart
Set Ch = Charts.Add
Set Ch = Ch.Location(2, ShName)
With Ch
.ChartType = ChTyp
.SetSourceData Sheets(ShAktiv).Range(Quelle), xlColumns
.HasTitle = True
'Bei .ChartTitle.Characters.Text ist keine Formel möglich!!!
'Die Formel muss in Bezugsart R1C1 sein!
'Die Diagrammtitel stehen in D2:D5 der Quelltabelle(ShAktiv)
.ChartTitle.Text = "=" & ShAktiv & "!" & ChTitel
With .Parent
'Für spätere Bearbeitung ist es günstig, gleich einen Namen zu geben.
.Name = ChName
.Height = h
.Width = w
.Top = t
.Left = L
End With
.Location 2, ShName
.SizeWithWindow = True
.Deselect 'Fokus vom Diagramm nehmen
End With
End Sub
Sub Namen_testen()
Dim c As Byte
If Not BTest Then Exit Sub
With Sheets(BNAME)
For c = 1 To .ChartObjects.Count
MsgBox .ChartObjects(c).Name
Next
End With
End Sub
Sub Chart1_aendern()
Dim Ch As Chart
If Not BTest Then Exit Sub
Set Ch = Sheets(BNAME).ChartObjects(DIA1).Chart
If Ch.ChartType = xlLine Then
Ch.ChartType = xlColumnClustered
Else
Ch.ChartType = xlLine
End If
End Sub
Private Function BTest() As Boolean
Dim Sh As Object
For Each Sh In Sheets
If Sh.Name = BNAME Then BTest = True
Next
End Function

Gruß K.Rola
Anzeige
Klasse m.T
Reinhard
Danke dir K.Rola,
ich werde deine Tipps hier und in den Kommentaren beherzigen und versuchen umzusetzen.
Deinen Code studiere ich natürlich auch:-)
Aber die eigene Umsetzung ist mir auch sehr wichtig, denn ich wll ja lernen.
Schönen Sonntag noch
Reinhard

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige