当从variables引用另一个工作簿中的工作表时,下标超出范围

见图片: http : //s12.postimg.org/ov8djtuh9/Capture.jpg

上下文:尝试激活另一个工作簿中的工作表(variables:cSheet),并从其他工作簿的复制数据中粘贴数据。 每当我尝试直接使用variables激活(即Worksheets(Name).Activate),或者尝试使用该variables定义一个工作表,然后将其激活时,我会得到一个下标超出范围的错误。 我也尝试了其他的编码风格,使用“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 

你只有一个原因得到这个错误: 你提供的名字不存在于集合中!

根据你的代码有几个可能的原因:

  • 即使nsNamevariables显示正确,您的nsNamevariables也会包含隐藏字符。
  • 您正在查找错误的工作簿中的工作表。

根据您的意见, 似乎您正在寻找错误的工作簿 。 检查这些下标错误的一个好方法是迭代集合并打印其中包含的Names

 Dim sht as Worksheet For Each sht In tempWB.Sheets Debug.Print sht.Name Next sht 

一般来说,希望摆脱对“ Select和“ Activate的调用,以便您不依赖于接口来获取对象。 看到这个职位关于避免SelectActivate了解更多信息。

应用于您的代码的一个想法是直接分配工作簿没有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