【问题标题】:Creating and Naming Worksheet in Excel VBA [closed]在 Excel VBA 中创建和命名工作表 [关闭]
【发布时间】:2015-04-06 06:49:37
【问题描述】:

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

这只会在您第一次运行此代码时发生,下次它会正常运行。更奇怪的是,如果您打开 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

【问题讨论】:

  • Excel 有很多方法可以让您开心。通常你对此无能为力。尝试各种比较没用的东西,比如用Worksheets集合代替Sheets或者先把txtSheetName.value赋值给一个字符串变量。
  • 看起来您在 txtSheetName 之前设置了名称。您是否在 txtSheetName_Change 事件中运行此代码?如果没有,那可能会解决问题。
  • @Marc 该事件是从一个按钮事件中运行的,该事件验证是否已设置文本框
  • 提示特雷门。看来是时候换羊血和鸡毛了。有什么地方可以下载 xls 文件吗?
  • @marc 很遗憾不是因为它充满了数据,并且只出现在该工作表(或具有相似数据量的工作表)中,较小的工作表没有问题。

标签: vba excel


【解决方案1】:

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

Dim WS as Worksheet
Set WS = Sheets.Add

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

Sheets.Add.Name = "Test"

【讨论】:

  • 这与 OP 所做的有什么不同?
  • 这篇文章不是我写的,我给他指出了一个来源。当我测试文章中的代码,特别是 [Sheets.Add.Name = "test"] 时,它可以完美运行。
  • 是的,我试过了。问题是,它第二次运行完美,或者你打开调试器或者工作表是空白的,或者月亮在第三季度......
【解决方案2】:

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

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

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

更新

其他要尝试的事情:完全限定的引用、抛出一个 Doevents、代码清理。此代码限定您对 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 代码。

【讨论】:

  • 不幸的是,我没有忽略错误,并且该名称在您第二次运行时确实有效,这对我说没关系。
【解决方案3】:

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

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

【讨论】:

  • 它从用户表单上的文本框中获取名称。
猜你喜欢
  • 2018-04-08
  • 1970-01-01
  • 2018-06-14
  • 2017-08-30
  • 2016-08-20
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2023-01-24
相关资源
最近更新 更多