【问题标题】:Run time error '9' VBA运行时错误“9”VBA
【发布时间】:2016-12-02 21:19:15
【问题描述】:

我在运行以下代码时收到错误“下标超出范围”; debug 将我指向最后一行:

Dim SrcBook As Workbook
Dim TrgBook As Workbook
Dim SrcSheet As Worksheet
Dim TrgSheet As Worksheet
Dim Sheet_Name As String

Workbooks.Open (CalendarFile)
Sheet_Name = MonthName(Month(SrcSheet.Cells(SrcRow, "D").Value), False)
MsgBox ("Sheet_Name Value is: " & Sheet_Name)
Set TrgSheet = Workbooks(CalendarFile).Worksheets(Sheet_Name)

我已经反复验证 CalendarFile 是一个有效的文件名(我使用完整路径文件名)。 Sheet_Name 也是该工作簿中工作表的有效名称。如果我尝试通过数字索引访问工作表 [即 Workbooks(CalendarFile).Worksheets(11) vs Workbooks(CalendarFile).Worksheets(November)],我会收到类似的错误。 MsgBox 调用验证我为 WorkSheets() 方法提供了正确的工作表名称。

最后,正确定义了 ScrRow - 我可以使用此代码在同一 WorkBook 中操作目标 WorkSheets,因为在玩具/测试应用程序中调用宏,但由于某种原因,当我尝试操作目标时它失败了其他(打开的)工作簿中的工作表。

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • Sheet_Name 应该是 Range 而不是字符串。
  • @Niclas 为什么它是一个范围? MonthName 返回一个字符串。

标签: excel macros vba


【解决方案1】:

如果CalendarFile 是一个有效的文件名,那是你的问题。 Workbooks() 需要的索引是Workbook.Name,而不是它的文件路径。例如,如果CalendarFileC:\Foo\Bar.xlsx,则需要使用Bar.xlsx

至于上面的解释,这真的没关系,因为你应该真的只需获取Workbooks.Open 返回的引用并使用它: p>

Set TrgBook = Workbooks.Open(CalendarFile)
Sheet_Name = MonthName(Month(SrcSheet.Cells(SrcRow, "D").Value), False)
MsgBox ("Sheet_Name Value is: " & Sheet_Name)
Set TrgSheet = TrgBook.Worksheets(Sheet_Name)

【讨论】:

  • 非常感谢!实际上,我错过了您的帖子,并在进一步调整我的 MsgBox 声明以找到错误后发现了这一点 - 我发现打开工作簿本身就是错误,而不是索引工作表。无论如何,我很高兴你能支持我。
  • @kapowpow - 外卖应该是你应该只收集Workbook .Open 为你返回的参考。在这种情况下,您甚至不必使用 Workbooks()
  • 谢谢你的语法建议——我已经实现了。我最初是这样设置的,但后来更改了它,因为我正在构建的宏从来没有起作用,我试图理解为什么。我会改回来的。
【解决方案2】:

找到了解决方案,至少解决了这个问题:

Workbooks.Open (CalendarFile)

需要文件的完整路径名才能打开,但对文件的进一步引用只需要文件名 - 无需附加任何路径。也就是说,

Workbooks(file_name_without_path.xlsx).Worksheets(Sheet_Name)

这非常烦人,应该修复。

【讨论】:

  • Workbooksopen 工作簿的集合。它不适用于关闭的文件。您可以使用 Open 将项目添加到集合中。它按原样工作 --- 没有什么可修复的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多