2010-10-01 7 views
23

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 
+1

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

+0

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. –

+0

@Marc Das Ereignis wird von einem Schaltflächenereignis ausgeführt, das überprüft, ob das Textfeld festgelegt wurde. –

Antwort

27

http://www.mrexcel.com/td0097.html

Sie müssen nicht wissen, wo es sich befindet, oder wie es heißt, Sie bezeichnen es nur als WS. diese
Wenn Sie immer noch diese die „altmodische“ Art und Weise zu tun, versuchen:

Sheets.Add.Name = "Test" 
+0

Wie ist das anders als was das OP macht? – GSerg

+0

Ich habe den Artikel nicht geschrieben, ich wies ihn auf eine Quelle. Als ich den Code in dem Artikel getestet habe, insbesondere den [Sheets.Add.Name = "Test"], hat es einwandfrei funktioniert. – Sage

+4

Ja, das habe ich probiert. Das Problem ist, es funktioniert einwandfrei das zweite Mal, oder Sie öffnen den Debugger oder das Blatt ist leer, oder der Mond ist im dritten Quartal ... –

0

Begehen Sie die Zelle, bevor Sie die Taste (Enter drücken)? Der Inhalt der Zelle muss gespeichert werden, bevor sie zum Benennen eines Blatts verwendet werden kann.

Ein besserer Weg, dies zu tun, ist ein Dialogfeld zu öffnen und den gewünschten Namen zu erhalten.

+0

Es nimmt den Namen von einem Textfeld auf einem Benutzerformular. –

2

Verwenden Sie einen Fehlerhandler? Wenn Sie Fehler ignorieren und versuchen, ein Blatt wie ein vorhandenes Blatt oder einen Namen mit ungültigen Zeichen zu benennen, könnte es nur über diese Zeile hinausgehen. Siehe die CleanSheetName Funktion hier

http://www.dailydoseofexcel.com/archives/2005/01/04/naming-a-sheet-based-on-a-cell/

für eine Liste von ungültigen Zeichen, die Sie möglicherweise für überprüfen.

aktualisiert

Andere Dinge zu versuchen: Vollständig qualifizierte Referenzen, in einem DOEVENTS werfen, Code Reinigung. Dieser Code qualifiziert Ihre Sheets-Referenz für ThisWorkbook (Sie können sie in ActiveWorkbook ändern, wenn dies passt). Es fügt auch tausend DoEvents hinzu (dummer Overkill, aber wenn es etwas dauert, um es zu erledigen, wird es dies ermöglichen - Sie brauchen vielleicht nur ein DoEvents, wenn das tatsächlich etwas repariert).

Dim WS As Worksheet 
Dim i As Long 

With ThisWorkbook 
    Set WS = .Worksheets.Add(After:=.Sheets(.Sheets.Count)) 
End With 

For i = 1 To 1000 
    DoEvents 
Next i 

WS.Name = txtSheetName.Value 

Schließlich, wenn ich ein albernes VBA Problem haben, die Sinn macht nicht nur, verwende ich Rob Boveys CodeCleaner. Es ist ein Add-In, das alle Module in Textdateien exportiert und sie dann erneut importiert. Sie können es auch manuell tun. Dieser Prozess räumt jeglichen beschädigten p-Code aus.

+0

Leider nicht, ich ignoriere Fehler nicht, und der Name funktioniert das zweite Mal, wenn Sie es ausführen, was mir sagt, dass es in Ordnung ist. –

Verwandte Themen