Индекс вне диапазона при использовании рабочей книги ввода пользовательской формы в качестве ссылки - PullRequest
0 голосов
/ 15 февраля 2020

Я собрал пользовательскую форму, чтобы пользователь мог выбрать открытую рабочую книгу - в идеале хотелось бы интегрировать ее со сценарием, чтобы сценарий выполнялся со ссылкой на выбранную рабочую книгу. Однако при запуске скрипта возникает ошибка вне диапазона:


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

1 Ответ

0 голосов
/ 15 февраля 2020

.ListIndex возвращает число, которое идет от 0 до ListCount - 1 (воспринимайте его как массив на основе нуля). Поэтому, когда вы передаете 0 для 1-го элемента (если это то, что выбрано), то рабочие книги (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 свою форму пользователя. Убедитесь, что вы не используете экземпляр по умолчанию, и дайте своему пользователю осмысленное имя, а объект, который вы установили, также будет иметь осмысленное имя. Вы будете благодарить себя позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...