簡體   English   中英

使用用戶表單輸入工作簿作為參考時下標超出范圍

[英]Subscript out of range when using Userform input workbook as reference

我已經為用戶組合了一個用戶表單來選擇一個打開的工作簿 - 理想情況下希望將其與腳本集成,以便腳本根據所選工作簿運行。 但是,運行腳本時會出現超出范圍的錯誤:


Private Sub Go_Click()

 If ComboBox1.ListIndex = -1 Then
        MsgBox "Please select a workbook name and try again"
        Exit Sub
    End If

    Dim wb As Workbook, copytest As Range, pastetest As Range

    Set wb = Workbooks(ComboBox1.List(ComboBox1.ListIndex))


   Set copytest = wb.Worksheets(2).Columns(6)
   Set pastetest = Workbooks("VBA Workbook.xlsx").Worksheets(1).Columns(1)
   copytest.Copy Destination:=pastetest

        '~~> Do what you want

Debug.Print

End Sub

組合框:

Private Sub UserForm_Initialize()


    Dim wkb As Workbook
    Me.Label1.Caption = "Please select the relevant workbook"
    With Me.ComboBox1
        '~~> Loop thorugh all open workbooks and add
        '~~> their name to the Combobox
        For Each wkb In Application.Workbooks
            .AddItem wkb.Name
        Next wkb
    End With
End Sub

.ListIndex返回一個從 0 到 ListCount - 1 的數字(將其視為基於零的數組)。 因此,當您為第 1 個項目傳遞 0 時(如果選擇了該項目),則 Workbooks(0) 將因超出范圍錯誤而失敗。 其他任何東西都將被列表中的一項關閉,最后一項將永遠無法使用。

相應地調整您的代碼(即,將 1 添加到.ListIndex )。 提示:這就是為什么 -1 表示組合框中沒有任何內容被選中。

通常,您會想要檢查wb是否不是空的。 為了能夠做到這一點,您可以將分配行wb = Workbooks(ComboBox1.List(ComboBox1.ListIndex))On Error Resume Next / On Error GoTo 0包裹起來。 這將暫停您最初遇到的錯誤並讓您的代碼繼續,以便您可以檢查If Not wb Is Nothing Then並相應地繼續。

說了這么多,我建議您使用有意義的名稱而不是Combobox1 此外,您沒有提供如何.Show您的用戶表單。 確保您沒有使用默認實例,並為您的用戶表單提供一個有意義的名稱,並且您為其設置的對象也具有一個有意義的名稱。 以后你會感謝自己。

暫無
暫無

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

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