Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Excel VBA中创建和命名工作表_Vba_Excel - Fatal编程技术网

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

在Excel VBA中创建和命名工作表,vba,excel,Vba,Excel,我有一些非常简单的代码,可以在当前工作表之后将新工作表添加到Excel文档中,然后将其名称更改为在userform的文本框中输入的名称。在新工作簿上可以正常工作,但在具有多个现有工作表的工作簿中,它会创建新工作表,但不会重命名它 这只在您第一次运行此代码时发生,下次它将正常运行。更奇怪的是,如果您打开VBA编辑器尝试调试它,它也可以正常运行。这显然使查找错误变得非常困难 我使用的代码如下: Dim WS As Worksheet Set WS = Sheets.Add(Af

我有一些非常简单的代码,可以在当前工作表之后将新工作表添加到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

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

Sheets.Add.Name = "Test"

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


一个更好的方法是弹出一个对话框,获取您希望使用的名称。

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

查看可能要检查的无效字符列表

更新

其他需要尝试的事情:完全限定引用、插入Doevents、代码清理。此代码限定您对该工作簿的工作表引用(如果合适,您可以将其更改为ActiveWorkbook)。它还添加了1000个DoEvents(愚蠢的过度使用,但如果某件事情需要一段时间才能完成,这将允许它完成-如果这确实解决了任何问题,您可能只需要一个DoEvents)


最后,每当我有一个愚蠢的VBA问题,根本没有意义,我就使用Rob Bovey的CodeCleaner。它是一个外接程序,将所有模块导出为文本文件,然后重新导入。你也可以手动操作。这一过程会清除任何被破坏的p代码。

这与OP的工作有什么不同?我没有写这篇文章,我给他指出了一个来源。当我测试本文中的代码时,特别是[Sheets.Add.Name=“test”],它工作得非常完美。是的,我已经尝试过了。问题是,当你第二次打开调试器,或者工作表是空的,或者月亮在第三季度的时候,它确实可以完美地工作……Excel有很多方法让你开心。通常你对此无能为力。尝试各种相对无用的方法,例如使用
工作表
集合而不是
工作表
,或者首先将
txtSheetName.value
分配给字符串变量。看起来您是在将名称设置在txtSheetName之前。您是否正在运行txtSheetName\u更改事件的此代码?如果没有,这可能会解决问题。@Marc事件是从按钮事件运行的,该事件验证文本框是否已设置为提示theremin。看来该是吃羊血和鸡毛的时候了。有什么地方可以下载xls文件吗?@marc不幸的是,没有,因为它充满了数据,并且只出现在该工作表中(或数据量相似的工作表中)。较小的工作表没有问题。它是从用户表单的文本框中取名称。不幸的是,没有,我没有忽略错误,这个名字在你第二次运行它的时候就起作用了,这对我来说没关系。
Sheets.Add.Name = "Test"
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