yotyot
Goto Top

Excel VBA sheets.count zählt falsch?

Moin!

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

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.

Content-Key: 267163

Url: https://administrator.de/contentid/267163

Printed on: April 24, 2024 at 11:04 o'clock

Mitglied: 114757
114757 Mar 23, 2015 updated at 08:46:34 (UTC)
Goto Top
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
debug.print Sheets.Count
ob es überhaupt stimmt.

Gruß jodel32
Mitglied: 116301
116301 Mar 23, 2015 at 08:40:35 (UTC)
Goto Top
Hallo YotYot!

Versuchs mal so:
wsVorlage.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)

Grüße Dieter
Member: YotYot
YotYot Mar 23, 2015 at 09:19:05 (UTC)
Goto Top
@114757: Naja, da schreibt er eben, dass "Tabelle 10 (Vorlage (2))" die 2 ist. Und genau das stimmt nicht, es sollte eben die 10 sein. "Tabelle 10" ist hier die interne Zählweise, die aber anscheinend wegen der beginnenden 1 an die zweite Stelle gesetzt wird.
debug.print sagt mir für sheets.count durchaus 10 in Summe an, gibt aber Tabelle 9 aus, wenn ich versuche, das letzte Blatt anzusprechen. debug.print sheets.count.value gibt mir auch den Namen von Tabellenblatt 9 an. Den selbstvergebenen namen wohlgemerkt, nicht den internen Namen "Tabelle9".

Mehrere Sheets offen: nein, es ist nur diese eine Tabelle offen, alle Blätter außer einem einzigen sind ausgeblendet (Visible: 0, xlSheetHidden), wenn ich sie eingeblendet lasse, passiert aber das gleiche.

@116301 Dieter: hat den gleichen Effekt: er sortiert die 10 hinter die 1, nicht hinter die 9.

Da gab es doch früher mal im Windows Dateisystem so eine Sortierungsgeschichte, die genau den gleichen Mist fabriziert hat. In den Optionen von Excel selbst und in den VBA-Editor-Optionen finde ich aber nichts, was mir so auf Anhieb sagen würde: "Das isses".

Es geht ja, geht nur um zwei oder später mal drei, vier Vorlagen. Aber ich würde eben doch gerne mit wiederverwendebarem Code arbeiten, das geht aber nicht, wenn Excel die Zahlen durcheinanderbringt face-sad

Y.
Mitglied: 116301
116301 Mar 23, 2015 at 09:23:49 (UTC)
Goto Top
Hallo YotYot?

Und der Code steht auch in ThisWorkbook?

Grüße Dieter
Mitglied: 114757
114757 Mar 23, 2015 updated at 10:07:38 (UTC)
Goto Top
Sehr seltsam, und was macht bei dir folgender Code:
wsVorlage.Copy After:=wsVorlage
wsVorlage.Next.Move After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "NeuerName"  
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
ActiveSheet.Name = "NeuerName"  
ActiveSheet.Move After:=Sheets(Sheets.Count)
Mitglied: 116301
116301 Mar 23, 2015 at 10:46:44 (UTC)
Goto Top
Hallo zusammen!

Jetzt dämmerts mirface-wink

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 hatface-wink

Grüße Dieter
Member: YotYot
YotYot May 04, 2015 at 15:44:22 (UTC)
Goto Top
Wochen später...

Genau, Dieter, richtig erkannt: es geht um die Reihenfolge im VBA-Editor, Projektfenster. Die Reihenfolge der Tabs ist so, wie ich sie haben will, aber der Index verändert sich.
Ich bin gerade mal wieder an dieser Tabelle zugange und habe noch immer keine Lösung. Das zur Info. Falls jemand eine Lösung hat: nehm' ich! face-big-smile
Mitglied: 114757
114757 May 04, 2015 updated at 16:18:00 (UTC)
Goto Top
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...
Member: YotYot
YotYot May 05, 2015 at 06:20:53 (UTC)
Goto Top
@114757: 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, was nun wieder Anzeigeverzögerungen zur Folge hat. Finde ich jetzt mal nicht befriedigend, vor allem, weil ich das pro Durchlauf in Zukunft durchaus einige hundert mal haben kann. Hintergrund dazu: aus einer Vorlage erstelle ich ein Formular (Rechnungsbeilage, in der Rechnung wird ein Bezug zu diesem individuellen Beileger genannt). Dieser Beileger wird automatisch als PDF abgelegt und im DMS gespeichert wird und kann anschließend in Excel wieder gelöscht werden.

Gibt es ersatzweise vielleicht eine Möglichkeit, in Excel einen solchen AUsdruck, der es ja letztlich ist, mit eingebundenen Grafiken zu erstellen, ohne dazu ein Sheet zu kopieren? Wie "erkläre" ich dem Ausdruck, dass oben und unten rechts jeweils eine Grafik ist? Ein paar Suchworte für Funktionen genügen mir da durchaus.

Wer sagt eigentlich, dass ich das falsch interpretiere? Excel kann nicht richtig zählen, _das_ ist es. Nach der 1 kommt die 2 und nicht die 10! Grrr! face-wink
Mitglied: 114757
114757 May 05, 2015 at 06:55:45 (UTC)
Goto Top
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.
Member: Biber
Biber May 05, 2015 updated at 18:50:46 (UTC)
Goto Top
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).

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]
Member: YotYot
YotYot May 05, 2015 at 08:48:32 (UTC)
Goto Top
Genau das ist aber doch mein Problem: Wenn ich das so mache, wie in Deinem Post vom 23.03., 10:44 Uhr erster Vorschlag, funktioniert genau das nicht, weil im VBA-Editor links oben in der Projektliste die Reihenfolge wie folgt aussieht:

Tabelle1
Tabelle10
Tabelle2
Tabelle3...
Tabelle9

Wenn ich dann den Index abfrage, hat Tabelle9 den höchsten Index. Damit habe ich mir ursprünglich die Tabelle9 zerschossen, weshalb ich die Frage hier überhaupt gestellt habe. Wenn Du mir sagen kannst, wie ich diese Zählweise ändern kann, hab ich, was ich brauche.
Member: YotYot
YotYot May 05, 2015 at 08:52:15 (UTC)
Goto Top
@Biber: Stimmt, damit wäre es machbar. Teste ich nachher mal...
Member: Biber
Biber May 07, 2015 at 16:35:02 (UTC)
Goto Top
Moin YotYot,

Zitat von @YotYot:

@Biber: Stimmt, damit wäre es machbar. Teste ich nachher mal...
Ä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
Mitglied: 114757
114757 May 07, 2015 updated at 16:42:58 (UTC)
Goto Top
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 face-big-smile und wartet auf Erlösung...
Member: Biber
Biber May 07, 2015 updated at 16:53:36 (UTC)
Goto Top
[OT]@ jodel32

Ich glaube, dein Bild ist doch einer von diesen bedauernswerten Windows-Usern, die die Meldung "Windows Updates werden konfiguriert ... 30% - bitte warten" glauben ...

Seine letzten Worte waren "Augenblick noch, Schatz - ich mach nur noch schnell ein Update..."

Grüße
Biber
[/OT]
Mitglied: 116301
116301 May 07, 2015 updated at 22:50:25 (UTC)
Goto Top
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 Sinneface-wink

Gruß Dieter
Member: YotYot
YotYot May 08, 2015 at 06:10:04 (UTC)
Goto Top
face-big-smile
Nein, habe nur zwischendurch was anderes gemacht, das hier musste warten face-smile
Member: YotYot
YotYot May 08, 2015 at 06:42:03 (UTC)
Goto Top
2dedddc54a602178e5f81c50cae8f7f4

Guckst Du!

Das zweite und dritte Tabellenblatt mit den Namen Tabelle10 und Tabelle11 stehen da, wo Tabelle2 und 3 stehen sollten und damit ist im Moment zwar Sheets(Sheets.Count) = 11, aber wenn ich den letzten Index ansprechen will, lande ich aus Tabelle9. Die letzte erstellte ist aber 11. Und dabei ist es egal, ob ich die Blätter von Hand oder per VBA-Code anlege. Ich kann so nicht mit dem letzten Index das letzterstellte Blatt erreichen.

Wie Biber schon bemerkt hat, ist das die alphanumerische Auflistung, die ich gerne umschalten würde, nur dass ich nicht weiß wie und wo. Optionen und Eigenschaften habe ich schon mal durchgesehen, aber nichts gefunden.

Was die zusätzliche, überflüssige Verzögerung angeht: derzeit werden damit regelmäßig etwas über 900 PDF-Dateien erzeugt. Die Verzögerung mit Activesheet ist nur eine Zehntelsekunde oder so. Das mal 900 merkt man dann aber wieder schon. Da die Tendenz steigend ist, ist jede Zehntelsekunde eine zu viel. Aber ich glaube, das war mein eigener Fehler: Ich hatte mal das Problem, dass ein ActiveSheet bei mir immer auch angezeigt wurde, da habe ich vermutlich vergessen, das DisplayUpdate abzuschalten. Das könnte hier der Fall gewesen sein. Damit hätte sich das dann erledigt. Aber für zukünftige Fälle ist es trotzdem interessant, Alternativen zu haben.

Ich setze mich jetzt also wieder vor meinen Fortschrittsbalken und warte, bis er wenigstens 31% erreicht hat face-wink
Mitglied: 116301
116301 May 08, 2015 updated at 10:20:50 (UTC)
Goto Top
Hallo Y!

Oh Manface-sad 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
Mitglied: 114757
114757 May 08, 2015 updated at 08:28:35 (UTC)
Goto Top
@ Dieter Dito, habe ich ihm oben auch schon erfolglos versucht zu verklickern ...

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 face-wink

Gruß jodel32
Mitglied: 116301
116301 May 08, 2015 updated at 10:13:59 (UTC)
Goto Top
Hallo Jodel!
Er ist echt hartnäckigface-smile
Yepp, hatte die Hoffnung noch nicht ganz aufgeben, dass es irgendwann doch noch Klick bei ihm machtface-smile

Gruß Dieter
Member: Biber
Biber May 08, 2015 at 11:28:40 (UTC)
Goto Top
A propos Klick machen...

Was passiert denn nun, wenn du ausführst
....
wsVorlage.Copy After:=ThisWorkbook.Sheets(GetLastSheetName())
Worksheets(GetLastSheetName()).Name = NeuerTabName

...

Das ist ja eigentlich das Einzige, was ich noch wissen wollte... dann geb ich ja Ruhe.

Grüße
Biber
Member: YotYot
YotYot Aug 06, 2015 at 15:13:25 (UTC)
Goto Top
So, es darf weitergehen, ich brauche diese Tabelle wieder und ja: ich bin hartnäckig. Die Sache ist, dass Ihr, Jodel32 und Eintagsfliege, anscheinend mit anderen Programmen arbeitet. Ich arbeite hier vollständig im VBA-Editor, also ist der auch das maßgebliche Ding für mich. Die Reihenfolge der Tabs ist völlig Wurst, wenn ich die verschiebe, ändert sich am Index gar nichts, das ist nur eine Anzeigesache, mehr nicht. Folglich gilt der Index auch und gerade für das, was im VBA-Editor steht, denn so spreche ich die Tabs ja an. Für Eure Tips und Denkanstöße danke ich Euch aber gebracht haben sie leider nichts, da Ihr unter anderem Dinge behauptet, von denen ich nachweisen kann, dass sie nicht stimmen. Was also soll ich tun? Excel überreden, Euch Recht zu geben? Würde ich gerne, wenn es nur ginge.

@Biber: Dein letzter Tip, der ja nun auch schon ein paar Tage alt ist: leider das gleiche wie bisher auch immer: die Reihenfolge der Indizes wird von der Reihenfolge bestimmt, die im VBA-Editor angezeigt wird und da kommt nach der 1 eben die 10 und nicht die 2. Folge ich Deinem Script, passiert folgendes:

Die Vorlage wird kopiert, das letzte Sheet ist zunächst Tabelle9, das neue Sheet wird eingefügt, heißt zunächste "Tabelle1(Tabelle1)" und steht damit an erster oder zweiter Stelle, das kann nich nicht erkennen, weil für eine Sekunde zwei gleich benannte Sheets gibt. Anschließend wird das Sheet umbenannt in "Tabelle10(Tabelle10)" und es steht an zweiter Stelle. In der Tabellenansicht ist das Blatt nun da, wo das Blatt mit dem höchsten Index laut VBA-Editor steht. Wenn also die Reihenfolge in der Tabellenblattansicht Tab1, Tab2, Tab5, Tab6, Tab9, Tab3, Tab7, Tab8 lautet, steht dort das neue Sheet zwischen Tab9 und Tab3. Ich kann also in beiden Fällen nicht auf das letzte Sheet referenzieren, um es umzubenennen.

Ich denke, ich werde mir was komplett anderes überlegen, ich habe inzwischen in mehreren Foren verscuht, eine Lösung zu finden und nirgends habe ich eine funktionierende Idee gefunden, wenn auch die Ansätze oft vielversprechend aussahen.

Danke also an alle, die sich für mich ihren Kopf mit zerbrochen haben!
Mitglied: 114757
114757 Aug 06, 2015 updated at 17:41:23 (UTC)
Goto Top
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!
Member: YotYot
YotYot Aug 07, 2015 at 05:53:32 (UTC)
Goto Top
Nun beweist mir mein Excel 2010 was anderes.

Und nu?
Member: colinardo
colinardo Aug 07, 2015 updated at 07:07:50 (UTC)
Goto Top
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
Mitglied: 114757
114757 Aug 07, 2015 updated at 07:42:56 (UTC)
Goto Top
@colinardo : Jup genau so ises ... Steht also inzwischen schon 3 : 1, glaubst uns jetzt immer noch nicht ?
Member: YotYot
YotYot Aug 07, 2015 at 09:48:28 (UTC)
Goto Top
Moin!

Das Problem ist peinlich banal, aber gelöst :-o

Ich habe das Script aus dem Screencast von Colinardo mal in eine neue Tabelle eingetragen und festgestellt: funktioniert. Auch mit mehr als neun Tabellenblättern.
Anschließend trage ich das also in die Tabelle ein, wo ich es brauche und siehe da: geht nicht.

Tabelle komplett neu erstellt und script wie von Euch seit Ewigkeiten beschrieben und von mir auch ganz von Anfang an versucht: geht. Zwei Tabellen, die jetzt weitgehend gleich aussehen, in der alten geht's nicht, in der neu erstellten funktioniert's. Ich habe bisher immer in der Originaltabelle getestet und daher nicht mitbekommen, dass diese anscheinend irgendwo fehlerhaft ist. Bin einfach nicht auf diese Variante gekommen.

Sorry, dass ich Euch so lange damit genervt habe, ich habe halt immer was anderes gesehen, als das, was Ihr und auch andere gesagt haben.

Nochmal danke an alle und ein schönes Wochenende!

Grüße aus der Versenkung, in die ich gerade verschwunden bin

Jörg