Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1104to1108
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
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
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
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
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
Anzeige
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
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

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige