#excel #vba #userform
Вопрос:
Я пытаюсь создать раскрывающийся список в форме пользователя, который будет заполнен уникальными значениями, извлеченными из списка, расположенного в той же книге. Я хочу избежать необходимости печатать этот список уникальных значений. У меня здесь две проблемы:
- Мне не удается создать этот «список уникальных значений».
- Я не знаю, как сделать свой выпадающий список, чтобы использовать ранее сгенерированный список уникальных значений.
Вот моя неудачная попытка (я хочу, чтобы коллекция уникальных значений была составлена из значений в столбце 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 и посмотрите на проверки кода, которые оно генерирует. Будьте готовы вздохнуть, когда увидите, сколько комментариев к проверке генерирует ваш код.