[英]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.