在Excel VBA中创建和命名工作表

时间:2010-10-01 15:28:54

标签: vba excel-vba excel

我有一些非常简单的代码,在当前工作表之后将新工作表添加到Excel文档,然后将其名称更改为在userform上的文本框中输入的名称。在新工作簿上正常工作,但是在具有许多现有工作表的工作簿中,它会创建新工作表,但不会重命名它。

这只会在您第一次运行此代码时发生,下次运行正常。让它更奇怪的是,如果你打开VBA编辑器尝试调试它,那么它也运行良好。这显然很难找到错误。

我正在使用的代码在这里:

     Dim WS As Worksheet

     Set WS = Sheets.Add(After:=Sheets(Worksheets.count))
     WS.name = txtSheetName.value

非常简单。我想知道这个问题是否正在尝试在正确创建之前重命名工作表?有没有更好的方法来编写这段代码?

更新 我已经开始使用msgboxes调试它了,因为打开调试器会使问题停止,而且它似乎只是中途处理代码:

  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

3 个答案:

答案 0 :(得分:35)

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

Dim WS as Worksheet
Set WS = Sheets.Add

您不必知道它的位置,或者它的名称是什么,您只需将其称为WS。
如果您仍然希望以“老式”方式执行此操作,请尝试以下方法:

Sheets.Add.Name = "Test"

答案 1 :(得分:3)

您使用的是错误处理程序吗?如果您忽略错误并尝试将表单命名为与现有工作表或具有无效字符的名称相同,则可能只是跳过该行。请参阅此处的CleanSheetName函数

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

表示您可能要检查的无效字符列表。

<强>更新

要尝试的其他事项:完全限定的引用,投入Doevents,代码清理。此代码限定了Sheets对ThisWorkbook的引用(如果适合,您可以将其更改为ActiveWorkbook)。它还增加了一千个DoEvents(愚蠢的矫枉过正,但如果需要一段时间才能完成,这将允许它 - 如果这实际上修复了任何东西,你可能只需要一个DoEvents。)

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

最后,每当我遇到一个没有意义的愚蠢VBA问题时,我就会使用Rob Bovey的CodeCleaner。它是一个加载项,可将所有模块导出到文本文件,然后重新导入它们。你也可以手动完成。这个过程可以清除任何已经存在的损坏的p代码。

答案 2 :(得分:0)

在按下按钮之前是否提交了单元格(按Enter键)?必须先存储单元格的内容,然后才能使用它来命名工作表。

更好的方法是弹出一个对话框并获取您想要使用的名称。