看图片: 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
Run Code Online (Sandbox Code Playgroud)
您收到该错误的原因只有一个:您提供的名称在集合中不存在!
根据您的代码,有几个可能的原因:
nsName变量包含隐藏字符,即使它看起来正确,也会使其有所不同。根据您的评论,您似乎在错误的工作簿中查找。检查这些下标错误的一个好方法是迭代集合并打印出Names其中包含的内容。
Dim sht as Worksheet
For Each sht In tempWB.Sheets
Debug.Print sht.Name
Next sht
Run Code Online (Sandbox Code Playgroud)
一般来说,最好摆脱对Select和 的调用Activate,以便您不依赖接口来获取对象。请参阅这篇关于避免的文章Select并Activate了解更多信息。
应用于代码的一种想法是直接分配工作簿,而不需要ActiveWorkbook:
Set tempWB = Workbooks.Open(asrSheet.Range("B" & a).Value)
Set dataWB = Workbooks.Open(asrSheet.Range("C" & a).Value)
Run Code Online (Sandbox Code Playgroud)
代替:
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
Run Code Online (Sandbox Code Playgroud)