[英]Why am I getting a Subscript Out of Range Error 9 when referencing another Workbook/Worksheet in VBA?
[英]Subscript out of range when referencing a worksheet in another workbook from a variable
查看圖片: http : //s12.postimg.org/ov8djtuh9/Capture.jpg
上下文:嘗試激活另一個工作簿中的工作表(變量:cSheet),然后從另一個工作簿中復制的數據粘貼到該工作表中。 每當我嘗試使用變量直接激活(即Worksheets(Name).Activate)或嘗試使用變量定義工作表然后激活它時,都會收到下標超出范圍的錯誤。 我還嘗試了其他編碼風格,例如使用“ With Worksheet”等,我的代碼雖然更長了,但我還是重新開始了,因為每次我修復某些內容時,都會出問題。 因此,堅持基本原則。 任何幫助將不勝感激。
Sub GenSumRep()
Dim AutoSR As Workbook
Dim asrSheet As Worksheet
Dim tempWB As Workbook
Dim dataWB As Workbook
Dim SecName As String
Dim oldcell As String
Dim nsName As String
Dim cSheet As Worksheet
Set AutoSR = ActiveWorkbook
Set asrSheet = AutoSR.ActiveSheet
For a = 3 To 10
SecName = asrSheet.Range("D" & a).Value
If SecName <> "" Then
Workbooks.Open Range("B" & a).Value
Set tempWB = ActiveWorkbook
'tempWB.Windows(1).Visible = False
AutoSR.Activate
Workbooks.Open Range("C" & a).Value
Set dataWB = ActiveWorkbook
'dataWB.Windows(1).Visible = False
AutoSR.Activate
'Copy paste data
For b = 24 To 29
oldcell = Range("C" & b).Value
If b = 24 Then
nsName = Trim(SecName) & " Data"
Set cSheet = tempWB.Sheets(nsName)
Else
nsName = asrSheet.Range("B" & b).Value
Set cSheet = tempWB.Sheets(nsName)
End If
'Copy
dataWB.Activate
Range(oldcell).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
'Paste
tempWB.Activate
cSheet.Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
b = b + 1
Next b
End If
a = a + 1
Next a
End Sub
出現此錯誤的原因僅一個: 您提供的名稱在集合中不存在!
根據您的代碼,可能有兩個原因:
nsName
變量包含隱藏的字符,即使它看起來正確,也會使其與眾不同。 根據您的評論, 看來您在尋找錯誤的工作簿 。 檢查這些下標錯誤的一個好方法是迭代集合並打印出其中包含的Names
。
Dim sht as Worksheet
For Each sht In tempWB.Sheets
Debug.Print sht.Name
Next sht
通常,希望擺脫對“ Select
和“ Activate
的調用,以便您不依賴接口來獲取對象。 有關更多信息,請參見有關避免Select
和Activate
的文章。
適用於您的代碼的一種想法是在不使用ActiveWorkbook
情況下直接分配工作簿:
Set tempWB = Workbooks.Open(asrSheet.Range("B" & a).Value)
Set dataWB = Workbooks.Open(asrSheet.Range("C" & a).Value)
代替:
Workbooks.Open Range("B" & a).Value
Set tempWB = ActiveWorkbook
'tempWB.Windows(1).Visible = False
AutoSR.Activate
Workbooks.Open Range("C" & a).Value
Set dataWB = ActiveWorkbook
'dataWB.Windows(1).Visible = False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.