Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1316to1320
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

VBA: Alle oder nur EIN Worksheet referenzieren

VBA: Alle oder nur EIN Worksheet referenzieren
12.06.2013 14:10:29
NoNet
Hi VBA-Freaks,
ich stehe gerade etwas auf dem Schlauch :
In Abhängigkeit des Wertes einer Variablen möchte ich einen VBA-Code entweder für ALLE oder nur für das aktuelle Tabellnblatt durchlaufen.
Dazu möchte ich eine Objekt-Variable wsColl verwenden, der ich entweder ALLE Worksheets zuweise oder eben nur das aktuelle Worksheet.
Leider habe ich keinen Plan, mit welchem TYP ich diese Variable deklarieren muss !?!?
Folgenden exemplarischen Code habe ich ausprobiert (die globale Variable blnAllWS) wird ausserhalb mit dem Wert TRUE oder FALSE befüllt !) :
Sub Test()
Dim ws As Worksheet, wsColl 'welchen Typ ?
If blnAllWS Then
Set wsColl = ActiveWorkbook.Worksheets
Else
Set wsColl = ActiveSheet
End If
For Each ws In wsColl
MsgBox ws.Name
Next
End Sub
Wenn wsColl als Variant oder Object deklariert wird, funktioniert der Code nur, wenn blnAllWS = TRUE ist (also alle WS durchlaufen werden).
Ansonsten erscheint in der Zeile "For Each..." der Fehler
Hier ein paar weitere Deklarationstypen und das Ergebnis :

Vielen Dank für euren Denkanstoss,
Gruß, NoNet

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Ich hab
12.06.2013 14:35:51
JACKD
.. zwar keine Ahnung
aber ich würde Vermuten dass es nicht an der Dimensionierung, sondern an der Fehlenden Defiinition / Set liegt.
Denn ..
Du sagst es läuft nur bei
blnAllWS = True
wsColl "gesettet" als alle WS in der Mappe
wenn blnAllWS = false
dann Settest du sie als activesheet
Dann rufst du in der Schleife alle Worksheets in wsColl auf.
Fall 1 : blnAllWS=True (durchläuft alle WS)
Fall 2 : blnAllWS=false (durchläuft alle WS in activeSheet) dass müsste einen Fehler geben..
Warum nicht
Sub Test2()
Dim ws As Worksheet, wsColl 'welchen Typ ?
blnAllWS = False
If blnAllWS Then
Set wsColl = ActiveWorkbook.Worksheets
Else
Set wsColl = ActiveSheet
MsgBox wsColl.Name
Exit Sub
End If
For Each ws In wsColl
MsgBox ws.Name
Next
End Sub
Grüße

Anzeige
Hab die Nachricht falsch Begonnen..
12.06.2013 14:37:02
JACKD
liegt natürlich nicht am fehlenden Setting, dass hatte ich ursprünglich gedacht -.^
Grüße

Danke, aber der Code ist umfangreicher
12.06.2013 14:55:24
NoNet
Hallo Jack,
Danke erstmal für Deinen Beitrag.
Das eigentliche Problem ist natürlich nicht ganz so trivial - daher auch nur exemplarischer Code ;-)
Im realen Fall wird hier natürlich nicht nur der Name des Blattes ausgegeben, sondern viel mehr Aktionen gestartet, d.h. ich hätte den Code entweder redundant schreiben müssen (böser Anfängerfehler !!) oder auslagern müssen und das externe Makro parametrisiert aufrufen müssen :
Sub Test3()
Dim ws As Worksheet, wsColl 'welchen Typ ?
blnAllWS = False 'wird extern befüllt
If blnAllWS Then
Set wsColl = ActiveWorkbook.Worksheets
For Each ws In wsColl
Machwas ws
Next
Else
MachWas ActiveSheet
Exit Sub
End If
End Sub
Sub MachWas(ws) 'Externes Makro - WS als Parameter
MsgBox ws.Name
End Sub
Das wollte ich aber auch nicht, da das aufrufende Makro noch weiteren Code enthält.
Es ging mir auch um das Verständnis, welche Möglichkeit der "Aufzählung" (Collection) es für ein einzelnes Blatt gibt.
Mit Rudis Workaround kann ich jedoch gut arbeiten.
Gruß, NoNet

Anzeige
Okay.. versteh ich
12.06.2013 15:00:50
JACKD
.. Hätte mich da im folgenden sicher auch in deinen erwähnten anfängerfehler Verrannt =)
Aber danke für die Rückmeldung =)
So kann man nur lernen =)
Grüße

das ist doch nur ...
12.06.2013 14:50:32
Rudi
Hallo,
... ein Beispiel Jack.
Es geht NoNet ums Prinzip.
Wie ich ihn kenne, hängen von der Variablen etliche 1000 Zeilen Code ab. ;-)
Bei deinem Code könnte man auf wsColl ganz verzichten.
Sub Test2()
Dim ws As Worksheet
blnAllWs = False
If blnAllWs Then
For Each ws In Worksheets
MsgBox ws.Name
Next
Else
MsgBox ws.Name
End If
End Sub

Gruß
Rudi

Anzeige
Verdammt..
12.06.2013 14:53:15
JACKD
.. du hast schon wieder Recht Rudi..
ICh will auch mal :-D
naja irgendwann mal, wenn ich groß bin ...
=)
Grüße

Korrekt Rudi - siehe meine AW an JackD ;-) _oT
12.06.2013 14:56:14
NoNet
_oT = "ohne Text"

ausgetrickst
12.06.2013 14:39:53
Rudi
Hallo,
du musst nur dafür sorgen, dass wsColl immer eine Auflistung ist.
So klappt das:
Sub Test()
Dim ws As Worksheet, wsColl 'welchen Typ ?
If blnAllWs Then
Set wsColl = ActiveWorkbook.Worksheets
Else
Set wsColl = Sheets(Array(ActiveSheet.Name))
End If
For Each ws In wsColl
MsgBox ws.Name
Next
End Sub

Gruß
Rudi

Danke Rudi - Guter Workaround :-) _oT
12.06.2013 14:46:18
NoNet
_oT = "ohne Text"

Anzeige
das ist natürlich
12.06.2013 14:47:38
JACKD
die schönere Lösung
-.-
Der Weg ist steinig und lang .. sehr lang, sehr steinig
=)

...und diese Steine rollen auch noch... ;-)
12.06.2013 14:58:09
NoNet
Gruß, NoNet :-P

:-D owT.
12.06.2013 15:01:33
JACKD
...

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige