Создание чувствительного комбинированного списка поиска в VBA для Excel - PullRequest
0 голосов
/ 29 октября 2019

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

Я начал с моей электронной таблицы (4610 строк данных с 11 столбцами данных рядом с каждой). Я пытаюсь создать поле со списком поиска по альфа-чувствительному типу, в котором пользователь должен начать набирать искомую профессию, и в ней должен быть указан, скажем, 8 профессий в качестве пользовательского типа, после чего он может выбрать правильную, которая затем должна отобразить другую. параметры в пользовательской форме.

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

Я вошел в СвойстваComboBox и установите для MatchEntry значение 1 - fmMatchEntryComplete и ControlTipText Начните вводить искомое занятие , а для ListRows - 8.

Я искал в StackOverflow руководство и адаптировал код, отображаемый в следующий поток ?

Вот мой код для ComboBox:

Private Sub ComboBox1_Change()
Dim ws As Worksheet
Dim x, dict
Dim i As Long
Dim str As String

Set ws = Sheets("Occupations")
Set Rng = ws.Range(Cell1:="C2")


x = ws.Range("C2").Value
Set dict = CreateObject("scripting.dictionary")
str = Me.ComboBox1.Value
If str <> "" Then
    For i = 1 To UBound(x, 1)
        If InStr(LCase(x(i, 1)), LCase(str)) > 0 Then
            dict.Item(x(i, 1)) = ""
            End If
        Next i
        Me.ComboBox1.List = dict.Keys
Else
    Me.ComboBox1.List = x
End If
Me.ComboBox1.DropDown


End Sub

Мой список занятий (4610 записей) находится в столбце C2 в Занятиях на листе.

Код для UserForm_Initialise выглядит следующим образом:



Dim occupationName As Range

Dim ws As Worksheet
Set ws = Worksheets("Occupations")


  For Each occupationName In ws.Range(Cell1:="C2")
   With Me.ComboBox1
    .AddItem occupationName.Value
    .List(.ListCount - 1, 1) = occupationName.Offset(0, 1).Value
   End With
 Next occupationName

Me.ComboBox1.SetFocus
Me.ComboBox1.Value = "Type text to open a list of choices"

End Sub

Когда я запускаюкод, я получаю

Ошибка времени выполнения '94' Неправильное использование Null

в str = Me.ComboBox1.Value

Я пробовал парудругих потоков, а также пытался использовать нотацию Nz, но Excel VBA не распознает ее.

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

1 Ответ

0 голосов
/ 29 октября 2019

Я думаю, вы неправильно запустили словарь сценариев. НОВОЕ утверждение отсутствует. Таким образом, словарь сценариев никогда не выполнял свои собственные скрытые настройки и потерпит неудачу.

где-то в заголовке модуля, возможно,

  dim dict as scripting.dictionary
  set dict = NEW scripting.dictionary 'has to be a new ones ;)


  sub dictionary_reset(dict as scripting.dictionary) 'reset the created dictionary
    on error resume next
    err.clear
    on error resume next
     dict.clearAll
     if err.number <>0 then  debug.print err.description 
  end sub 

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

  function addentry(dict as scripting.dictionary key as string ,entry as string ) as 
   boolean 'this you will need very often...
    addentry=false
    on error resume next
    err.clear
     if not dict.exist(key) then
        dict.item(key)=entry;
     else
        dict.add key , entry 
     end if
        if err.number <>0 then  debug.print err.description 
     addentry=err.number=0
  end function

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

  function searchentry(dict as scripting.dictionary key as string ,entry as string ) as 
        boolean
     searchentry=false
     err.clear 
     on error resume netx
     if dict.exists(key) then 
      searchentry=true
      entry=dict.item(key)
     endif
    if err.number <>0 then  debug.print err.description
  searchentry =err.number=0
  end function  

Понятно, что вы хотите максимально использовать из известных Excel. с некоторой практикой вы пойдете противоположным путем. Подумайте об «ЕСЛИ» в Excel;) Может быть, идея пойти прямо противоположным путем. Это также делает код повторно используемым в других приложениях. Это также отличная идея для аутсорсинга таких функций. Затем вы можете легко их отладить с помощью тестовой процедуры без графического интерфейса. И самое главное, они могут быть использованы повторно. Я обычно добавляю также некоторые вещи обработки ошибок.

Кстати: VBA - это ничто иное, как VB6. Если вы не нашли код в VBA, вы можете найти код для VB6.

Веселитесь здесь и наслаждайтесь VBA:)

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