Заполнение списка в многоколоночном списке при запуске - ошибка времени выполнения - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь заполнить три разных столбца списка с информацией о пользователе, указанной на уникальном листе

Мне удалось сделать это с одним столбцом, но у меня возникают проблемы при попытке добавить несколькоколонны.Я хотел бы выбрать необходимые данные и назначить каждому столбцу свой массив, но он постоянно говорит мне, что мой индекс находится вне диапазона.

Если я назначу один диапазон одному массиву, я могу заполнить список со строкой:

Sheet1.name_List.List() = FirstNameArray

В противном случае я попытался использовать следующий код для заполнения всехтри столбца ...

Private Sub Workbook_Open()

    i = 0

    Application.ScreenUpdating() = False

    Sheets("Sheet2").Activate

    N = Cells(1, 1).End(xlDown).Row

    FirstNameArray = Range("A2:A" & N)
    SecondNameArray = Range("B2:B" & N)
    nIDArray = Range("C2:C" & N)

    For i = 0 To N
        With Sheet1.name_List
            .AddItem
            .List(i, 0) = FirstNameArray(i)
            .List(i, 1) = SecondNameArray(i)
            .List(i, 2) = nIDArray(i)
        End With
    Next i

    Sheets("Sheet1").Activate
    Application.ScreenUpdating = True

End Sub

******* РЕДАКТИРОВАТЬ ******

После просмотра комментариев я изменил свой код в следующем блоке:

For i = LBound(FirstNameArray) To UBound(FirstNameArray)
    With Sheet1.name_List
        .AddItem
        .List(i, 0) = FirstNameArray(i, 1)
        .List(i, 1) = SecondNameArray(i, 1)
        .List(i, 2) = nIDArray(i, 1)
    End With
Next i

Похоже, что FirstNameArray присваивает свой первый индекс первому столбцу списка, но я получаю сообщение об ошибке при попытке назначить SecondNameArray.Там указано неверное значение свойства ..

Ответы [ 2 ]

1 голос
/ 05 июля 2019

При назначении диапазона из рабочего листа массиву Variant, независимо от того, является ли диапазон одним столбцом или несколькими столбцами, вы назначаете двумерный массив.Итак, чтобы обратиться к первому элементу в вашем массиве, вам нужно включить второе измерение.Также обратите внимание, что индекс для свойства List основан на 0, а массив - на основе 1.Следовательно, ваш цикл For / Next должен выглядеть следующим образом ...

With Sheet1.name_list
    For i = LBound(FirstNameArray) To UBound(FirstNameArray)
        .AddItem
        .List(i - 1, 0) = FirstNameArray(i, 1)
        .List(i - 1, 1) = SecondNameArray(i, 1)
        .List(i - 1, 2) = nIDArray(i, 1)
    Next i
End With
0 голосов
/ 05 июля 2019

Это происходит потому, что вы "покидаете" массив.

В вашем массиве есть N - 1 значений:
Range("A2:A" & N) с N = 5 даст вам массив с 4 записями (A2, A3, A4, A5).

Но For i = 0 To N зациклится 6 раз, (0,1,2,3,4,5)

Используйте UBound и LBound для зацикливания массивов:

For i = LBound(FirstNameArray) To UBound(FirstNameArray)

Кроме того, ваши Range объекты не полностью квалифицированы и неявно ссылаются на активную таблицу. Подробнее об этом здесь: https://rubberduckvba.wordpress.com/2018/03/15/vba-trap-default-members/

Так, например, сделайте это в начале:
Изменить: теперь использует 2d-массивы, как @Domenic предложил в комментарии OT

Option Explicit

Private Sub Workbook_Open()

    dim i as long
    dim lastRow as long
    dim sht1 as excel.worksheet
    dim sht2 as excel.worksheet
    dim completeArray as Variant


    set sht1 = thisWorkbook.Worksheeets("Sheet1")
    set sht2 = thisWorkbook.Worksheeets("Sheet2")

    Application.ScreenUpdating() = False

    lastRow  = sht2.Cells(1, 1).End(xlDown).Row

    completeArray = sht2.Range("A2:C" & lastRow)

    With sht1.name_List
        .ColumnCount = 3
        'https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/ubound-function
        For i = LBound(completeArray, 1) To UBound(completeArray, 1)
            .AddItem
            .List(i - 1, 0) = completeArray(i, 1)
            .List(i - 1, 1) = completeArray(i, 2)
            .List(i - 1, 2) = completeArray(i, 3)
        Next i
    End With

    sht1.Activate
    Application.ScreenUpdating = True

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