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

Forumthread: alle Sheets mit bestimmten Namen markieren

alle Sheets mit bestimmten Namen markieren
Micha.hal
Hallo Excelperten,
wie kann ich in einer Datei per VBA alle Blätter markieren, deren Name mit einem "a" oder einem "b" endet?
Micha
Anzeige
AW: alle Sheets mit bestimmten Namen markieren
01.10.2009 10:24:08
heide_tr
hallo Micha,
Sub mark()
Dim Sheet As Worksheet
Dim Arr() As String
ReDim Preserve Arr(1 To ActiveWorkbook.Sheets.Count)
i = 0
For Each Sheet In ActiveWorkbook.Sheets
If Right(Sheet.Name, 1) = "a" Or Right(Sheet.Name, 1) = "b" Then
i = i + 1
Arr(i) = Sheet.Name
End If
Next Sheet
If i > 0 Then Sheets(Arr).Select
End Sub
viele Grüße. Heide
Anzeige
Korrektur...
01.10.2009 11:17:56
JogyB
Hi Heide,
Kann es sein, dass Du den Code nicht getestet hast? Da fehlt die Deklaration von i und zudem kann die Selektierung nicht klappen, wenn da noch leere Elemente drin sind.
So funktioniert Dein Code:
Sub mark()
Dim Sheet As Worksheet
Dim Arr() As String
Dim i As Long
ReDim Arr(1 To ActiveWorkbook.Sheets.Count)
i = 0
For Each Sheet In ActiveWorkbook.Sheets
If Sheet.Name Like "*[ab]" Then
i = i + 1
Arr(i) = Sheet.Name
End If
Next Sheet
ReDim Preserve Arr(1 To i)
If i > 0 Then Sheets(Arr).Select
End Sub
Gruss, Jogy
Anzeige
Korrektur der Korrektur
01.10.2009 11:22:10
Erich
H,
wenn i=0 ist, klappt auch schon das ReDim nicht...

Sub mark()
Dim Sheet As Worksheet
Dim Arr() As String
Dim i As Long
ReDim Arr(1 To ActiveWorkbook.Sheets.Count)
i = 0
For Each Sheet In ActiveWorkbook.Sheets
If Sheet.Name Like "*[ab]" Then
i = i + 1
Arr(i) = Sheet.Name
End If
Next Sheet
If i > 0 Then
ReDim Preserve Arr(1 To i)
Sheets(Arr).Select
End If
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Korrektur der Korrektur
01.10.2009 11:58:31
Micha.hal
Genial, ich danke Euch allen für die Hilfe.
Micha
AW: Korrektur der Korrektur
01.10.2009 13:07:29
Erich
Hi Micha,
beim nochmaligen Ansehen der Prozedur sind mir ein paar Dinge aufdgefallen, die ich zwar richtig,
aber überflüssig bzw. nicht so "schön" finde.
Hier zwei neue Versionen (wobei ich "mark3" für die bessere halte):

Sub mark2()
Dim wks As Worksheet, aStr() As String, lngN As Long
ReDim aStr(1 To ActiveWorkbook.Sheets.Count)
For Each wks In ActiveWorkbook.Sheets
If wks.Name Like "*[ab]" Then
lngN = lngN + 1
aStr(lngN) = wks.Name
End If
Next wks
If lngN > 0 Then
ReDim Preserve aStr(1 To lngN)
Sheets(aStr).Select
End If
End Sub
Sub mark3()
Dim wks As Worksheet, aLng() As Long, lngN As Long
ReDim aLng(1 To ActiveWorkbook.Sheets.Count)
For Each wks In ActiveWorkbook.Sheets
If wks.Name Like "*[ab]" Then
lngN = lngN + 1
aLng(lngN) = wks.Index
End If
Next wks
If lngN > 0 Then
ReDim Preserve aLng(1 To lngN)
Sheets(aLng).Select
End If
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Korrektur der Korrektur der Korrektur
01.10.2009 16:06:51
Erich
Hi Micha,
gerade - beim Lesen des Geplänkels zwischen Heide und Jogy - ist mir nich ein Fehler aufgefallen,
der aber nur auftritt, denn die Mappe ein Blatt enthält, das NICHT Tabellenblatt ist (z. B. Diagrammblatt).
wks (vorher "Sheets") ist als Worksheet-Objekt deklariert, soll aber in der For-Each-Schleife
alle Sheets aufnehmen können - auch wenn sie nicht Worksheets sind.
Da es kein Sheet-Objekt gibt, muss man statt "Dim wks as Worksheet" hier "Dim wks As Object" schreiben.
Wenn nur Tabellenblätter selektiert werden sollen, ist mark4 besser,
wenn auch andere Blätter, dann mark5:

Sub mark4()
Dim wks As Worksheet, aLng() As Long, lngN As Long
ReDim aLng(1 To ActiveWorkbook.Worksheets.Count)
For Each wks In ActiveWorkbook.Worksheets
If wks.Name Like "*[ab]" Then
lngN = lngN + 1
aLng(lngN) = wks.Index
End If
Next wks
If lngN > 0 Then
ReDim Preserve aLng(1 To lngN)
Worksheets(aLng).Select
End If
End Sub
Sub mark4()
Dim wks As Object, aLng() As Long, lngN As Long
ReDim aLng(1 To ActiveWorkbook.Sheets.Count)
For Each wks In ActiveWorkbook.Sheets
If wks.Name Like "*[ab]" Then
lngN = lngN + 1
aLng(lngN) = wks.Index
End If
Next wks
If lngN > 0 Then
ReDim Preserve aLng(1 To lngN)
Sheets(aLng).Select
End If
End Sub
@Heide: Fehler macht jeder mal! Ist doch nicht schlimm.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
an den Schlaumeier
01.10.2009 13:11:08
heide_tr
hallo Jogy,
um Deine Frage zu beantworten: ich habe den Code getestet. Wohl nicht gründlich genug, verzeih!
Kann es sein, dass Du "Option explicit" noch nicht verstanden hast? Macht nichts, kann schon mal passieren.
viele Grüße. Heide
AW: an den Schlaumeier
01.10.2009 14:29:00
JogyB
Hallo Heide,
ich habe Option Explicit schon verstanden, deswegen ist bei mir das i auch deklariert.
Und bärbeissig zu reagieren, wenn Du auf Fehler aufmerksam gemacht wirst, hinterläßt nicht unbedingt den besten Eindruck.
Gruss, Jogy
Anzeige
AW: alternative Methode über Select 0
02.10.2009 01:34:37
Daniel
Hi
so gehts auch:
Sub TabSelektiern()
Dim sh As Worksheet
Dim i As Long
For i = -1 To 0
For Each sh In ActiveWorkbook.Worksheets
If sh.Name Like "*[ab]" Then sh.Select i
Next
Next
End Sub
Gruß, Daniel
auch über Select 0
02.10.2009 02:22:14
Erich
Hi Daniel,
wozu braucht es da eine Schleife über i? Damit werden alle Blätter doppelt durchlaufen!
Das sollte ausreichen:

Sub TabSelektiern()
Dim sh As Worksheet, blnR As Boolean
blnR = True        ' alte Selektion entfernen
For Each sh In ActiveWorkbook.Worksheets
If sh.Name Like "*[ab]" Then
sh.Select blnR
blnR = False ' alte Selektion nicht entfernen
End If
Next sh
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: auch über Select 0
02.10.2009 18:07:25
Daniel
Hi
weil ich bei dieser Methode sicherstellen muss, daß zu Beginn des Selektierns mit Erweiterung ein Tabellenblatt aktiv ist, für das die Bedingung zutrifft.
bei einem einfachen Schleifendurchlauf wäre das zu beginn aktive Tabellenblatt auf jeden Fall mit dabei, egal ob es die Bedingung erfüllt der nicht.
bisher ist mir da nichts eleganteres eingefallen, als die Doppelte Schleife.
wobei, gerade fällt mir das hier ein:
Sub TabSelektiern()
Dim sh As Worksheet
Dim i As Boolean
i = True
For Each sh In ActiveWorkbook.Worksheets
If sh.Name Like "*[ab]" Then
sh.Select i
i = False
End if
Next
End Sub
Gruß, Daniel
Anzeige
nicht hingeschaut?
02.10.2009 19:35:43
Erich
Hi Daniel,
vergleich doch mal deine neue Möglichkeit mit dem Code, den ich gepostet hatte.
Ist das nicht exakt das Gleiche? (i heißt bei mir nur blnR)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort und: Schönes Wochenende!
AW: nicht hingeschaut?
02.10.2009 19:43:15
Daniel
Hi
stimmt, ich hab von deinem Beitrag nur den Text gelesen, war mal wieder zu schnell ;-)
Gruß, Daniel
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Alle Blätter mit bestimmten Namen markieren in Excel


Schritt-für-Schritt-Anleitung

Um in Excel alle Blätter mit Namen, die auf "a" oder "b" enden, zu markieren, kannst Du den folgenden VBA-Code verwenden:

Sub mark()
    Dim Sheet As Worksheet
    Dim Arr() As String
    Dim i As Long
    ReDim Arr(1 To ActiveWorkbook.Sheets.Count)
    i = 0
    For Each Sheet In ActiveWorkbook.Sheets
        If Sheet.Name Like "*[ab]" Then
            i = i + 1
            Arr(i) = Sheet.Name
        End If
    Next Sheet
    If i > 0 Then
        ReDim Preserve Arr(1 To i)
        Sheets(Arr).Select
    End If
End Sub
  • Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  • Füge einen neuen Modul hinzu (Einfügen > Modul).
  • Kopiere den obigen Code in das Modulfenster.
  • Schließe den VBA-Editor und kehre zu Excel zurück.
  • Drücke ALT + F8, um das Makro auszuführen.

Häufige Fehler und Lösungen

  1. Fehlende Deklaration von Variablen
    Stelle sicher, dass alle Variablen korrekt deklariert sind. Zum Beispiel: Dim i As Long sollte vor der Verwendung stehen.

  2. Leere Elemente im Array
    Wenn Du leere Elemente im Array hast, kann die Selektierung fehlschlagen. Verwende ReDim Preserve, um das Array anzupassen, nachdem Du die Blätter gezählt hast.

  3. Falscher Objekttyp
    Wenn Du auch andere Arten von Blättern (z.B. Diagrammblätter) berücksichtigen möchtest, ändere Dim Sheet As Worksheet in Dim Sheet As Object.


Alternative Methoden

Eine alternative Methode kann die Verwendung einer zweiten Schleife sein:

Sub TabSelektiern()
    Dim sh As Worksheet
    Dim blnR As Boolean
    blnR = True ' alte Selektion entfernen
    For Each sh In ActiveWorkbook.Worksheets
        If sh.Name Like "*[ab]" Then
            sh.Select blnR
            blnR = False ' alte Selektion nicht entfernen
        End If
    Next sh
End Sub

Diese Methode sorgt dafür, dass nur die gewünschten Blätter markiert werden, indem die Selektion effizient verwaltet wird.


Praktische Beispiele

Hier sind einige praktische Beispiele, die Du ausprobieren kannst:

  1. Markieren von Blättern, die mit "c" oder "d" enden: Ändere einfach die Bedingung im Code:

    If Sheet.Name Like "*[cd]" Then
  2. Markieren aller Blätter in einer bestimmten Arbeitsmappe: Wenn Du nur in einer bestimmten Arbeitsmappe arbeiten möchtest, könntest Du den Namen der Arbeitsmappe angeben.


Tipps für Profis

  • Nutze Option Explicit am Anfang Deines Modul-Codes, um sicherzustellen, dass alle Variablen deklariert sind. Das hilft, Fehler frühzeitig zu erkennen.
  • Experimentiere mit ActiveWorkbook.Worksheets.Count, um die Anzahl der Arbeitsblätter zu ermitteln, die Du bearbeiten möchtest.
  • Halte Deinen Code sauber und kommentiere, um die Lesbarkeit und Wartbarkeit zu verbessern.

FAQ: Häufige Fragen

1. Wie kann ich den Code anpassen, um nur Tabellenblätter zu markieren?
Du kannst die Deklaration von Dim Sheet As Worksheet beibehalten und sicherstellen, dass Du nur mit Worksheets arbeitest.

2. Was passiert, wenn kein Blatt die Bedingung erfüllt?
In diesem Fall wird der Selektionsbefehl einfach übersprungen und es passiert nichts.

3. Kann ich das Makro für andere Bedingungen verwenden?
Ja, ändere einfach die If-Bedingung im Code, um andere Endungen oder Muster zu verwenden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige