2016-12-02 207 views
1

当我运行以下代码时,出现'Subscript Out of Range'错误:调试指向我的最后一行:运行时错误'9'VBA

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,但由于某些原因,当我尝试操作时它失败在其他(打开)工作簿中的目标WorkSheets。

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

+0

Sheet_Name应该是'Range'而不是字符串。 – Niclas

+0

@Niclas为什么它会是一个范围? MonthName返回一个字符串。 – Sorceri

回答

1

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

至于上面的解释,其实并不重要,因为你应该真的只是抢到了那Workbooks.Open回报,只是使用参考:

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) 
+0

非常感谢!我实际上错过了你的文章,并在进一步调整我的MsgBox陈述以找到错误后发现了这一点 - 我发现打开工作簿本身就是错误,而不是索引工作表。无论如何,我很高兴你有我的背。 – kapowpow

+0

@kapowpow - 外卖应该是你应该收集'Workbook'作为'.Open'为你带来的参考。在这种情况下,你甚至不应该使用'Workbooks()'。 – Comintern

+0

并感谢你的语法建议 - 我已经实现了它。我原来是这样设置的,但后来改变了它,因为我构建的宏从未起作用,我试图理解为什么。我会改回它。 – kapowpow

0

找到了解决办法,至少这个问题:

Workbooks.Open (CalendarFile) 

需要要打开的文件的全路径名,但该文件还引用需要的只是文件名 - 用附上任何路径。也就是,

Workbooks(file_name_without_path.xlsx).Worksheets(Sheet_Name) 

这是非常讨厌,应该修复。

+1

'Workbooks'是* open *工作簿的集合。它在关闭的文件上不起作用。您可以使用“打开”将项目添加到集合中。它的工作原理---没有什么可以解决的。 – xidgel