Как использовать коллекцию для предоставления параметров раскрывающегося списка в форме пользователя — Excel VBA

#excel #vba #userform

Вопрос:

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

  1. Мне не удается создать этот «список уникальных значений».
  2. Я не знаю, как сделать свой выпадающий список, чтобы использовать ранее сгенерированный список уникальных значений.

Вот моя неудачная попытка (я хочу, чтобы коллекция уникальных значений была составлена из значений в столбце H) :

 Private Sub OSizeBox_Click()
Dim arr() As New Collection, a
Dim rng() As Range

Dim LRow As Long

LRow = Cells(Rows.Count, 2).End(xlUp).Row


rng() = Range("H3", "H" amp; LRow)

For Each a In rng
    arr.Add Str(a), Str(a)
Next


OSizeBox.RowSource = arr()

End sub
 

Во время выполнения этого кода я получаю следующую ошибку : «Ошибка компиляции: Недопустимый квалификатор», выделяющий arr в моем цикле For/Next.

Любая помощь или совет были бы очень признательны! Заранее спасибо.

Комментарии:

1. Почему ваши переменные диапазона и коллекции являются массивом? И переменная диапазона, не должна ли она быть установлена, как в объекте set? Чего не происходит? Какие ошибки вы получаете?

2. Спасибо вам за ваш комментарий. Что касается ошибки, пожалуйста, найдите ответ на свой вопрос в моем отредактированном посте. Что касается массива, я должен сказать, что я не знаю, я пытался скопировать некоторые учебные пособия, делающие похожие вещи, и они использовали аналогичный код, используя массивы как для диапазона, так и для коллекции. Пожалуйста, обратите внимание , что я новичок в VBA, я написал несколько макросов, но всегда с очень простыми командами (ограничено if/then, Do/loop, For/next).

3. Не определяйте arr и rng как массивы, уберите скобки и поставьте «Набор» при определении диапазона, установите rng = Диапазон(«H3», … Я думаю, вам все еще нужно кое-что прояснить в синтаксисе. Кроме того, что такое «а»?

Ответ №1:

Попробуйте этот код:

 Option Explicit

Private Sub UserForm_Activate()  'starts when the form becomes active
    Dim col As New Collection, rng As Range, a As Variant
    
    With ThisWorkbook.Worksheets(1)  'your WB and WS
        Set rng = .Range("H3", .Cells(.Rows.Count, "H").End(xlUp))
    End With
    
    On Error Resume Next    ' error suppression if the key is not unique
    For Each a In rng
        col.Add a.Text, a.Text  'added only unique values
    Next
    On Error GoTo 0 ' disable error handling
    
    For Each a In col
        Me.OSizeBox.AddItem a 'add unique values from col
    Next
End Sub
 

Ответ №2:

Хорошо, я попробую.

 Sub OSizeBox_Click()
    Dim arr As New Collection, a
    Dim rng As Range
    Dim LRow As Long

    LRow = Worksheets("Sheet_Name").Cells(Rows.Count, "H").End(xlUp).Row

    Set rng = Worksheets("Sheet_Name").Range("H3:H" amp; LRow)

    For Each a In rng
        ' Debug.Print a
        arr.Add a
    Next

End Sub
 

Это должно быть скомпилировано, надеюсь, это даст вам ваш результат. Всего несколько заметок. Объект диапазона и объект коллекции не обязательно должны быть определены как массивы, вам нужно указать, из какого столбца берется LRow, из вашего диапазона, который я предположил «H», и объекты должны быть установлены. Убедитесь, что «Имя листа» — это имя листа, на котором находятся ваши раскрывающиеся данные.

Надеюсь, это даст вам толчок.

Изменить: Я должен был также заявить, что использую Excel из Microsoft 365, последнюю версию и обновления.

С уважением, Нью-Джерси

Ответ №3:

Эта строка

 Dim arr() As New Collection
 

Указывает VBA создать динамический массив новой коллекции. Если вы посмотрите в окно «Локальные», вы увидите, что после выполнения приведенной выше строки вы получите » arr = Collection ()».

Я подозреваю, что это не то, что вы намеревались, а скорее хотели

‘Arr=коллекция’

В этом случае вам следует использовать

 Dim Arr as Collection
set Arr = new collection
 

Форма «Dim ….как новый объект» разрешена VBA, но не является хорошей практикой программирования.

Если вы используете приведенное выше определение Arr, вы должны обнаружить, что ваш «Arr.add a» должен работать нормально.

Вы можете получить множество отзывов о синтаксических ошибках, если установите бесплатное и фантастическое дополнение Rubberduck для VBA и посмотрите на проверки кода, которые оно генерирует. Будьте готовы вздохнуть, когда увидите, сколько комментариев к проверке генерирует ваш код.