2015-05-29 41 views
1

见图引用在另一工作簿中工作时: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 
+0

表名被正确引用。立即窗口中的“nsName”提供正确的工作表名称。 –

+0

哪条线专门给出错误?另外请注意,不允许在工作簿之前激活工作表,虽然您的代码在那里看起来不错。你在那些'Workbooks'上设置了正确的引用吗?我将使用'Set tempWB = Workbooks.Open(Range(...))'而不是依赖'ActiveWorkbook'来切换。您还可以将您的呼叫限定在'范围'以避免激活所有这些表单。做:'Workbooks.Open asrSheet.Range(...)'而不是“裸”的'范围'。 –

+0

我在第一次设置cSheet = tempWB.Sheets(nsName)时出现错误。 “?nsName”显示正确的引用。我试着改变代码并使用工作表(nsName)。激活,但它突出显示为错误。每当我尝试选择工作表时,都是这样。我用这种方式编写了我制作的其他宏;虽然不完美,但他们完成了这项工作。我被困在这个特殊宏的最简单的步骤中,没有任何理由我可以证明这一点。 –

回答

2

你只能得到错误的原因之一:您提供的集合中不存在的名字!

有一对夫妇的基于代码为这个可能的原因:

  • nsName变量包含隐藏字符,使即使它似乎正确的它不同。
  • 您正在寻找错误工作簿中的工作表。

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

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

在一般情况下,最好是摆脱调用到SelectActivate这样,你是不是为了得到物体依靠的接口。有关更多信息,请参阅this post about avoiding Select and 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 
+0

在我的情况下,我的表名称是阿拉伯语,所以你必须使用显示给用户的表名 – shareef