2016-12-02 121 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