Ich habe einen sehr einfachen Code, der ein neues Arbeitsblatt nach den aktuellen Arbeitsblättern zu einem Excel-Dokument hinzufügt und dann seinen Namen in einen Text in einem Benutzerformular ändert. Funktioniert problemlos in einer neuen Arbeitsmappe. In einer Arbeitsmappe mit mehreren vorhandenen Arbeitsblättern wird jedoch das neue Arbeitsblatt erstellt, jedoch nicht umbenannt.Erstellen und Benennen von Arbeitsblättern in Excel VBA
Dies geschieht nur beim ersten Mal, wenn Sie diesen Code ausführen, das nächste Mal wird es gut laufen. Die Sache, die es noch seltsamer macht, ist, dass, wenn Sie den VBA-Editor öffnen, um zu versuchen, es zu debuggen, es dann auch gut läuft. Dies macht es offensichtlich schwierig, den Fehler zu finden.
Der Code Ich verwende hier:
Dim WS As Worksheet
Set WS = Sheets.Add(After:=Sheets(Worksheets.count))
WS.name = txtSheetName.value
Ziemlich einfach. Ich frage mich, ob dieses Problem ist, dass es versucht, das Blatt umzubenennen, bevor es richtig erstellt wird? Gibt es eine bessere Möglichkeit, diesen Code zu schreiben?
Update: Ich habe angefangen, dies mit MsgBoxes debuggen, wie das Debugger Öffnen des Problems Stopp macht, und es scheint, dass es nur den Code beendet die Verarbeitung auf halbem Wege durch:
Dim WS As Worksheet
MsgBox (WS Is Nothing)
Set WS = Sheets.Add(After:=Sheets(Worksheets.count))
'***** Nothing after this point gets processed *******
MsgBox (WS Is Nothing)
MsgBox WS.name
WS.name = txtSheetName.value
MsgBox WS.name
Excel hat viele Möglichkeiten, Sie amüsiert zu halten.Oft können Sie nichts dagegen tun. Probieren Sie verschiedene relativ nutzlose Dinge aus, z. B. die Verwendung der 'Worksheets'-Sammlung anstelle von' Sheets' oder die Zuweisung von 'txtSheetName.value' an eine String-Variable. – GSerg
Es sieht so aus, als ob Sie den Namen festlegen, bevor er in txtSheetName ist. Führen Sie diesen Code vom txtSheetName_Change-Ereignis aus? Wenn nicht, würde das wahrscheinlich das Problem beheben. –
@Marc Das Ereignis wird von einem Schaltflächenereignis ausgeführt, das überprüft, ob das Textfeld festgelegt wurde. –