Microsoft Excel

Herbers Excel/VBA-Archiv

Zelleninhalte als Tabellenblattnamen definieren

Betrifft: Zelleninhalte als Tabellenblattnamen definieren von: D_Gonzalez
Geschrieben am: 28.07.2014 11:51:33

Hallo Zusammen,

folgende Situation: ich habe zwei Excel-Dateien geöffnet. Die eine ist eine Aggregationsdatei, aus der bestimmte Daten aus der zweiten, wechselnden Datei ausgelesen werden sollen. In der Aggregationsdatei gibt es ein Tabellenblatt, in dem die für die Datenanalyse relevanten Tabellenblattnamen in einer Spalte untereinander aufgelistet sind.

Ich möchte ein Makro basteln, das in meiner zweiten geöffneten Datei in relevanten Tabellenblättern den vordefininierten Wertebereich ausliest und diesen in der Aggregationsdatei im Tabellenblatt „Werte“ fortlaufend auflistet.

Hier mal das Makro, mit einigen Kommentaren versehen:

Sub Makro()

Dim Anzahl As Integer
Dim i As Integer
Dim dn As Workbook
Dim j As Worksheet

Set dn = ActiveWorkbook ‘die zweite geöffnete Datei hat wechselnde Bezeichnungen; ich will der  _
jeweils geöffneten Datei einen „variablen Wert“ zuweisen, damit ich sie jeweils ansprechen kann

Set myRange = Workbooks("Aggregation.xlsm").Worksheets("Daten").Range("A2:C51")
Anzahl = Application.WorksheetFunction.Count(myRange)

For i = 1 To Anzahl
    j = Workbooks("Aggregation.xlsm").Worksheets("Daten").Cells(i, 1).Name ‘hier erhalte ich  _
einen Laufzeitfehler 1004, Anwendungs- oder objektdefinierter Fehler
    Workbooks(dn).Worksheets(j).Select ‘in der jeweiligen Datei soll das in der Schleife  _
definierte Tabellenblatt j ausgewählt werden

Range("A12:D12").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    ActiveWindow.ScrollWorkbookTabs Sheets:=1 
    Workbooks(dn).Worksheets("Werte").Range("A1000").End(xlUp).Offset(1, 0).Select
    ActiveSheet.Paste 

Next i

End Sub
Kann mir jemand sagen wo der Fehler liegt?

  

Betrifft: AW: Zelleninhalte als Tabellenblattnamen definieren von: Ralf P.
Geschrieben am: 28.07.2014 12:00:30

Hallo,

Anzahl = Application.WorksheetFunction.Count(myRange)

möchtest du die Anzahl der Zellen in dem Range zählen?
Denn:
Anzahl = myRange.Cells.Count

Ansonsten lies die mal die Hilfe zu WorksheetFunction.Count durch.

Wenn du schon den Bereich als Objekt definierst, warum benutzt du dieses Objekt nicht, um den Bereich abzuklappern? Eine Zählschleife bei Ranges macht nur beim Rückwärtsbearbeiten Sinn.

Dim Zelle as Range
For Each Zelle in myRange
Next Zelle

Gruß
Ralf


  

Betrifft: AW: Zelleninhalte als Tabellenblattnamen definieren von: D_Gonzalez
Geschrieben am: 28.07.2014 12:18:01

Hallo Ralf,

ich bin der Meinung, dass dieser Teil des Makros funktioniert. In der wechselnden Datei gibt es eine jeweils unterschiedliche Anzahl von relevanten Tabellenblättern. Ich lasse den Bereich, in dem diese aufgelistet sind zählen, damit die Schleife immer genau sooft wie notwendig durchläuft. Sind im Tabellenblatt "Daten" in Spalte A x Werte, lass die Schleife x mal durchlaufen. Für diesen Zweck ist WorksheetFunction nicht der geeignete Befehl?


  

Betrifft: AW: Zelleninhalte als Tabellenblattnamen definieren von: D_Gonzalez
Geschrieben am: 28.07.2014 12:21:52

Achso ja, ich habe hier eine Information unterschlagen: die Betreffenden Zellen enthalten nur Zahlen (also auch die äquivalenten Tabellenblätter der Datei). Deswegen müsste dieser Befehl funktionieren. Das Problem liegt meiner Einschätzung eher darin, dass ich es nicht schaffe die Inhalte der entsprechenden Zellen als Tabellenblattnamen zu definieren. Ich könnte mich aber natürlich auch täuschen.


  

Betrifft: AW: Zelleninhalte als Tabellenblattnamen definieren von: Ralf P.
Geschrieben am: 28.07.2014 14:53:47

Hallo,

ja, da liegst du richtig
Der Name der Zelle ist etwas anderen als dessen Inhalt.

Inhalt: .Value oder nichts, also
Worksheets("Daten").Cells(i, 1)
oder
Worksheets("Daten").Cells(i, 1).Value

da du aber j als Worksheet deklariert hast, kannst du der Variablen keinen Wert zuweisen sondern ein Objekt.
Am Besten du definierst j als String.
Denn wenn die Zelleninhalte Zahlen sind spricht du mit Worksheets(j) den Index an, nicht den Blattnamen, weswegen j ein String sein sollte.

Übringens: Objekte weißt man bspw einen Wert zu, indem man SET voranstellt, wie du es bei myRange getan hast.

Gruß
Ralf


  

Betrifft: AW: Zelleninhalte als Tabellenblattnamen definieren von: D_Gonzalez
Geschrieben am: 28.07.2014 17:02:54

Hallo Ralf,

die Definition von j als String war für mein Problem offenbar die Lösung. Das entsprechende Blatt wird wie gewünscht angesteuert.

Danke dir!

Viele Grüße
D_Gonzalez


 

Beiträge aus den Excel-Beispielen zum Thema "Zelleninhalte als Tabellenblattnamen definieren"