Введите Несоответствие в коде, чтобы заполнить поле со списком. - PullRequest
0 голосов
/ 13 ноября 2018

Вчера этот код работал отлично, но теперь я получаю ошибку времени выполнения несоответствия типов 13. Я пытался исследовать проблему, но недостаточно хорошо понимаю vba, чтобы решить ее.

Все, что я изменил сегодня, - это имена некоторых листов, которые я сейчас отменил, но они все равно не будут работать.

Dim WKB As Workbook
Dim SHT_data_WORKERS As Worksheet
Set WKB = ActiveWorkbook
Set SHT_data_WORKERS = WKB.Sheets("data_WORKERS")
Dim vArr As Variant
Dim i As Integer
vArr = WorksheetFunction.Transpose(SHT_data_WORKERS.Range("B2:B" & SHT_data_WORKERS.Range("B" & Rows.Count).End(xlUp).Row).Value)
With form_addTask.form_addTask_Worker
    .Clear
    For i = LBound(vArr) To UBound(vArr)
        .AddItem vArr(i)
    Next i
End With

РЕДАКТИРОВАТЬ - Я сузил проблему до следующей строки:

vArr = WorksheetFunction.Transpose(SHT_data_WORKERS.Range("B2:B" & SHT_data_WORKERS.Range("B" & Rows.Count).End(xlUp).Row).Value)

Я не получаю никаких ошибок, если на странице SHT_data_WORKERS заполнены две или более строк.

Итак, это структура страницы SHT_data_WORKERS, откуда список извлекается во время ошибки;

ID | Name | Role
1    Chris Engineer

Однако это работает, когда введены две строки;

ID | Name | Role
1    Chris Engineer
2    Test  Engineer

Кто-нибудь сейчас как отформатировать код для работы, когда есть только 1 запись?

Спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

Возможно, на вашем листе указаны недопустимые значения, например, #N/A.Обратите внимание, что это не строка, Excel обрабатывает такие значения ошибок с собственным типом vartype.

Перед добавлением проверьте правильность значения:

    If Not IsError(vArr(i)) Then
        .AddItem vArr(i)
    End If

Обновление (после добавления дополнительной информации к вашему вопросу):
Если ваши данные содержат только одну строку, transpose получит только одну ячейку в качестве параметра (B2:B2).В этом случае в качестве результата вы получите одно значение, а не массив.

Поэтому измените код на

   With form_addTask.form_addTask_Worker
        .Clear
        If IsArray(vArr) Then
            For i = LBound(vArr) To UBound(vArr)
                If Not IsError(vArr(i)) Then .AddItem vArr(i)
            Next i
        Else
            If Not IsError(vArr) Then .AddItem vArr
        End If
    End With

(конечно, вам решать, хотите ли вы сохранитьпроверка на наличие ошибок перед добавлением элемента)

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