从变量引用另一个工作簿中的工作表时下标超出范围

Tan*_*man 2 excel vba

看图片: 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)

Byr*_*all 6

您收到该错误的原因只有一个:您提供的名称在集合中不存在!

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

  • 您的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,以便您不依赖接口来获取对象。请参阅这篇关于避免的文章SelectActivate了解更多信息。

应用于代码的一种想法是直接分配工作簿,而不需要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)