Die Excel Wühlkiste

Diagramm programmieren mit VBA Teil 2

und: der dynamische CommandButton Teil 2

Hier nun ein zweites Beispiel in etwas abgeänderter Form.
   Neu hinzu gekommen ist der CommandButton2, mit dessen Hilfe die Trendlinie von "Linear" auf "Polynomisch 2. Ordnung" und wieder zurück geändert werden kann. Ausserdem ist in jedem Diagramm eine TextBox mit einem erklärenden Hinweis auf die Trendlinie integriert. Der Hinweis ändert sich je nach Art der Trendlinie, so dass der Betrachter immer informiert ist.
   Wie im Diagramm-Programmbeispiel 1 wandern die CommandButtons mit der aktiven Zeile mit, wenn sie einen chartfähigen Datensatz enthält. Die Buttons sind nur dann auf "aktiv" gesetzt, wenn es auch einen Sinn ergibt.

Die Datenbasis ist die gleiche wie schon im Diagramm-Programmbeispiel 1. Das betrifft auch die Art und Weise, wie die zugehörigen Maßeinheiten für die Darstellung im Diagramm ausgelesen werden - der Vollständigkeit halber hier in Teil 1 "Daten holen" aufgeführt.

08.10.2009: Außerdem ist der Code nun komplett überarbeitet und am Ende - im CommadButton2 - Teil wird gezeigt wie man auf das Diagramm ganz ohne "Select" und "Activate" zugreift.

Für Eilige: Sofort zum Teil 2: Diagramme

 

 

Das Thema CommandButton wird dann wieder am Ende der Seite in CommandButton2 und in Worksheet_SelectionChange behandelt, wo die Lage der Buttons gesteuert und dieselben ein- bzw. ausgeschaltet werden.

Die Programme von Teil 2 sind im VBA-Editor im Codefenster des Diagramm- und Auswahlsheets einzugeben. In einem normalen Modul würden die Programme wegen des Bezugs auf den CommandButton so nicht funktionieren. Hier wären geringfügige Änderungen notwendig.

Anzeigebeispiel : Diagramme und die Auswahlliste (38KB)

Zusätzlich habe ich mich entschlossen, die komplette Excel-Datei als Zip-File zum Download anzubieten, damit man das Beispiel live sehen kann.
Excel Datei als Zip-File zum Download (58KB)

08.10.2009: Die hier zum Download bereitgestellte Mappe enthält noch den alten Code. Da jedoch die Funktionsweise und die Optik der Diagramme grundsätzlich die gleiche ist, habe ich es mit dem Aufbereiten dieser Mappe nicht besonders eilig. Wer möchte, kann sie ja zusätzlich benutzen, um die Unterschiede Alt - Neu zu betrachten.

Teil 1: Daten für die Diagramme holen
nach oben
' Teil 1: Daten für die Diagramme holen
' Das gehört vom Thema her zwar nicht hier hin, soll aber
' gemäß der "Wühlkisten-Philosophie" und auch der Voll-
' ständigkeit halber hier aufgeführt werden.
' Mit den Diagrammen und den CommandButton's gehts dann in
' Teil 2 los.

Option Explicit
Private Const Monat1 As Integer = 9
Private Const Monat2 As Integer = 9
Private Const Jahr As String = 2009
Private Const ServerADR$ = "\\Servername\Verzeichnis\Unterverzeichnis1\Unterverzeichnis2\" & Jahr & "\"
Private Mappe As Workbook 'Datenquelle
Private Seite As Worksheet 'Datenquelle
Private Ziel As Worksheet 'dieses Workbook (Analyse HiBe)
Private I As Integer 'Schleifenzähler
Private Zeile As Integer 'Einfügezeile in Analyse HiBe Tabelle1
Private Spalte As Integer 'Einfügespalte in Analyse HiBe Tabelle1

Sub HiBe_Analyse()
' Auslesen der Absolutverbräuche Menge
Dim A As Variant
Dim MatNr
Dim B As Range

Set Ziel = ThisWorkbook.Sheets("Tabelle1")
Zeile = 3
Spalte = Monat1 + 2

For I = Monat1 To Monat2
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ChDir ServerADR$

    If I < 10 Then
    Workbooks.Open Filename:= _
    ServerADR$ & "0" & I & " " & Jahr & ".xls"
    Else
    Workbooks.Open Filename:= _
    ServerADR$ & I & " " & Jahr & ".xls"
    End If


    Set Mappe = ActiveWorkbook
    Set Seite = Mappe.Sheets(1)
    A = Application.WorksheetFunction.SumIf(Seite.Range("O:O"), "=2", Seite.Range("G:G"))

    Ziel.Cells(Zeile, Spalte).Value = A
    Zeile = Zeile + 1

    Do Until Ziel.Cells(Zeile, 1).Value = ""

        MatNr = Ziel.Cells(Zeile, 1).Value
        'MatNr = Ziel.Cells(Zeile, 17).Value 'für das Mapping alter Materialnummern

        Set B = Mappe.Sheets("Lager_400").Range("C:C").Find _
        (MatNr, LookAt:=xlPart, LookIn:=xlFormulas)

        If Not B Is Nothing Then
            A = Mappe.Sheets("Lager_400").Range("H" & B.Row).Value
            Ziel.Cells(Zeile, Spalte).Value = A
            Else
        End If

    Zeile = Zeile + 1

    Loop

    Spalte = Spalte + 1
    Zeile = 3
    Mappe.Close
    Application.EnableEvents = True



Next I
Application.ScreenUpdating = True
Ziel.Range("C3").Activate

End Sub
Preise holen
Sub HiBe_Analyse_Preise()
' Auslesen der Absolutverbräuche Wert
Dim A As Variant
Dim MatNr
Dim B As Range

Set Ziel = ThisWorkbook.Sheets("Tabelle1")
Zeile = 68
Spalte = Monat1 + 2

For I = Monat1 To Monat2
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ChDir ServerADR$

    If I < 10 Then
    Workbooks.Open Filename:= _
    ServerADR$ & "0" & I & " " & Jahr & ".xls"
    Else
    Workbooks.Open Filename:= _
    ServerADR$ & I & " " & Jahr & ".xls"
    End If


    Set Mappe = ActiveWorkbook
    Set Seite = Mappe.Sheets(1)
    A = Application.WorksheetFunction.SumIf(Seite.Range("O:O"), "=2", Seite.Range("K:K"))

    Ziel.Cells(Zeile, Spalte).Value = A
    Zeile = Zeile + 1

    Do Until Ziel.Cells(Zeile, 1).Value = ""

        MatNr = Ziel.Cells(Zeile, 1).Value
        'MatNr = Ziel.Cells(Zeile, 17).Value 'für das Mapping alter Materialnummern
        Set B = Mappe.Sheets("Lager_400").Range("C:C").Find _
        (MatNr, LookAt:=xlPart, LookIn:=xlFormulas)

        If Not B Is Nothing Then
            A = Mappe.Sheets("Lager_400").Range("J" & B.Row).Value
            Ziel.Cells(Zeile, Spalte).Value = A
            Else
        End If

    Zeile = Zeile + 1

    Loop

    Spalte = Spalte + 1
    Zeile = 68
    Mappe.Close
    Application.EnableEvents = True



Next I
Application.ScreenUpdating = True

End Sub
Menge Produktion holen
Sub HiBe_Analyse_QM()
' Auslesen der produzierten qm des Endproduktes
Dim A(1) As Variant

Set Ziel = ThisWorkbook.Sheets("Tabelle1")
Zeile = 198
Spalte = Monat1 + 2

For I = Monat1 To Monat2
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ChDir ServerADR$

    If I < 10 Then
    Workbooks.Open Filename:= _
    ServerADR$ & "0" & I & " " & Jahr & ".xls"
    Else
    Workbooks.Open Filename:= _
    ServerADR$ & I & " " & Jahr & ".xls"
    End If


    Set Mappe = ActiveWorkbook
    Set Seite = Mappe.Sheets("Leimverbrauch")


    A(0) = Seite.Range("F18").Value / 1000000 'Normal + Doppel qm
    A(1) = Seite.Range("D18").Value / 1000000 'Normal qm

    Ziel.Cells(Zeile, Spalte).Value = A(0)
    Ziel.Cells(Zeile + 1, Spalte).Value = A(1)
    ActiveCell.Offset(0, 1).Select

    Mappe.Close
    Spalte = Spalte + 1
    Application.EnableEvents = True


Next I

Application.ScreenUpdating = True

End Sub
Teil 2: Diagramme
Option Explicit

Private Sub CommandButton1_Click()
' Erzeugen und Formatieren der Grafiken

Dim Datenreihe(5), Monate, B As Range 'B ist Basispunkt im Datensheet
Dim Adresse As String 'Adressen der Datenreihen für Grafik 1
Dim Adresse2 As String 'Adressen der Datenreihen für Grafik 2
Dim Gname As String 'Name der aktiven Grafik
Dim A As String 'Name von Datenreihe 1
Dim C As String 'Name von Datenreihe 3
Dim X As Integer 'Zeile des gewälten Datensatzes
Dim Daten As Worksheet 'Datenbanksheet
Dim Analyse As Worksheet 'Grafiksheet
'Dim Dia1, Dia2 As Integer

' aktive Zelle setzen (eigentlich nicht nötig: siehe Beschreibung)
If ActiveCell.Column <> 2 Then Cells(ActiveCell.Row, 2).Select
' Ende aktive Zelle setzen

' Eigenschaften und Werte zuweisen
X = ActiveCell.Row
A = Range("B" & X).Value
Set Analyse = Sheets("Analyse Hiebe (Grafik)")
Set Daten = Sheets("Tabelle1")
C = "Ø Preis/" & Daten.Cells(X, 2).Offset(130, 14).Value
Set Monate = Sheets(1).Range(Cells(1, 3), Cells(1, 14))
Set Datenreihe(1) = Sheets(1).Range(Cells(X, 3), Cells(X, 14))
Set Datenreihe(2) = Sheets(1).Range(Cells(X + 65, 3), Cells(X + 65, 14))
Set Datenreihe(3) = Sheets(1).Range(Cells(X + 130, 3), Cells(X + 130, 14))
Set Datenreihe(4) = Sheets(1).Range(Cells(X + 201, 3), Cells(X + 201, 14))
Set Datenreihe(5) = Sheets(1).Range(Cells(199, 3), Cells(199, 14))
Set B = Cells(X, 2)
Adresse = Monate.Address & ", " & Datenreihe(1).Address & ", " & Datenreihe(2).Address & ", " & Datenreihe(3).Address
Adresse2 = Monate.Address & ", " & Datenreihe(5).Address & ", " & Datenreihe(4).Address
' Ende Eigenschaften und Werte zuweisen

On Error GoTo Abbruch

Application.ScreenUpdating = False

' vorhandene Diagramme löschen:
Application.ActiveSheet.ChartObjects.Delete
' Ende vorhandene Diagramme löschen

' Diagramm hinzufügen und Typ festlegen:
    Charts.Add
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Analyse Hiebe (Grafik)"
    ActiveChart.ChartType = xlLine
' Ende Diagramm hinzufügen und Typ festlegen

' Datenreihen zufügen, ausrichten und benennen:
    ActiveChart.Axes(xlValue).MinimumScale = 0
    ActiveChart.SetSourceData Source:=Sheets("Tabelle1").Range( _
    Adresse), PlotBy:=xlRows

    ActiveChart.SeriesCollection(1).Name = A
    ActiveChart.SeriesCollection(2).Name = "=""Kosten"""
    ActiveChart.SeriesCollection(3).Name = C
' Ende Datenreihen zufügen, ausrichten und benennen

' Trendlinie hinzufügen:
'    ActiveChart.SeriesCollection(1).Select
'    ActiveChart.SeriesCollection(1).Trendlines.Add(Type:=xlPolynomial, Order:=2, Forward:=0, _
        Backward:=0, DisplayEquation:=False, DisplayRSquared:=False).Select
   ActiveChart.SeriesCollection(1).Trendlines.Add(Type:=xlLinear, Forward:=0, _
       Backward:=0, DisplayEquation:=False, DisplayRSquared:=False).Select
    ActiveChart.SeriesCollection(1).Trendlines(1).Name = "Trend Verbauch"
' Ende Trendlinie hinzufügen

' Gitternetzlinien zufügen:
    With ActiveChart.Axes(xlCategory)
        .HasMajorGridlines = True
        .HasMinorGridlines = False
    End With
    With ActiveChart.Axes(xlValue)
        .HasMajorGridlines = True
        .HasMinorGridlines = False
    End With
' Ende Gitternetzlinien zufügen

' Legende und Datentabelle:
    ActiveChart.HasLegend = True
    ActiveChart.Legend.Select
    Selection.Position = xlBottom
    ActiveChart.HasDataTable = False
' Ende Legende und Datentabelle

' Chartlinien formatieren:
    ActiveChart.SeriesCollection(1).Select
    With Selection.Border
        .ColorIndex = 5
        .Weight = xlMedium
        .LineStyle = xlContinuous
    End With
    With Selection
        .MarkerBackgroundColorIndex = xlNone
        .MarkerForegroundColorIndex = xlNone
        .MarkerStyle = xlNone
        .Smooth = False
        .MarkerSize = 3
        .Shadow = False
    End With

    ActiveChart.SeriesCollection(2).Select
    With Selection.Border
        .ColorIndex = 57
        .Weight = xlMedium
        .LineStyle = xlContinuous
    End With
    With Selection
        .MarkerBackgroundColorIndex = xlNone
        .MarkerForegroundColorIndex = xlNone
        .MarkerStyle = xlNone
        .Smooth = False
        .MarkerSize = 3
        .Shadow = False
        .AxisGroup = 2
    End With

    ActiveChart.SeriesCollection(3).Select
    With Selection.Border
        .ColorIndex = 57
        .Weight = xlMedium
        .LineStyle = xlContinuous
    End With
    With Selection
        .AxisGroup = 2
        .MarkerBackgroundColorIndex = xlNone
        .MarkerForegroundColorIndex = xlNone
        .MarkerStyle = xlNone
        .Smooth = False
        .MarkerSize = 3
        .Shadow = False
    End With
' Ende Chartlinien formatieren

' Diagramm auf Bildschirm ausrichten:
    ActiveChart.ChartArea.Select
    Gname = Mid(ActiveChart.Name, 24, 100)
    ActiveSheet.Shapes(Gname).ScaleWidth 1.29, msoFalse, _
        msoScaleFromTopLeft
    ActiveSheet.Shapes(Gname).IncrementLeft 67
    ActiveSheet.Shapes(Gname).IncrementTop -140
' Ende Diagramm auf Bildschirm ausrichten

' Legende formatieren
       ActiveSheet.ChartObjects(Gname).Activate
    ActiveChart.Legend.Select
    With Selection.Border
        .Weight = xlHairline
        .LineStyle = xlAutomatic
    End With
    Selection.Shadow = True
    With Selection.Interior
        .ColorIndex = 15
        .PatternColorIndex = 1
        .Pattern = xlSolid
    End With
    Selection.AutoScaleFont = True
    With Selection.Font
        .Name = "Arial"
        .FontStyle = "Fett"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
        .Background = xlAutomatic
    End With
 ' Ende Legende formatieren

' Erklärung für Trendlinie zufügen
     ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 148.5, 0#, _
        192#, 13.5).Select
    Selection.Characters.Text = "Trendlinie = Linear"
    Selection.AutoScaleFont = False
    With Selection.Characters(Start:=1, Length:=19).Font
        .Name = "Arial"
        .FontStyle = "Standard"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlTop
        .Orientation = xlHorizontal
        .AutoSize = False
    End With
' Ende Erklärung für Trendlinie zufügen

Windows("Analyse HiBe-2009.xls").Activate
B.Select

'-----------------------------------------------------------------
'Diagramm 2: Ø Kosten / 1000qm

A = A & " - Preis/1.000m²"

' Diagramm hinzufügen und Typ festlegen:
    Charts.Add
    ActiveChart.ChartType = xlLine
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Analyse Hiebe (Grafik)"
' Ende Diagramm hinzufügen und Typ festlegen

' Datenreihen zufügen, ausrichten und benennen:
    ActiveChart.Axes(xlValue).MinimumScale = 0
    ActiveChart.SetSourceData Source:=Sheets("Tabelle1").Range( _
    Adresse2), PlotBy:=xlRows
    ActiveChart.SeriesCollection(2).Name = A
    ActiveChart.SeriesCollection(1).Name = "=""Prod. Mio. m²"""
' Ende Datenreihen zufügen, ausrichten und benennen


' Trendlinie hinzufügen:
    ActiveChart.SeriesCollection(2).Select
'    ActiveChart.SeriesCollection(2).Trendlines.Add(Type:=xlPolynomial, Order:=2, Forward:=0, _
'        Backward:=0, DisplayEquation:=False, DisplayRSquared:=False).Select
    ActiveChart.SeriesCollection(2).Trendlines.Add(Type:=xlLinear, Forward:=0, _
        Backward:=0, DisplayEquation:=False, DisplayRSquared:=False).Select
    ActiveChart.SeriesCollection(2).Trendlines(1).Name = "Trend Preis/1.000m²"

' Ende Trendlinie hinzufügen

' Gitternetzlinien zufügen:
    With ActiveChart.Axes(xlCategory)
        .HasMajorGridlines = True
        .HasMinorGridlines = False
    End With
    With ActiveChart.Axes(xlValue)
        .HasMajorGridlines = True
        .HasMinorGridlines = False
    End With
' Ende Gitternetzlinien zufügen

' Legende und Datentabelle:
    ActiveChart.HasLegend = True
    ActiveChart.Legend.Select
    Selection.Position = xlBottom
    ActiveChart.HasDataTable = False
' Ende Legende und Datentabelle

' Chartlinien formatieren:
    ActiveChart.SeriesCollection(1).Select
    With Selection.Border
        .ColorIndex = 3
        .Weight = xlMedium
        .LineStyle = xlContinuous
    End With
    With Selection
        .MarkerBackgroundColorIndex = xlNone
        .MarkerForegroundColorIndex = xlNone
        .MarkerStyle = xlNone
        .Smooth = False
        .MarkerSize = 3
        .Shadow = False
        .AxisGroup = 2
    End With

    ActiveChart.SeriesCollection(2).Select
    With Selection.Border
        .ColorIndex = 6
        .Weight = xlMedium
        .LineStyle = xlContinuous
    End With
    With Selection
        .MarkerBackgroundColorIndex = xlNone
        .MarkerForegroundColorIndex = xlNone
        .MarkerStyle = xlNone
        .Smooth = False
        .MarkerSize = 3
        .Shadow = False
        .AxisGroup = 1
    End With
' Ende Chartlinien formatieren

' Diagramm auf Bildschirm ausrichten:
    ActiveChart.ChartArea.Select
    Gname = Mid(ActiveChart.Name, 24, 125)
    ActiveSheet.Shapes(Gname).ScaleWidth 1.29, msoFalse, _
        msoScaleFromTopLeft
    ActiveSheet.Shapes(Gname).ScaleHeight 0.9, msoFalse, _
        msoScaleFromTopLeft

    ActiveSheet.Shapes(Gname).IncrementLeft 67
    ActiveSheet.Shapes(Gname).IncrementTop 160
' Ende Diagramm auf Bildschirm ausrichten

' Legende formatieren
    ActiveSheet.ChartObjects(Gname).Activate
    ActiveChart.Legend.Select
    With Selection.Border
        .Weight = xlHairline
        .LineStyle = xlAutomatic
    End With
    Selection.Shadow = True
    With Selection.Interior
        .ColorIndex = 15
        .PatternColorIndex = 1
        .Pattern = xlSolid
    End With
    Selection.AutoScaleFont = True
    With Selection.Font
        .Name = "Arial"
        .FontStyle = "Fett"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
        .Background = xlAutomatic
    End With
 ' Ende Legende formatieren

' Ende Erklärung für Trendlinie zufügen
    ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 144#, 0#, _
        181.5, 14.25).Select
    Selection.Characters.Text = "Trendlinie = Linear"
    Selection.AutoScaleFont = False
    With Selection.Characters(Start:=1, Length:=19).Font
        .Name = "Arial"
        .FontStyle = "Standard"
        .Size = 9
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlTop
        .Orientation = xlHorizontal
        .AutoSize = False
    End With
' Ende Erklärung für Trendlinie zufügen

Windows("Analyse HiBe-2009.xls").Activate
B.Select
ActiveSheet.CommandButton2.Enabled = True

Application.ScreenUpdating = True
Exit Sub

Abbruch:
Select Case Err.Number    ' Fehlernummer auswerten.
    Case 1004    ' Fehler "Material nicht benutzt"
        MsgBox ("Dieses Jahr wurde kein(e) " & A & " verbraucht")
        ' vorhandene Diagramme löschen:
        Application.ActiveSheet.ChartObjects.Delete
        ' Ende vorhandene Diagramme löschen
    Case Else
        ' Andere Fälle hier bearbeiten...
End Select
' Resume    ' Ausführung in der Zeile
            ' fortsetzen, die den Fehler
End Sub
CommandButton2
Private Sub CommandButton2_Click()
' (06.10.2009) hier die überarbeitete Formatierung der Trandlinien
' und der Text Boxen in den Charts - jetzt komplett ohne "Select"
' und ohne "Activate".
' Es geht um das Umschalten der Trendlinien von Linear zu Polynomisch
' und umgekehrt - jeweils abhängig von der aktuell angezeigten Variante.
' Gleichzeitig wird in der Text Box die jeweilige Linienart benannt.
' Das sieht doch schon besser aus:

Dim Dia1 As Object
Dim Dia2 As Object
Dim B As Range
Dim Text(1) As String

If ActiveSheet.ChartObjects.Count <> 2 Then Exit Sub

Set B = ActiveCell
Set Dia1 = ActiveSheet.ChartObjects(1).Chart
Set Dia2 = ActiveSheet.ChartObjects(2).Chart

Text(0) = "Trendlinie = Linear"
Text(1) = "Trendlinie = Polynomisch 2. Ordnung"

With Dia1.SeriesCollection(1).Trendlines(1)
    If .Type = xlLinear Then
        .Type = xlPolynomial
        .Order = 2
        Dia1.Shapes("Text Box 1").TextFrame.Characters.Text = Text(1)

        Else
        .Type = xlLinear
        Dia1.Shapes("Text Box 1").TextFrame.Characters.Text = Text(0)
    End If
End With

With Dia2.SeriesCollection(2).Trendlines(1)
    If .Type = xlLinear Then
        .Type = xlPolynomial
        .Order = 2
        Dia2.Shapes("Text Box 1").TextFrame.Characters.Text = Text(1)

        Else
        .Type = xlLinear
        Dia2.Shapes("Text Box 1").TextFrame.Characters.Text = Text(0)
    End If
End With

End Sub
Worksheet_SelectionChange
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
' Steht die Markierung im Blatt auf einem "chartfähigen" Datensatz,
' werden die CommandButtons dahin verfrachtet. Nämlich immer dann,
' wenn in der aktiven Zeile in Spalte "A" eine Materialnummer (oder
' ein Dummy für die Summenzeilen) vorhanden ist.
' Steht die Markierung im Blatt NICHT auf einem "chartfähigen" Datensatz,
' wird ausserdem der CommadButton für das Erstellen der Cahrts deaktiviert:

If Not IsEmpty(Range("A" & Selection.Row)) Then
    CommandButton1.Top = ActiveCell.Offset(0, 0).Top
    CommandButton1.Enabled = True
    CommandButton2.Top = ActiveCell.Offset(2, 0).Top
  Else
    CommandButton1.Enabled = False
End If

' ******************************************************************
' wenn nicht 2 Charts im Blatt vorhanden sind, dann macht es auch
' keinen Sinn, den Trendlinien-Umschalt-Button aktiv zu halten. Dann
' wird er deaktiviert. Sobald alle Charts erstellt sind, kann der
' Button wieder aktiviert werden. Also:

If ChartObjects.Count <> 2 Then
    CommandButton2.Enabled = False
  Else
    CommandButton2.Enabled = True
End If

End Sub
Die Excel Wühlkiste
Valid HTML 4.01 Strict
letzte Aktualisierung: 08.10.2009
Autor: Hubert Scheidgen / 04.02.2006
W3C CSS-Validierungsservice