Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Sheet(Array(..)).Select funktioniert nicht

Forumthread: Sheet(Array(..)).Select funktioniert nicht

Sheet(Array(..)).Select funktioniert nicht
23.08.2013 16:27:00
SK
Hallo,
ich habe ein Workbook mit mehreren Sheets, wovon immer mehrere zusammengehörige in ein neues Workbook kopiert werden soll.
Folgenden Code verwende ich:
Sheets(wert).Select
Sheets(last).Activate
Sheets(wert).Copy
ActiveWorkbook.Colors = Workbooks(Colorfile).Colors
ActiveWorkbook.SaveAs Pfad1 & ste(i), FileFormat:=xlExcel8
Aus irgend einem Grund werden die zusammengehörigen Sheets aber nicht ausgewählt. Die Variable wert hat z.B. folgenden Inhalt: Array("MK3 DA", "MK3 KST")
last hat "MK3 KST"
Verwende ich statt dessen folgenden Code zum Testen mit statischen Werten:
Sheets(Array("MK3 DA", "MK3 KST")).Select
Sheets("MK3 KST").Activate
Sheets(Array("MK3 DA", "MK3 KST")).Copy
funktioniert alles. Ich hab ehrlich gesagt keine Idee mehr :(

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Sheets(last) müsste jedenfalls funktionieren, ...
23.08.2013 18:34:05
Luc:-?
…SK;
bei wert kommt es ggf auf die Deklarierung an, aber du kannst ja auch Konstanten anlegen, denn so flexibel scheint das ja auch nicht zu sein, was du mit den Variablen machst. Also …
Const last$ = "MK3 KST", wert$ = "MK3 DA, MK3 KST"
Da man Konstanten ebenso wie Variablen am PgmAnfang deklariert, dürfte eine ggf spätere Änderung recht einfach sein.
Im Übrigen halte ich solche Blattnamen für kontraproduktiv – Leerzeichen sollte man besser vermeiden! (Viell liegt's ja gerade daran!)
Gruß Luc :-?

Anzeige
AW: Sheet(Array(..)).Select funktioniert nicht
24.08.2013 08:52:16
Beverly
Hi,
also bei mir funktioniert es so korrekt:
   Dim last As Variant
last = Array("MK3 DA", "MK3 KST")
Sheets(last).Copy
Übrigens: bei "Excel Gut" solltest du eigentlich wissen, dass man in VBA zu 99% aller Fälle auf Select/Activate verzichen tann. ;-)


Anzeige
AW: Sheet(Array(..)).Select funktioniert nicht
26.08.2013 15:04:39
SK
Select und Activate habe ich nur zum Debuggen drin, weil es nicht funktioniert.
Das hier funktioniert bei mir auch:
   Dim last As Variant
last = Array("MK3 DA", "MK3 KST")
Sheets(last).Copy
Wenn ich die sheets allerdings dynamisch ermittle, klappt es eben nicht.
Ich habe auch schon versucht, statt des Namens den Index zu verwenden, allerding mit dem selben Problem.
Nochmal zum Hintergrund, das Blatt enthält immer 2 zusammengehörige Arbeitsblätter "....DA" und "....KST). Für jedes Paar soll ein neues Excel-File mit jeweils diesen 2 Blättern erstellt werden. Meine Arrays sehen auch gut aus und enthalten jeweils immer die beiden Sheets, aber das copy schmeist mir dann immer in jedes der Files alle Blätter rein.

Anzeige
AW: Sheet(Array(..)).Select funktioniert nicht
26.08.2013 15:23:41
SK
Hier nochmal der saubere Code. Zum Testen baue ich wert hier als string auf, vorher war das ein array. Funktioniert aber geauso wenig:

For i = 0 To UBound(ste)
wert = ""
For Each Blatt In ActiveWorkbook.Worksheets
If InStr(Blatt.Name, ste(i)) Then
If wert  "" Then
wert = wert & ", "
End If
wert = wert & Blatt.Index
End If
Next Blatt
Sheets(Array(wert)).Copy
ActiveWorkbook.SaveAs Pfad1 & ste(i), FileFormat:=xlExcel8
Next

Anzeige
AW: Sheet(Array(..)).Select funktioniert nicht
26.08.2013 16:08:54
Beverly
1. du baust einen String!! zusammen, Excel benötigt aber ein Array. Entweder du schreibst die Tabellennamen per Schleife in ein Array oder du erstellst aus deinem String per Split ein Array
2. geht das nur mit dem Blattnamen und nicht dem Index


Anzeige
AW: Sheet(Array(..)).Select funktioniert nicht
26.08.2013 16:26:59
SK
Hab den entscheidenden Tipp auch grad gefunden:

Dim ws() As Variant
For i = 0 To UBound(ste)
Erase ws()
k = 0
For Each Blatt In ActiveWorkbook.Worksheets
If InStr(Blatt.Name, ste(i)) Then
ReDim Preserve ws(0 To k)
ws(k) = Blatt.Index
k = k + 1
End If
Next Blatt
Sheets(ws).Copy
ActiveWorkbook.SaveAs Pfad1 & ste(i), FileFormat:=xlExcel8
ActiveWorkbook.Close
Next
Index geht übrigens auch ;)
Wichtig war, den Array als Variant anzulegen, als String und mit Blatt.Name ging auch nicht - strange.
Was mich wundert, dass wenn ich statisch angebe Sheets(Array("...","...")).copy es funktioniert, wenn ich "...","..." zur Laufzeit einsetze nicht. Muss man erstmal drauf kommen.

Anzeige
ReDim ... ws(0 To k) muss man idR nicht ...
26.08.2013 18:34:45
Luc:-?
…SK,
ws(k) genügt, denn Index 0 für das 1.Element ist Standard, es sei denn, du hast etwas anderes eingestellt.
Gruß Luc :-?
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Sheets Array Select in Excel VBA


Schritt-für-Schritt-Anleitung

Um mehrere Arbeitsblätter in Excel VBA auszuwählen und zu kopieren, kannst du ein Array verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Array definieren: Lege ein Array mit den Namen der gewünschten Blätter an.

    Dim ws() As Variant
    ws = Array("MK3 DA", "MK3 KST")
  2. Blätter auswählen: Verwende den Befehl Sheets(ws).Copy, um die Blätter zu kopieren.

    Sheets(ws).Copy
  3. Datei speichern: Speichere die neue Arbeitsmappe unter einem bestimmten Pfad.

    ActiveWorkbook.SaveAs "C:\DeinPfad\Datei.xlsx", FileFormat:=xlExcel8
  4. Arbeitsmappe schließen: Schließe die aktive Arbeitsmappe, wenn du fertig bist.

    ActiveWorkbook.Close

Häufige Fehler und Lösungen

  1. Blätter nicht auswählbar: Wenn du versuchst, ein Array von Blattnamen zu verwenden, stelle sicher, dass die Namen keine Leerzeichen enthalten. Verwende stattdessen Konstanten, um die Blätter zu definieren.

  2. String statt Array: Achte darauf, dass du ein Array übergibst und nicht einen String. Wenn du einen String verwendest, kannst du diesen mit Split in ein Array umwandeln:

    Dim wert As String
    wert = "MK3 DA, MK3 KST"
    ws = Split(wert, ", ")
  3. Dynamische Ermittlung: Wenn du die Blätter dynamisch ermittelst, achte darauf, dass du das Array korrekt füllst. Benutze ReDim Preserve, um das Array während der Schleife zu erweitern.


Alternative Methoden

Eine alternative Methode wäre, die Arbeitsblätter über ihre Indizes auszuwählen. Du kannst die Indizes in ein Array speichern und dann die Blätter auswählen:

Dim ws() As Variant
ReDim ws(0 To 1)
ws(0) = 1 ' Index für "MK3 DA"
ws(1) = 2 ' Index für "MK3 KST"
Sheets(ws).Copy

Diese Methode ist besonders nützlich, wenn sich die Namen der Blätter häufig ändern.


Praktische Beispiele

Hier sind einige praktische Beispiele, die du in deiner VBA-Umgebung ausprobieren kannst:

Sub CopySheets()
    Dim ws() As Variant
    ws = Array("Sheet1", "Sheet2")
    Sheets(ws).Copy
    ActiveWorkbook.SaveAs "C:\DeinPfad\NeueDatei.xlsx", FileFormat:=xlExcel8
    ActiveWorkbook.Close
End Sub

Ein weiteres Beispiel könnte so aussehen:

Sub DynamicCopy()
    Dim ws() As Variant
    Dim i As Integer
    Dim k As Integer
    k = 0
    For i = 1 To Worksheets.Count
        If Worksheets(i).Name Like "MK3*" Then
            ReDim Preserve ws(k)
            ws(k) = Worksheets(i).Name
            k = k + 1
        End If
    Next i
    Sheets(ws).Copy
    ActiveWorkbook.SaveAs "C:\DeinPfad\DynamischeDatei.xlsx", FileFormat:=xlExcel8
    ActiveWorkbook.Close
End Sub

Tipps für Profis

  • Vermeide Select und Activate: Du solltest in der Regel auf die Verwendung von Select und Activate verzichten. Stattdessen kannst du direkt mit den Objekten arbeiten, um die Ausführung zu beschleunigen und den Code sauberer zu halten.

  • Nutze Error Handling: Implementiere Fehlerbehandlung in deinem VBA-Code, um unerwartete Fehler besser zu managen.

    On Error Resume Next
    Sheets(ws).Copy
    If Err.Number <> 0 Then
       MsgBox "Ein Fehler ist aufgetreten: " & Err.Description
    End If
    On Error GoTo 0

FAQ: Häufige Fragen

1. Warum funktioniert Sheets(Array(...)).Select nicht? Das kann daran liegen, dass du ein Array von Blattnamen oder Indizes korrekt definieren musst. Stelle sicher, dass die Namen der Blätter exakt übereinstimmen.

2. Wie kann ich ein dynamisches Array in VBA erstellen? Du kannst ein dynamisches Array mit ReDim und Preserve erstellen, um die Größe des Arrays zur Laufzeit anzupassen. Achte darauf, dass der Datentyp als Variant deklariert ist, um verschiedene Typen zu speichern.

3. Was sind die besten Praktiken für die Arbeit mit Blättern in VBA? Vermeide die Verwendung von Select und Activate, benutze stattdessen direkte Referenzen zu den Arbeitsblättern. Halte deinen Code modular und verwende Funktionen, um wiederkehrende Aufgaben zu kapseln.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige