簡體   English   中英

從變量引用另一個工作簿中的工作表時,下標超出范圍

[英]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的調用,以便您不依賴接口來獲取對象。 有關更多信息,請參見有關避免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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM