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

Schleife durch Codename

Forumthread: Schleife durch Codename

Schleife durch Codename
06.04.2024 15:36:23
Steve
Hallo Leute,

ich habe ein Problem bei dem ich einfach nicht weiter komme. Vielleicht hat jemand ein hilfreichen Tipp für mich.
Ich beschreibe mal was ich eigentlich möchte und dann wie ich testweise an die Sache herangegangen bin. Vielleicht bin ich auch einfach nur auf dem Holzweg und es gibt eine geschicktere Lösung.

Mein Grobes Ziel:
Ich habe 12 Sheets. Jedes Sheet entspricht einem Monat. Anhand von Datumswerten, bzw. deren Auswertungen sollen ab und bis zu einem gewissen Monat in den Sheets Daten ersetzt, ergänzt oder gelöscht werden. Also brauche ich eine Schleife durch die Monate.

Erste Versuche:
Um mich an die Lösung heranzutasten habe ich folgendes Versucht. Ich habe die 12 Sheets erstellt und wollte am liebsten mit den Codenamen arbeiten, da die durch den User nicht so einfach geändert werden können.
Damit meine Schleife später funktioniert, dachte ich mir, ist es das sinnvollste die Codenamen in einem Array abzulegen und von dort aufzurufen
Meine Idee war, im späteren Verlauf die Datumswerte in einen Monatsstring umzuwandeln und dann mit "tbl_" zu verketten oder alternativ die Position des Monats im Array -1 zu verwenden. Somit hätte ich Beginn und Ende für meine Schleife.
Nun wollte ich, zu Übungszwecken, eine einfache Schleife erstellen die zunächst einfach die Zelle A1 ausliest. Aber daran scheitere ich schon.

Hier mal mein Lösungsansatz:
Sub WerteAusBlätternAusgeben()


Dim SMonat As Worksheet
Dim Monate(1 To 12) As String
Monate(1) = "tbl_JAN"
Monate(2) = "tbl_FEB"
Monate(3) = "tbl_MAR"
Monate(4) = "tbl_APR"
Monate(5) = "tbl_MAI"
Monate(6) = "tbl_JUN"
Monate(7) = "tbl_JUL"
Monate(8) = "tbl_AUG"
Monate(9) = "tbl_SEP"
Monate(10) = "tbl_OKT"
Monate(11) = "tbl_NOV"
Monate(12) = "tbl_DEZ"

Debug.Print tbl_JAN.Range("A1").Value

Dim i As Integer
For i = LBound(Monate) To UBound(Monate)
Debug.Print Monate(i)
Set SMonat = ThisWorkbook.Sheets(Monate(i)).CodeName
Next i
End Sub


Hier habe ich das Array angelegt. Das Debug.Print zeigt mir, dass das Tabellenblatt ansprechbar ist. Es liegt also nicht an etwaigen Tippfehlern im Codenamen.
Grundsätzlich scheint es also zu funktionieren. Aber es sieht so aus, als wenn ich in Set = ..... nicht den Monatsnamen zusammensetzen kann. Ich hatte auch schon versucht den Monatsnamen vorher zusammenzusetzen, in einer Variablen zu speichern und dann zu verwenden. Aber ich erhalte immer den Laufzeitfehler 9.

Was mache ich da falsch? Kann mir da Bitte jemand weiterhelfen?


Liebe Grüße
Steve

PS.: Ich habe auf eine BeispielDatei verzichtet, da sie im Prinzip ja nichts enthält. Sollte eine gefordert sein, sende ich sie aber gerne nach.

Anzeige

27
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife durch Codename
06.04.2024 15:52:07
ralf_b
"Set" wird nur benutzt um Objekte zu referenzieren. ".Codename" gibt einen Text zurück und kein Objekt. Lass ".Codename" weg, dann bekommst du eine Referenz auf das Worksheetobjekt
AW: Schleife durch Codename
06.04.2024 16:03:48
Steve
Hallo Ralf,

leider bekomme ich da immer noch den Laufzeitfehler 9.
Ich ich habe derweil weiter recherchiert und eine ältere Diskussion aus 2019
https://www.herber.de/forum/archiv/1664to1668/1665258_Codename_einer_Variablen_zuweisen.html
gefunden die ich zunächst nicht beachtet hatte weil es danach aussah als wenn eigentlich was anderes gefordert war. Tatsächlich wollte der Fragestelle genau dasselbe wie ich und...die Quintessenz: Man kann den Codenamen nicht aus einem String zusammensetzen und mit Set aufrufen (Vermutlich das falsche Vokabular verwendet - gerne berichtigen)

Also werde ich wohl doch den Blattnamen ansprechen oder mir was anderes überlegen müssen.
Allerdings würde ich die Frage gerne noch einmal weitergeben, vielleicht gibt es mittlerweile eine Lösung zu der Frage.

Lieb Grüße
Steve
Anzeige
AW: Schleife durch Codename
06.04.2024 16:33:40
Onur
    Dim  dict, sh

Set dict = CreateObject("Scripting.Dictionary")
dict.Add "tbl_JAN", 1
dict.Add "tbl_FEB", 1
dict.Add "tbl_MAR", 1
dict.Add "tbl_APR", 1
dict.Add "tbl_MAI", 1
dict.Add "tbl_JUN", 1
dict.Add "tbl_JUL", 1
dict.Add "tbl_AUG", 1
dict.Add "tbl_SEP", 1
dict.Add "tbl_OKT", 1
dict.Add "tbl_NOV", 1
dict.Add "tbl_DEZ", 1
For Each sh In ThisWorkbook.Sheets
If dict.exists(sh.CodeName) Then
'Hier dein Code
'Hier dein Code
End If
Next
Anzeige
AW: Schleife durch Codename
06.04.2024 16:51:35
Steve
Hallo Nur,

Ich danke dir. Aber leider funktioniert Scripting.Dictionary auf dem Mac nicht.
Daran bin ich aber gebunden.

Liebe Grüße
Steve
AW: Schleife durch Codename
06.04.2024 17:05:23
Onur
Ich heisse "ONUR" und nicht nur "Nur". :)

Dann halt so (Fehlerbehandlung aktivieren)
Dim SMonat, sh, i

Dim Monate(1 To 12) As String
Monate(1) = "tbl_JAN"
Monate(2) = "tbl_FEB"
Monate(3) = "tbl_MAR"
Monate(4) = "tbl_APR"
Monate(5) = "tbl_MAI"
Monate(6) = "tbl_JUN"
Monate(7) = "tbl_JUL"
Monate(8) = "tbl_AUG"
Monate(9) = "tbl_SEP"
Monate(10) = "tbl_OKT"
Monate(11) = "tbl_NOV"
Monate(12) = "tbl_DEZ"
For Each sh In ThisWorkbook.Sheets
On Error Resume Next
i = WorksheetFunction.Match(sh.CodeName, Monate, 0)
On Error GoTo 0
If i > 0 Then
'Hier dein Code
Stop
End If
Next
Anzeige
AW: Schleife durch Codename
06.04.2024 17:10:29
Onur
Da fehlt noch was:
Dim SMonat, sh, i

Dim Monate(1 To 12) As String
Monate(1) = "tbl_JAN"
Monate(2) = "tbl_FEB"
Monate(3) = "tbl_MAR"
Monate(4) = "tbl_APR"
Monate(5) = "tbl_MAI"
Monate(6) = "tbl_JUN"
Monate(7) = "tbl_JUL"
Monate(8) = "tbl_AUG"
Monate(9) = "tbl_SEP"
Monate(10) = "tbl_OKT"
Monate(11) = "tbl_NOV"
Monate(12) = "tbl_DEZ"
For Each sh In ThisWorkbook.Sheets
On Error Resume Next
i = 0
i = WorksheetFunction.Match(sh.CodeName, Monate, 0)
On Error GoTo 0
If i > 0 Then
'Hier dein Code
Stop
End If
Next
Anzeige
AW: Schleife durch Codename
06.04.2024 22:23:15
Steve
Hallo Onur,

zunächst einmal, Verzeihung. Das war keine Absicht. Hab meinen Mac neu und noch nicht die automatische Rechtschreibkorrektur rausgenommen die, zugegebener Maßen, sehr nervig ist. Ich habe meinen Schnitzer zum Anlass genommen diesen Umstand abzustellen. Es war keine Absicht.

Irgendwie stand ich bei deinem Code auf dem Schlauch. Aber ich denke ich habe es hinbekommen. Mein Debug.Print wird korrekt ausgegeben und ich denke ich komme ab hier also weiter und kann Tabellen ansprechen, Daten ändern, ergänzen oder löschen.

Ich danke dir für deine Hilfe und werde mich nun dran machen das alles umzusetzen.

Sub Test()

Dim sh As Object, i As Integer, StartDat As Date
Dim Monate(1 To 12) As String
Monate(1) = "tbl_JAN": Monate(2) = "tbl_FEB": Monate(3) = "tbl_MAR"
Monate(4) = "tbl_APR": Monate(5) = "tbl_MAI": Monate(6) = "tbl_JUN"
Monate(7) = "tbl_JUL": Monate(8) = "tbl_AUG": Monate(9) = "tbl_SEP"
Monate(10) = "tbl_OKT": Monate(11) = "tbl_NOV": Monate(12) = "tbl_DEZ"

StartDatum = DateSerial(2024, 1, 15)

For Each sh In ThisWorkbook.Sheets
On Error Resume Next
i = 0
i = WorksheetFunction.Match(sh.CodeName, Monate, 0)
On Error GoTo 0
If i > 0 Then
If Month(StartDatum) = i Then
Debug.Print sh.Range("A1").Value
Exit For
End If
End If
Next sh
End Sub


Herzlichst Steve
Anzeige
Gerne !
06.04.2024 22:47:57
Onur
AW: Gerne !
06.04.2024 23:11:15
Onur
Aber es geht viel einfacher und ohne Schleife:
    Dim M(1 To 12) As String

M(1) = tbl_JAN.Name
M(2) = tbl_FEB.Name
M(3) = tbl_MAR.Name
M(4) = tbl_APR.Name
M(5) = tbl_MAI.Name
M(6) = tbl_JUN.Name
M(7) = tbl_JUL.Name
M(8) = tbl_AUG.Name
M(9) = tbl_SEP.Name
M(10) = tbl_OKT.Name
M(11) = tbl_NOV.Name
M(12) = tbl_DEZ.Name
Sheets(M(12)).Select 'Dezember wird ausgewählt, egal wie das Blatt heisst
Anzeige
Interessant
06.04.2024 23:23:21
Steve
das klingt super. Aber ich glaube ich brauche ohnehin eine Schleife, da ich ja ein Start und ein Enddatum habe. ich muss also prüfen ob "i" kleiner als Start oder größer als Ende ist. Aber ich bin guter Dinge, das ich das schaffe. Ich werde mir das mal mitspeichern.

Ich habe .Select irgendwie nicht mehr auf dem Schirm. Ist es nicht so, das jeder versucht den Laien direkt .Select abzugewöhnen? Oder verwechsel ich das mit was anderem?

Steve
Anzeige
AW: Interessant
06.04.2024 23:25:05
Onur
Das war nur zur DEMO, da musst du natürlich DEINEN Code einsetzen (was immer du mit dem Blatt vorhast).
AW: Interessant
07.04.2024 01:12:18
Oppawinni
Was Onur da macht, ist letztlich nur eine Umsetzung der Codenamen in die Namen der Worksheets
Ein flexibler Zugriff auf ein Worksheet geht halt leichter über den Index oder über den Namen des Worksheets.
Da Namen oder Reihenfolge halt vom User leicht geändert werden können, hat es natürlich seine Tücken über den Namen oder Index zuzugreifen.
Während das Makro läuft kann man aber den Codenamen in Namen oder Index übersetzen, um einfacher zugreifen zu können.
also mit Worksheets(1) oder Worksheets("WasWeißich")
Mit dem Codenamen ist man halt nicht ganz so flexibel.

Beispiel mit Umsetzung in Indizes:
Const cCodeNames = "tbl_JAN,tbl_FEB,tbl_MAR,tbl_APR,tbl_MAI,tbl_JUN,tbl_JUL,tbl_AUG,tbl_SEP,tbl_Okt,tbl_NOV,tbl_DEZ"

Dim wks As Worksheet
Dim i As Long

Dim arrSheetIndizes(1 To 12) As Long

' Umsetzung der CodeNamen in die Indizes der Worksheets
' ginge auch mit arrSheetIndizes(1) = tbl_JAN.Index usw., hier also direkter Zugriff mittels Codename ("hard coded")
' nur um es mal wieder anders zu machen:
For Each wks In ThisWorkbook.Worksheets
i = InStr(cCodeNames, wks.CodeName)
If i > 0 Then
'weil die CodeNamen alle gleich lang sind.
i = i \ 8 + 1
arrSheetIndizes(i) = wks.Index
End If
Next

'ab hier kannst du flexibel ganz "normal" über den Index auf die Worksheets der 12 Monate zugreifen.
For i = 1 To 12
If arrSheetIndizes(i) > 0 Then
With ThisWorkbook.Worksheets(arrSheetIndizes(i))
Debug.Print .CodeName, .Name, .Index
End With
End If
Next

Anzeige
AW: Interessant
07.04.2024 01:16:49
Onur
Ich verstehe dein Problem mit meinem Code nicht.
Bei meinem Code ist es völlig egal, ob Jemand den Namen oder den Index verändert.
AW: Interessant
07.04.2024 07:35:03
Oppawinni
Ich wüsste nicht, dass ich gesagt hätte, dass ich ein Problem mit deinem Code habe. Liest sich das für dich so?
AW: Interessant
06.04.2024 23:28:57
Onur
Es ist praktisch, wie die Excel-Funktion INDIREKT, eine Indirekte Adressierung des Blattes.
Anzeige
AW: Schleife durch Codename
06.04.2024 17:08:01
Piet
Hallo

Sorry, wenn man zu schnell ist, und im Denken falsch liegt! Es klappt auch mit "tbl_Jan"!
Ich hatte den CodeName nicht von Tabelle1 auf "tbl_Jan" geändert!

mfg Piet
AW: Schleife durch Codename
06.04.2024 16:02:34
Oppawinni
Du brauchst doch nur sowas:


Dim wks As Worksheet

For Each wks In ThisWorkbook.Worksheets
Debug.Print wks.CodeName
Next

in der Schleife kannst du dann schauen, inwieweit der CodeName dem gesuchten entspricht das dann für die weitere Verarbeitung fixieren.

Anzeige
AW: Schleife durch Codename
06.04.2024 16:51:14
Piet
Hallo

seltsam, seltsam ist meine Lösung, sie widerspricht meinem logischen Verstand. Aber Excel scheint da stur zu sein!
Lösche bitte mal den Text "tbl_" vor den Monaten weg, und probiere es nur mit "Jan", "Feb" usw. - Dann klappt es!
Laufzeitfehler gibt es noch bei der ersten Debug Zeile. Ich habe sie zum testen auf Kommentar gesetzt..

Die Lösung gab es schon in der 1. Antwort! Du musst bei For Next Schleife bei Set die Endung "Codename" weglassen!

mfg Piet

Sub WerteAusBlätternAusgeben()

Dim SMonat As Worksheet
Dim Monate(1 To 12) As String
Monate(1) = "JAN"
Monate(2) = "FEB"
Monate(3) = "MAR"
Monate(4) = "APR"
Monate(5) = "MAI"
Monate(6) = "JUN"
Monate(7) = "JUL"
Monate(8) = "AUG"
Monate(9) = "SEP"
Monate(10) = "OKT"
Monate(11) = "NOV"
Monate(12) = "DEZ"

'Debug.Print JAN.Range("A1").Value = "aa" '** Laufzeitfehler!

Dim i As Integer
For i = 1 To UBound(Monate)
Debug.Print Monate(i)
Set SMonat = ThisWorkbook.Sheets(Monate(i))
Exit For
Next i

MsgBox SMonat.Name
End Sub
Anzeige
AW: Schleife durch Codename
07.04.2024 10:48:58
Daniel
Hi
Du kannst CodeNames nicht durch Stringvariablen erzeugen. Alles, was nicht in Anführungszeichen steht, ist nicht Variabel.

Als Workaround, um mit Schleifen arbeiten zu können, erstelle ein Array mit den Worksheetobjekten selbst:

Dim Monate(1 to 12) as Worksheet

Set Monate(1) = tbl_JAN
Set Monate(2) = tbl_FEB
...
Set Monate(12) = tbl_DEZ

For i = 1 to 12
Debug.print i, Monate(i).Name, Monate(i).Codename
Next

Gruß Daniel
Anzeige
AW: Schleife durch Codename
06.04.2024 16:54:32
Steve
Hallo Piet,

ich danke dir für deine Lösung. Aber hier verwenden wir nicht den Codenamen des Sheets, sondern den Blattnamen. Den kann der User aber verändern. Deshalb wollte ich es mal mit dem Codenamen versuchen.

Liebe Grüße
Steve
AW: Schleife durch Codename
06.04.2024 16:09:46
Steve
Hallo Oppawinni

ich glaube ich verstehe das nur halb. Du meinst in gehe mit der Schleife durch die Codenamen bis der gewünschte (den ich ja kenne) gefunden wurde. Aber ich bin mir nicht sicher wie ich diesen dann verwende. Also ich müsste ihn doch mit Set= verwenden und dafür müsste ich den vorher gefundenen Codenamen in einer Variablen speichern und Set = mit einer Variablen führt bei mir zu einem Laufzeitfehler 9.

Liebe Grüße
Steve
Anzeige
AW: Schleife durch Codename
06.04.2024 16:18:15
Oppawinni
Naja kannst das worksheet dann einer variablen zuweisen. Den Codenamen benutzt du nur einmal zur Identifikation des Worksheets.

Dim wks As Worksheet

Dim wksFound As Worksheet

Dim strCodeName As String
strCodeName = "Tabelle1"

For Each wks In ThisWorkbook.Worksheets
If wks.CodeName = strCodeName Then
Set wksFound = wks
Exit For
End If
Next

If Not wksFound Is Nothing Then
Debug.Print wksFound.CodeName
End If
Anzeige
AW: Schleife durch Codename
06.04.2024 16:31:31
ralf_b
um das mal zu vereinfachen. wks ist bereits eine Objektvariable mit der Referenz auf ein Worksheet.
wenn du die for-Schleife verlässt hat wks immer noch die Referenz auf das Worksheet und wks kann somit verwendet werden um irgendwas mit dem Worksheet zu erledigen.
AW: Schleife durch Codename
06.04.2024 17:12:24
Oppawinni
Naja, irgendwo muss halt überprüft werden, ob das gesuchte auch gefunden wurde.
Gut, wer sich darauf verlassen will, dass das gesuchte immer dabei ist, braucht das nicht.
Die Prüfung kann man natürlich auch anders lösen.
Anzeige
AW: Schleife durch Codename
06.04.2024 16:48:45
Steve
Hallo Oppawinni,

ich habe das mal flugs getestet. Ich glaube ich habe das soweit verstanden. Anhand meines Startdatums, gelange ich zum Codenamen. Den Suche ich durch das vergleichen mit deinem . Dann kann ich diesen verwenden um mein Code durchzuführen. Um dann zum nächsten Monat zu kommen müsste ich nun die Schleife nochmal durchlaufen lassen damit ich den nächsten Monat finde usw.

Am Ende lasse ich also zwei Schleifen laufen., Die eine findet im Array den nächsten Monat, also den Codenamen und die andere, also deine findet den gefundenen Codenamen in der Sammlung der Sheets, bis ich den Endmonat erreicht habe..Ich werde das mal ausprobieren. Ich danke dir.

Liebe Grüße
Steve
Anzeige
AW: Schleife durch Codename
06.04.2024 23:09:21
Oppawinni
Wie man das am Besten organisiert, hängt davon ab, was da passieren soll.
Auf jedem Blatt das Gleiche, oder verschieden nach Monat, keine Ahnung was da dein Plan ist.
Du könntest z.B in der Schleife über die Worksheets prüfen, inwieweit das jeweilige Blatt eines deiner Blätter ist und wenn ja, dann gleich den Code dazu schreiben.
Du könntest in dieser Schleife eine Select Case haben, das für jedes Blatt spezifischen Code ausführt....
Die Schleife außen herum ist natürlich auch möglich, macht sich auch besonders gut als Geschenk : -))
Anzeige
AW: Schleife durch Codename
06.04.2024 23:19:35
Steve
Hallo Oppawinni,

Im Wesentlichen möchte ich die Daten innerhalb der Sheets anhand von einem Start und zwei Enddaten (hier sticht das eine Enddatum das andere aus) ergänzen, überschreiben oder löschen. Je nach Szenario. Im weiteren Verlauf sollen dann Jedes Sheet einzeln ausgewertet werden und Ergebnisse in das Sheet des aktuellen Monats geschrieben werden. Aber für vieles Davon hab ich schon ein Prototyp geschrieben, es fehlte nur noch die Möglichkeit sich automatisch durch die jeweiligen Sheets durchzuarbeiten.

Ich muss sagen, sowohl deiner, wie auch der Ansatz von Onur gefällt mir sehr gut. Ich werde mit beiden herumtesten und schauen das ich sie verstehe, bzw. auf meine Wünsche anpassen kann.

Ich danke dir für deine Geduld und Hilfe. Das hat mich sehr weiter gebracht. Und in meinem Schlauen Buch von Bernd Held steht sowas leider nicht drin. Er empfiehlt nur den Codenamen des Sheets zu verwenden, was ich dann auch mal umsetzen wollte.


Herzlichst
Steve
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige