Range(ActiveCell.Offset(0, -1).End(xlDown) usw.

Dieses Thema Range(ActiveCell.Offset(0, -1).End(xlDown) usw. im Forum "Microsoft Office Suite" wurde erstellt von klexy, 12. Okt. 2004.

Thema: Range(ActiveCell.Offset(0, -1).End(xlDown) usw. Ich habe eine riesige Tabelle. Irgendwo mittendrin sind die Zellen aus denen ich ein Diagramm machen will (E1: G34)....

  1. Ich habe eine riesige Tabelle. Irgendwo mittendrin sind die Zellen aus denen ich ein Diagramm machen will (E1: G34).
    Im Makro sieht das dann so aus und funktioniert:
    Code:
        Charts.ADD
        ActiveChart.ChartType = xl3DColumn
        ActiveChart.SetSourceData Source:=Sheets(Tabelle2).Range(E1:G34), PlotBy _
            :=xlColumns
    
    In Spalte D ist immer die durchlaufende Nummerierung bis zu der aktuell gültigen Anzahl der Zeilen.

    Aber: Die Tabelle ist jeden Monat neu und hat nicht immer 34 Zeilen, sondern auch mal 10 wie im folgenden Beispiel (- steht für leere Zellen). Links und rechts davon sind jeweils mehr als 50 Zeilen befüllt. Bevor der Befehl zum Diagramm kommt, ist der korrekte Datenbereich durch Makro-Befehle vollständig markiert. Die Markierung beginnt von rechts unten und geht nach links oben. Im Beispiel G9-E1:

    D E F G
    1 - - -
    2 5 2 -
    3 - - -
    4 9 - -
    5 3 - 1
    6 - - -
    7 7 - 2
    8 6 - -
    9 - - 4

    Wie kann ich aus dem absoluten Wert Range(E1:G34) einen relativen Bezug in der Art von Range(ActiveCell, ActiveCell.End(xlDown).Offset(0, 2)) machen?

    Das Problem ist, daß Spalte D, die als einzige ansagt wieviele Zeilen vorhanden sind, nicht Teil des Diagramms werden soll. Der relative Bezug mit End(xlDown) funktioniert also nicht weil in den zu verarbeitenden Werten immer wieder leere Zellen sind (und sein müssen!).

    Es müsste irgendwas mit ActiveRange oder Count.Rows oder so sein, aber ich komm nicht dahinter.

    [Edit]
    Auf folgendes bin ich gekommen:
    Code:
        ActiveChart.SetSourceData Source:=Sheets(Tabelle2).Range(ActiveCell, ActiveCell.Offset(-ActiveCell.Row, -2)), PlotBy _
            :=xlColumns
    
    Das Diagramm wird korrekt ausgegeben, aber dann hängt er sich auf und markiert mir die o.g. Zeile als falsch: Laufzeitfehler->91' Objektvariable oder With-Blockvariable nicht festgelegt :mad:

    Wenn ich folgendes mache:
    Code:
     ActiveChart.SetSourceData Source:=Sheets(Tabelle2).Range(E1, ActiveCell), PlotBy _
            :=xlColumns
    wird das Diagramm auch korrekt ausgegeben und danach hängt er sich auf: Laufzeitfehler->1004' Anwendungs-oder objektdefinierter Fehler
     
  2. Hi klexy,

    folgendes könnte dir helfen

    Gruß Matjes :)

    Code:
    Dim l_rowmax As Long
    
    'Zeile der letzten beschriebenen Zelle in Spalte D auf Tabelle2
    l_rowmax = Worksheets(Tabelle2).Cells(Rows.Count, 4).End(xlUp).Row
    
    
        Charts.Add
        ActiveChart.ChartType = xl3DColumn
       ->Cells(1,5) entspricht E1, Spalte 7 entspricht G
        ActiveChart.SetSourceData _
            Source:=Sheets(Tabelle2).Range(Cells(1, 5), Cells(l_rowmax, 7)), _
            PlotBy:=xlColumns
    
    
     
  3. Oha, jetzt sind wir uns gerade in die Quere gekommen. Ich schau mir deine Lösung gleich mal an. ;D
     
  4. Hm,

    es funktioniert, wirft ein korrektes Diagramm aus und erhängt sich anschließend genau an der Zeile
    Code:
        ActiveChart.SetSourceData _
            Source:=Sheets(Tabelle2).Range(Cells(1, 5), Cells(l_rowmax, 7)), _
            PlotBy:=xlColumns
    
    Auch wenn ich l-rowmax durch den kompletten Ausdruck ersetze, komme ich zum gleichen Ergebnis.

    Die gleichen Formulierungen habe ich auch mit .Select danach getestet. Der gewollte Bereich wird korrekt markiert. Nur mit dem Diagramm funktioniert es nicht. :mad:

    Stößt hier Excel an seine Grenzen?
     
  5. Hi klexy,

    so sollte es gehen.

    Gruß Matjes :)
    Code:
        Source:=Worksheets(Tabelle2).Range( _
                Worksheets(Tabelle2).Cells(1, 5), _
                Worksheets(Tabelle2).Cells(l_rowmax, 7)), _
                PlotBy:=xlColumns
     
  6. Jetzt geht es, allerdings mußte ich eine andere Spalte zum Zählen nehmen, die genau so lang ist wie die Spalte D.

    Es geht allerdings nicht wenn ich das Dim weglasse und es so formuliere:
    Code:
        ActiveChart.SetSourceData _
        Source:=Worksheets(Tabelle2).Range( _
                Worksheets(Tabelle2).Cells(1, 5), _
                Worksheets(Tabelle2).Cells(Worksheets(Tabelle2).Cells(Rows.Count, 11).End(xlUp).Row, 7)), _
                PlotBy:=xlColumns
    
    Warum nicht?
     
  7. Hi klexy,

    so ;)

    Code:
        ActiveChart.SetSourceData _
        Source:=Worksheets(Tabelle2).Range( _
                Worksheets(Tabelle2).Cells(1, 5), _
                Worksheets(Tabelle2).Cells( _
                  Worksheets(Tabelle2).Cells( _
                      Worksheets(Tabelle2).Rows.Count, 11).End(xlUp).Row, 7)), _
                PlotBy:=xlColumns
    
    besser lesbar:
    Code:
       With Worksheets(Tabelle2)
        ActiveChart.SetSourceData _
        Source:=.Range(.Cells(1, 5), _
                .Cells(.Cells(.Rows.Count, 11).End(xlUp).Row, 7)), _
                PlotBy:=xlColumns
      End With
    
     
  8. Danke.
    Da muß ich jetzt wieder lange darüber nachdenken.
    ;D ;D ;D

    Aber wenigstens geht es ohne mein Angst-Thema Dim. Das braucht noch eine Weile.