我有一些非常简单的代码,在当前工作表之后将新工作表添加到Excel文档,然后将其名称更改为在userform上的文本框中输入的名称 . 在新工作簿上正常工作,但是在具有许多现有工作表的工作簿中,它会创建新工作表,但不会重命名它 .
这只会在您第一次运行此代码时发生,下次运行正常 . 让它更奇怪的是,如果你打开VBA编辑器尝试调试它,那么它也运行良好 . 这显然使得发现错误非常困难 .
我正在使用的代码在这里:
Dim WS As Worksheet
Set WS = Sheets.Add(After:=Sheets(Worksheets.count))
WS.name = txtSheetName.value
很简单 . 我想知道这个问题是否正在尝试在正确创建之前重命名工作表?有没有更好的方法来编写这段代码?
Update: 我已经开始使用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 回答
http://www.mrexcel.com/td0097.html
你找不到它,或者它的名字是什么,你只需将其称为WS .
如果您仍想以"old fashioned"的方式执行此操作,请尝试以下操作:
你在使用错误处理程序吗?如果您忽略错误并尝试将表单命名为与现有工作表或具有无效字符的名称相同,则可能只是跳过该行 . 请在此处查看CleanSheetName函数
http://www.dailydoseofexcel.com/archives/2005/01/04/naming-a-sheet-based-on-a-cell/
查找您可能要检查的无效字符列表 .
Update
其他要尝试的事项:完全限定的引用,投入Doevents,代码清理 . 此代码限定了Sheets对ThisWorkbook的引用(如果适合,您可以将其更改为ActiveWorkbook) . 它还增加了一千个DoEvents(愚蠢的矫枉过正,但如果需要一段时间才能完成,这将允许它 - 如果这实际上修复了任何东西,你可能只需要一个DoEvents) .
最后,每当我遇到一个没有意义的愚蠢VBA问题时,我就会使用Rob Bovey的CodeCleaner . 它是一个加载项,可将所有模块导出到文本文件,然后重新导入它们 . 你也可以手动完成 . 此过程可清除任何已损坏的p代码 .
您是否在按下按钮之前提交了单元格(按Enter键)?必须先存储单元格的内容,然后才能使用它来命名工作表 .
更好的方法是弹出一个对话框并获取您想要使用的名称 .