Excel VBA sheets.count zählt falsch?
Moin!
Ich habe eine Tabelle, die im Ausgangszustand derzeit 9 Sheets hat. Wenn ich nun
angebe, ändert er mir nicht den Namen des neuen Tabellenblattes, sondern den des bisherigen Tabellenblattes 9, weil das neue Tabellenblatt Nr. 10 mit dem Namen "Vorlage (2)" an zweiter Stelle nach der 1 steht.
Wie bringe ich Excel denn an dieser Stelle das richtige Zählen bei?
Solange das neue Blatt immer denselben Namen hätte, wäre das einfach, da ich aber über den gleichen Code wechselweise zwei verschiedene Vorlagen kopiere, ist das eher uncharmant :-o
Y.
Ich habe eine Tabelle, die im Ausgangszustand derzeit 9 Sheets hat. Wenn ich nun
wsVorlage.Copy After:=ThisWorkbook.Sheets(Sheets.Count)
Worksheets(Sheets.Count).Name = NeuerTabName
Worksheets(Sheets.Count).Name = NeuerTabName
angebe, ändert er mir nicht den Namen des neuen Tabellenblattes, sondern den des bisherigen Tabellenblattes 9, weil das neue Tabellenblatt Nr. 10 mit dem Namen "Vorlage (2)" an zweiter Stelle nach der 1 steht.
Wie bringe ich Excel denn an dieser Stelle das richtige Zählen bei?
Solange das neue Blatt immer denselben Namen hätte, wäre das einfach, da ich aber über den gleichen Code wechselweise zwei verschiedene Vorlagen kopiere, ist das eher uncharmant :-o
Y.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 267163
Url: https://administrator.de/forum/excel-vba-sheets-count-zaehlt-falsch-267163.html
Ausgedruckt am: 05.04.2025 um 08:04 Uhr
29 Kommentare
Neuester Kommentar

Moin,
hmm... kann ich hier nicht nachvollziehen. Frage: Hast du mehrere Sheets offen ? Dann solltest du das explizite Worksheets-Objekt für die Count-Eigenschaft angeben.
Lass dir doch mal zwischen den Befehlen das Sheet-Count im Direktbereich ausgeben
ob es überhaupt stimmt.
Gruß jodel32
hmm... kann ich hier nicht nachvollziehen. Frage: Hast du mehrere Sheets offen ? Dann solltest du das explizite Worksheets-Objekt für die Count-Eigenschaft angeben.
Lass dir doch mal zwischen den Befehlen das Sheet-Count im Direktbereich ausgeben
debug.print Sheets.Count
ob es überhaupt stimmt.
Gruß jodel32

Hallo YotYot!
Versuchs mal so:
Grüße Dieter
Versuchs mal so:
wsVorlage.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Grüße Dieter

Hallo YotYot?
Und der Code steht auch in ThisWorkbook?
Grüße Dieter
Und der Code steht auch in ThisWorkbook?
Grüße Dieter

Sehr seltsam, und was macht bei dir folgender Code:
Ist da das selbe Verhalten zu beobachten ? Wenn ja dann wäre das schon ein sehr sehr kurioses Verhalten.
Welche Excel-Version wird verwendet ?
Wurde zufällig der Dezember-Patch für Office eingespielt? Der hat nämlich auch solche komischen Verhaltensweisen verursacht.
Dezember-Update blockiert Excel-Makro
-edit- oder noch eine etwas andere Variante
wsVorlage.Copy After:=wsVorlage
wsVorlage.Next.Move After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "NeuerName"
Welche Excel-Version wird verwendet ?
Wurde zufällig der Dezember-Patch für Office eingespielt? Der hat nämlich auch solche komischen Verhaltensweisen verursacht.
Dezember-Update blockiert Excel-Makro
-edit- oder noch eine etwas andere Variante
wsVorlage.Copy After:=wsVorlage
ActiveSheet.Name = "NeuerName"
ActiveSheet.Move After:=Sheets(Sheets.Count)

Hallo zusammen!
Jetzt dämmerts mir
YotYot redet die Ganze Zeit über die interne VBA-Editor-Tabellenansicht, die sortiert angezeigt wird und nix mit der tatsächlichen Index-Reihenfolge zu tun hat
Grüße Dieter
Jetzt dämmerts mir
YotYot redet die Ganze Zeit über die interne VBA-Editor-Tabellenansicht, die sortiert angezeigt wird und nix mit der tatsächlichen Index-Reihenfolge zu tun hat
Grüße Dieter

Ja nee, der Index gilt nur für die echte Reihenfolge der Tabs in der normalen Ansicht nicht für die im VBA Editor, auf die kannst du beim Index also nicht setzen !! Ist also kein Fehler von Excel, sondern ein Interpretationsfehler deinerseits...

Bedeutet aber, dass ich bei mehr als 9 Tabs keine Chance habe, "Neues Worksheet erstellen am Ende der Liste, letztes Sheet umbenennen" zu veranlassen, ich muss also zwingend über activesheet gehen
Auch wieder Quatsch... siehe die diversen Lösungen von oben.
Moin YotYot,
is' ja nicht mein Fachgebiet, aber lösbar sollte es schon sein.
Excel sortiert die vorhandenen Blätter offensichtlich alphanumerisch nach dem Wert "CodeName".
Das ist das, was in der VBA-Anzeige als"(Name)" angezeigt wird.
Im "deutschen" Excel wird dieser Name fortlaufend vergeben als "Tabelle1", "Tabelle2",...Tabelle9", Tabelle10".
Wenn die alphanumerisch sortiert werden, dann kommt eben "Tabelle1", Tabelle10", Tabelle2"... raus.
Wenn du also immer ein neues Blatt nach dem Letzten neu hinzugefügten einsortieren willst, dann brauchst du doch nur den Namen des Blattes mit dem höchsten Zählerstand aus allen "Codename"n,
Beispiel für eine Function zur Ermittlung des Namens des letzten hinzugekommenen Blattes (wenn denn die CodeNames dem o.a. Muster entsprechen).
So bekommst du IMHO den Namen des Arbeitsblattes, nach dem du anfügen willst.
Wenn deine Arbeitsblätter nach ganz individuellen Kriterien aneinandergereiht werden sollen, dann kannst du ja auf eine "Umsortieren-nach-Liste"-Mimik zurückgreifen, siehe http://www.herber.de/forum/archiv/500to504/500527_Arbeitsblaetter_sorti ....
Grüße
Biber
[Edit] Ungetestete gegen getestete Function getauscht. [/Edit]
is' ja nicht mein Fachgebiet, aber lösbar sollte es schon sein.
Excel sortiert die vorhandenen Blätter offensichtlich alphanumerisch nach dem Wert "CodeName".
Das ist das, was in der VBA-Anzeige als"(Name)" angezeigt wird.
Im "deutschen" Excel wird dieser Name fortlaufend vergeben als "Tabelle1", "Tabelle2",...Tabelle9", Tabelle10".
Wenn die alphanumerisch sortiert werden, dann kommt eben "Tabelle1", Tabelle10", Tabelle2"... raus.
Wenn du also immer ein neues Blatt nach dem Letzten neu hinzugefügten einsortieren willst, dann brauchst du doch nur den Namen des Blattes mit dem höchsten Zählerstand aus allen "Codename"n,
Beispiel für eine Function zur Ermittlung des Namens des letzten hinzugekommenen Blattes (wenn denn die CodeNames dem o.a. Muster entsprechen).
Function GetLastSheetname() As String
Dim imax, jmax, i, j As Long
For i = 1 To Sheets.Count()
j = CInt(Replace(Sheets(i).CodeName, "Tabelle", ""))
If j > Max Then
jmax = j
imax = i
End If
Next
GetLastSheetname = Sheets(imax).Name
End Function
So bekommst du IMHO den Namen des Arbeitsblattes, nach dem du anfügen willst.
Wenn deine Arbeitsblätter nach ganz individuellen Kriterien aneinandergereiht werden sollen, dann kannst du ja auf eine "Umsortieren-nach-Liste"-Mimik zurückgreifen, siehe http://www.herber.de/forum/archiv/500to504/500527_Arbeitsblaetter_sorti ....
Grüße
Biber
[Edit] Ungetestete gegen getestete Function getauscht. [/Edit]
Moin YotYot,
Ähhmm...
Wenn der Test jetzt immer noch läuft, dann könnte es sein, dass ich da aus Versehen eine Endlosschleife reingebugt habe.
Du kannst die Ausführung aber abbrechen mit irgendeiner Tastenkombination - nicht dass du jetzt noch weitere Tage ungeduldig vor dem Rechner wartest.
Grüße
Biber
Ähhmm...
Wenn der Test jetzt immer noch läuft, dann könnte es sein, dass ich da aus Versehen eine Endlosschleife reingebugt habe.
Du kannst die Ausführung aber abbrechen mit irgendeiner Tastenkombination - nicht dass du jetzt noch weitere Tage ungeduldig vor dem Rechner wartest.
Grüße
Biber

Zitat von @Biber:
Wenn der Test jetzt immer noch läuft, dann könnte es sein, dass ich da aus Versehen eine Endlosschleife reingebugt
habe.
Du kannst die Ausführung aber abbrechen mit irgendeiner Tastenkombination - nicht dass du jetzt noch weitere Tage ungeduldig
vor dem Rechner wartest.
@Biber Meinst du der hockt jetzt so vor seiner Kiste Wenn der Test jetzt immer noch läuft, dann könnte es sein, dass ich da aus Versehen eine Endlosschleife reingebugt
habe.
Du kannst die Ausführung aber abbrechen mit irgendeiner Tastenkombination - nicht dass du jetzt noch weitere Tage ungeduldig
vor dem Rechner wartest.

Hallo Y!
Habe jetzt mal ein paar Tests gemacht und ungeachtet dessen, was im VBA-Project zu sehen ist (für den Code uninteressant), ist folgendes dabei rausgekommen:
Kopiere ich z.B. Tabelle1 (Vorlage) nach <After:=Sheets(Sheets.Count)>, dann steht die Kopie in der Excel-Oberfläche am Ende und hat den höchsten Index (Sheets.Count) und ist logischerweise auch das aktive Sheet.
Steht die Kopie nicht am Ende oder wird an einen anderen Platz verschoben, dann erhält das Sheet einen anderen Index und zwar den Reihenfolge-Index von Links nach Rechts.
Ist mir bisher nie aufgefallen, da ich im Anschluss einer Kopie immer dem ActiveSheet einen eindeutigen Namen gegeben habe, was in der Regel eigentlich jeder so macht. Warum bei Dir dadurch eine Verzögerung eintritt ist mir allerdings Schleierhaft?
In diesem Sinne
Gruß Dieter
Habe jetzt mal ein paar Tests gemacht und ungeachtet dessen, was im VBA-Project zu sehen ist (für den Code uninteressant), ist folgendes dabei rausgekommen:
Kopiere ich z.B. Tabelle1 (Vorlage) nach <After:=Sheets(Sheets.Count)>, dann steht die Kopie in der Excel-Oberfläche am Ende und hat den höchsten Index (Sheets.Count) und ist logischerweise auch das aktive Sheet.
Steht die Kopie nicht am Ende oder wird an einen anderen Platz verschoben, dann erhält das Sheet einen anderen Index und zwar den Reihenfolge-Index von Links nach Rechts.
Ist mir bisher nie aufgefallen, da ich im Anschluss einer Kopie immer dem ActiveSheet einen eindeutigen Namen gegeben habe, was in der Regel eigentlich jeder so macht. Warum bei Dir dadurch eine Verzögerung eintritt ist mir allerdings Schleierhaft?
In diesem Sinne
Gruß Dieter

Hallo Y!
Oh Man
Vergiss doch mal den VBA-Editor, der zeigt nun mal nur das Project sortiert an und hat nichts mit den tatsächlichen Gegebenheiten in der Excel-Oberfläche zu tun. Wenn Du die Sheets in der Excel-Oberfläche beliebig verschiebst, ändert sich dadurch im VBA-Editor nix, aber tatsächlich ändern sich die Indexe in der Zählreihenfolge von Links nach Rechts. Je nachdem, an welche Stelle Du ein Sheet kopierst/einfügst, erhält das Sheet den Reihenfolge-Index und ist somit kein zuverlässiger Wert, um auf ein bestimmtes Sheet zuzugreifen. Eine Verzögerung bei ActiveSheet kann ich nicht nachvollziehen, zumal ich bei solchen Operationen <Application.ScreenUpdate> auf False setze...
Grüße Dieter
Oh Man
Grüße Dieter

@ Dieter Dito, habe ich ihm oben auch schon erfolglos versucht zu verklickern ...
Er ist echt hartnäckig
Gruß jodel32
Ja nee, der Index gilt nur für die echte Reihenfolge der Tabs in der normalen Ansicht nicht für die im VBA Editor, auf die kannst du beim Index also nicht setzen !! Ist also kein Fehler von Excel, sondern ein Interpretationsfehler deinerseits...
Er ist echt hartnäckig
Gruß jodel32

Hallo Jodel!

Gruß Dieter
Er ist echt hartnäckig
Yepp, hatte die Hoffnung noch nicht ganz aufgeben, dass es irgendwann doch noch Klick bei ihm machtGruß Dieter

Die Sache ist, dass Ihr, Jodel32 und Eintagsfliege, anscheinend mit anderen Programmen arbeitet.
Nö, du bist da leider der einzige der das nicht verstehen will...sorry. Ich mach nun schon seit Jahren VBA, aber so verar...t wird man selten ...sorry.Der Interne Blattindex beschreibt die Reihenfolge der Blätter in der "normalen" Tabellenansicht "nicht" im VBA Editor, das ist Fakt ! Wenn du das bezweifelst tust tu mir leid, aber das ist nun mal so und war schon immer so, und wird auch so bleiben. Da kannst du noch so hartnäckig bleiben, da ändert sich nichts dran.
Das wird mir Eintagsfliege bestätigen, der auch kein Anfänger in Sachen VBA ist, sondern hier ebenfalls schon diverse professionelle Lösungen präsentiert!
Hallo zusammen,
habe gerade zufällig gerade eure Diskussion mitbekommen. So wie ich das sehe liegt hier immer noch ein Missverständnis des TO vor. Denn ich kann @114757 und @116301 nur zustimmen.
Damit hier nicht weiter aneinander vorbei geredet wird habe ich mal eine kurze Demo in einem Screencast zusammengestellt damit sollte dann jeder Zweifel des TO ausgeschlossen sein:
excel_sheet_index_267163.mp4
Grüße Uwe
habe gerade zufällig gerade eure Diskussion mitbekommen. So wie ich das sehe liegt hier immer noch ein Missverständnis des TO vor. Denn ich kann @114757 und @116301 nur zustimmen.
Damit hier nicht weiter aneinander vorbei geredet wird habe ich mal eine kurze Demo in einem Screencast zusammengestellt damit sollte dann jeder Zweifel des TO ausgeschlossen sein:
excel_sheet_index_267163.mp4
Grüße Uwe

@colinardo : Jup genau so ises ... Steht also inzwischen schon 3 : 1, glaubst uns jetzt immer noch nicht ?