Diagrammmakro nicht für andere Sheets kompatibel

Bild

Betrifft: Diagrammmakro nicht für andere Sheets kompatibel
von: golem
Geschrieben am: 10.11.2003 14:39:11

Hallo,
ich habe da ein MAkro zur Erzeugung von Diagrammen erstellt(für mehrere Tabellenblätter), es funkt auch alles,bloß als ich das Makro in eine ander MAppe kopiert habe, erscheinen die erstellten Diagramme im anderem Format (Schriftgröße viel zu groß).
Kann das an einer Autoformatierung liegen (das Excel immer die Schrift des vorherigen Diagramms beibehält oder so?)?

der Code:


Sub AddGraphToEachWorksheet2()
    Dim ChrtObjts As ChartObjects, ChrtObj As ChartObject
    Dim MyChart As Chart, Ws As Worksheet
    Dim i%
   
    For i = 1 To 97
         For Each Ws In Application.ActiveWorkbook.Worksheets '-- nicht notig
        
       'Set Ws = Worksheets(i)
        
        If Ws.CodeName = "Tabelle" & i Then ' fur die Sheets mit CodeName Tabelle1 bis Tabelle97
            
            ' Set MyChart = Charts.Add -- nicht notig
            Set ChrtObjts = Ws.ChartObjects
            Set ChrtObj = ChrtObjts.Add(0, 0, 100, 100)
            Set MyChart = ChrtObj.Chart
            
            With MyChart
                ' Charts.Add -- nicht nötig
                
                .ChartType = xlColumnClustered
                .SetSourceData Source:=Ws.Range("A26,A28:A40,C26,C28:C40,E26,E28:E40"), PlotBy:=xlColumns
                .Location Where:=xlLocationAsObject, Name:=Ws.Name
                
                .HasTitle = True
                .ChartTitle.Characters.Text = "Sales"
                .Axes(xlCategory, xlPrimary).HasTitle = False
                .Axes(xlValue, xlPrimary).HasTitle = False
                
                .HasLegend = True
                .Legend.Select
                Selection.Position = xlTop
                .HasDataTable = False
                .SeriesCollection(2).Select
                
                With Selection.Border
                    .ColorIndex = 6
                    .Weight = xlMedium
                    .LineStyle = xlContinuous
                End With
                
                Selection.Shadow = False
                Selection.InvertIfNegative = False
                Selection.Interior.ColorIndex = xlAutomatic
                .SeriesCollection(2).ChartType = xlLine
                .SeriesCollection(2).Select
                
                With Selection.Border
                    .ColorIndex = 6
                    .Weight = xlThick
                    .LineStyle = xlContinuous
                End With
                
                With Selection
                    .MarkerBackgroundColorIndex = xlNone
                    .MarkerForegroundColorIndex = xlNone
                    .MarkerStyle = xlNone
                    .Smooth = False
                    .MarkerSize = 7
                    .Shadow = False
                End With
                
                With .ChartGroups(1)     'Balkendicke
                    .Overlap = 0
                    .GapWidth = 500
                    .HasSeriesLines = False
                    .VaryByCategories = False
                End With
                                               
                With ChrtObj            'Verschiebung
                    .Left = 2200
                    .Top = 295
                    .Height = 300
                    .Width = 700
                End With
                
            End With
        End If
         Next '-- nicht nötig
    Next i%
End Sub



Außerdem wollte ich fragen wie ich den Bereich ändere, wenn man mehrere Quellen einfügen will (Für was steht das A26(=?),A28:A40 (=?))
das betrifft soweit ich weiß diese Zeile:
.SetSourceData Source:=Ws.Range("A26,A28:A40,C26,C28:C40,E26,E28:E40"), PlotBy:=xlColumns
Bild


Betrifft: AW: Diagrammmakro nicht für andere Sheets kompatibel
von: Dan
Geschrieben am: 10.11.2003 21:56:53

Hallo Goli,
so hier bin ich wieder :-) mit einem Code, das Dir helfen sollte :-). Und die Antwort auf deine Frage mit dem Range("A26,A28:A40,C26,C28:C40,E26,E28:E40) :
In den VBA Editor screib dies :

Sub Test()
    Range("A26,A28:A40,C26,C28:C40,E26,E28:E40").Activate
End Sub

Und drucke dreimal Taste F8. Du wirst den Range sehen :-)

Hier der neue Code, wo du unter anderem sehen kannst wie man den Font Object andern kann. Ich
habe versucht es ganz klar und einfach zu machen :-) D.

================================================================
Option Explicit

Public

Sub AddAndEditChart()
    Dim MyChartObjects As ChartObjects
    Dim MyChartObject As ChartObject
    Dim MyChart As Chart
    
    ' MyChartObjects sind alle ChartObjects on Sheet (0 to MyChartObjects.Count)
    Set MyChartObjects = ActiveSheet.ChartObjects
    
    ' MyChartObject ist der Konteiner fur Charts, es ist die Aussenhulle des Charts
    Set MyChartObject = MyChartObjects.Add(Left:=10, Top:=10, Width:=150, Height:=150)
    
    ' durch die Variable MyChartObject kann man einige Eigenschafften des Konteiners bearbeiten
    With MyChartObject
        ' Height, Width, Left Pos. und Top Pos. des Konteiners und andere Eigenschafften
        .Height = 256
        .Width = 321
        .Left = 142
        .Top = 92
        .Name = "MyChartObject"
        .Placement = xlFreeFloating
        .PrintObject = True
        .ProtectChartObject = False
        .RoundedCorners = True
        .Shadow = True
        .Visible = True
        
        ' Border des Konteiners
        With .Border
            .ColorIndex = 3
            .LineStyle = msoLineSingle
            .Weight = xlThick
        End With
        
        ' Interior des Konteiners
        With .Interior
            .ColorIndex = vbGreen
            .Pattern = xlPatternSolid
            .PatternColor = vbRed
        End With
    End With
    
    '----------------------------------------------------
    ' das alles kann man mit dem Konteiner des Charts machen
    ' und jetzt mochten wir den Chart selbst bearbeiten
    ' die Variable MyChart is von Typ chart, wir messen sie nur noch mit Daten fullen,
    ' oder anders gesagt wir messen die Variable einstellen, damit sie auf ein Object (hier Chart)
    ' zeigt. Dann konnen wir im Code die Variable benutzem um an den Chart ran zu kommen ...
    Set MyChart = MyChartObject.Chart
    
    With MyChart
        .SetSourceData Source:=ActiveSheet.Range("C5:D6"), PlotBy:=xlColumns
        .ChartType = xlColumnClustered
        .Location Where:=xlLocationAsObject, Name:=ActiveSheet.Name
        
        ' die Series Collectionen bearbeiten
        With .SeriesCollection(1)
            .XValues = "=List3!R4C3:R4C4"
            .Name = "=""SeriesCollection(1)"""
        End With
        
        With .SeriesCollection(2)
        .XValues = "=List3!R4C3:R4C4"
        .Name = "=""SeriesCollection(2)"""
        End With
                    ' Font von Series Collection2
        With .Legend.Font
            .Bold = True
            .Name = "Courier New"
            .Size = 10
        End With
        ' den Chart Titel bearbeiten
        .HasTitle = True
        .ChartTitle.Characters.Text = "ChartTitle"
        
        ' die xlCategory-Achse bearbeiten
        With .Axes(xlCategory, xlPrimary)
            .HasTitle = True
            .AxisTitle.Characters.Text = "Axes-xlCategory"
            ' den Font bearbeiten
            With .AxisTitle.Characters.Font
                .Bold = True
                .Name = "Arial"
                .Size = 10
            End With
        End With ' ende xlCategory Achse
        
        ' die xlValue-Achse bearbeiten
        With .Axes(xlValue, xlPrimary)
            .HasTitle = True
            .AxisTitle.Characters.Text = "Axes-xlValue"
            ' den Font bearbeiten
            With .AxisTitle.Characters.Font
                .Bold = False
                .Name = "Arial"
                .Size = 12
            End With
        End With ' ende xlValue Achse
    End With
End Sub



Bild


Betrifft: AW: Diagrammmakro nicht für andere Sheets kompatibel
von: golem
Geschrieben am: 11.11.2003 08:38:53

Guten morgen Dan,
Schön, dass Du am Ball bleibst.

("A26,A28:A40,C26,C28:C40,E26,E28:E40") -> sind die Datenquellen, wenn ich mich nicht irre. Woher weiß man für was(oder welche SeriesCollection) A26... oder C26 steht?
in Deinem Code deklarierst Du die Datenquellen (nachträglich)selber(oder?):
' die Series Collectionen bearbeiten
With .SeriesCollection(1)
.XValues = "=List3!R4C3:R4C4"
.Name = "=""SeriesCollection(1)"""
End With

With .SeriesCollection(2)
.XValues = "=List3!R4C3:R4C4"
.Name = "=""SeriesCollection(2)"""
End With
Sind SeriesCollection die einzelnen Kurven des Diagramms? Sind (1)und (2)dann die Nummerierungen der Kurven(?)

Wiedermal DANKE für Deine Hilfe!

Gruß
Goli


Bild


Betrifft: AW: Diagrammmakro nicht für andere Sheets kompatibel
von: golem
Geschrieben am: 11.11.2003 08:52:58

Muss nochmal stören...hierbei kommt es zur Fehlermeldung(in allen 3Zeilen):
' Interior des Konteiners
With .Interior
.ColorIndex = vbGreen
.Pattern = xlPatternSolid
.PatternColor = vbRed
End With
Die XL-Hilfe:
Farbkonstanten


Die folgenden Konstanten können überall im Code anstelle der tatsächlichen Werte verwendet werden:

Konstante Wert Beschreibung
vbBlack 0x0 Schwarz
vbRed 0xFF Rot
vbGreen 0xFF00 Grün
vbYellow 0xFFFF Gelb
vbBlue 0xFF0000 Blau
vbMagenta 0xFF00FF Magenta
vbCyan 0xFFFF00 Zyan
vbWhite 0xFFFFFF Weiß

mit den Hexwerten klappt es auch nicht(?).
Werde es weiter versuchen und mich dann melden...


Bild


Betrifft: AW: Diagrammmakro nicht für andere Sheets kompatibel
von: Dan
Geschrieben am: 11.11.2003 11:50:19

Hi Golem,
ja wir bleiben am Ball bis wir dem Gegner (excel.chart :-) einen entgultigen Siegestor gegeben haben :-)

-("A26,A28:A40,C26,C28:C40,E26,E28:E40") -> sind die Datenquellen, wenn ich mich nicht irre.
Ja. Im help findet man volgendes daruber :
********************************************
'SetSourceData Method
'
'
'Sets the source data range for the chart.
'
'Syntax
'
'expression.SetSourceData(Source, PlotBy)
'
'expression Required. An expression that returns a Chart object.
'
''''''''''''''''''''''Source Required Range. The range that contains the source data.
'
'PlotBy Optional Variant. Specifies the way the data is to be plotted. Can be either of the following XlRowCol constants: xlColumns or xlRows.
*********************************************************

Also Source ist ein Parameter von Typ Range. Der Source - Range kann dann ein zusammenhangender Range sein (wie z.B "B2 : E3") oder auch ein nicht zusammenhangender Range (wie z.B. "A26,A28:A40,C26,C28:C40,E26,E28:E40").

-Woher weiß man für was(oder welche SeriesCollection) A26... oder C26 steht?
Wenn man sich die Eigenschafft Formula des Objects Series anschaut, dann erfahrt man, dass die Formula z.B. so aussieht :
=SERIES([Workbook1]Sheet1!$B$2,[Workbook1]Sheet1!$C$2:$E$2,[Workbook1]Sheet1!$C$2:$E$2,1)
Und solche Formel hat jeder Series Object. Syntax von SERIES Formel ist so :
SERIES(Name; die Kategogien Beschreibung; Werte; Reihenvolge). Also Daten jeder Serie im Chart sind durch die Formel SERIES bestimmt. Also wenn man es wolte, man konnte die Formel Eigenschafft benutzen um die SERIES Formel und somit die Daten eizustellen.

Option Explicit


Sub Makro1()
    Dim MyChart As Chart
    Dim MeineReihe As Series
    
    Set MyChart = ActiveSheet.ChartObjects(1).Chart
        
        With MyChart
    
            Set MeineReihe = .SeriesCollection(1)
            
            ' man kann es so machen,
    '        With MeineReihe
    '            .XValues = "=List3!R4C3:R4C4"
    '            .Name = "=""SeriesCollection(1)"""
    '        End With
    
            ' oder man konnte es mit Formula und SERIES einstellen
            MeineReihe.Formula = "= SERIES(Tabelle1!A1, Tabelle1!A2:A10, Tabelle1!B2:B10, 1)"
        End With
End Sub


- in Deinem Code deklarierst Du die Datenquellen (nachträglich)selber(oder?):
Es ist das selbe wie wenn man den Chart per Hand bilden will. Man muss irgendwelche Daten nennen, die abgebildet werden sollen. Im Code ist es genauso, man muss mit hilfe der Methode SetSourceData(Source, PlotBy) den Source bilden. Es ist nicht nachtraglich, es ist ganz unentbahlich :-). Ohne SourceData gibt es keinen Chart ;-).

-Sind SeriesCollection die einzelnen Kurven des Diagramms? Sind (1)und (2)dann die Nummerierungen der Kurven(?)
Series sind nicht Kurven, sondern eher Linien, Reihen, Folgen, eben Serien :-).

-Muss nochmal stören...hierbei kommt es zur Fehlermeldung(in allen 3Zeilen):
Ja es ist merkwurdig, weil bei mir lauft z.B. die Konstante vbGreen auch nicht. Also wenn es nicht so geht, benutze einfache Integer :
' Interior des Konteiners
With .Interior
.ColorIndex = 10
.Pattern = 1
.PatternColor = 3
End With

Gruss Dich, D.


Bild


Betrifft: AW: Diagrammmakro nicht für andere Sheets kompatibel
von: golem
Geschrieben am: 12.11.2003 08:58:02

Danke für die Hilfe, habe es nun geschafft ohne größere Probs ein Diagramm per VB zu erstellen.
Thx!


Bild

Beiträge aus den Excel-Beispielen zum Thema " Diagrammmakro nicht für andere Sheets kompatibel"