2015-02-12 3 views
1

Я пытаюсь создать подпрограмму для удаления дубликатов из comboboxes. Я вводил число вместо X, когда вызывал подпрограмму. Я получаю сообщение об ошибке «Object Required», когда я получаю подпрограмму. Я знаю, это означает, что что-то не было правильно инициализировано, но я не могу понять, как исправить мою проблему. Любая помощь будет принята с благодарностью. Спасибо.Excel - VBA Удаление дубликатов из Comboboxes

Private Sub UserForm_Initialize() 

'ComboBox Populate 
Dim rngNext As Range 
Dim myRange As Range 
Dim C As Integer 
With Sheets("KEY") 
Set rngNext = .Range("B500").End(xlUp).Offset(1, 0) 
End With 
rngNext.Select 
Set myRange = Range("B2", rngNext) 

With ComboBox1 
For Each rngNext In myRange 

If rngNext <> "" Then .AddItem rngNext 

Next rngNext 
End With 

Call RemoveDuplicates(1) 
End sub 

Private Sub RemoveDuplicates(X) 
'Remove Duplicates 

Dim i As Long 
Dim j As Long 
With "ComboBox" & X 
    For i = 0 To .ListCount + 1 'Getting object required error in this line 
     For j = .ListCount To (i + 1) Step -1 
      If .List(j) = .List(i) Then 
       .RemoveItem j 
      End If 
     Next 
    Next 
End With 
End Sub 

Финальный код

Все работает отлично подходит для удаления дубликатов.

Public allCBoxes As Collection 

Private Sub UserForm_Initialize() 


Set allCBoxes = New Collection 
allCBoxes.Add ComboBox1 

'ComboBox Populate 
Dim rngNext As Range 
Dim myRange As Range 
Dim C As Integer 
With Sheets("KEY") 
Set rngNext = .Range("B500").End(xlUp).Offset(1, 0) 
End With 
rngNext.Select 
Set myRange = Range("B2", rngNext) 

With ComboBox1 
For Each rngNext In myRange 
If rngNext <> "" Then .AddItem rngNext 
Next rngNext 
End With 

Call RemoveDuplicates(1) 
End sub 

Private Sub RemoveDuplicates(X) 
'Remove Duplicates 
Dim i As Long 
Dim j As Long 
With allCBoxes(X) 
    For i = 0 To .ListCount + 1 
     For j = .ListCount -1 To (i + 1) Step -1 
      If .List(j) = .List(i) Then 
       .RemoveItem j 
      End If 
     Next 
    Next 
End With 
End Sub 

ответ

1

Вы получаете сообщение об ошибке, потому что передаете строку, а не объект. Хотя интуитивно вы можете думать, что:

"ComboBox" & X 

будет, например, если х = 5,

ComboBox5 

вы не правы, потому что вы на самом деле строит строку:

"ComboBox5" 

И, очевидно, если вы вызываете метод объекта ComboBox на String, вам будет предложено указать «Object Required». То, что вы хотите сделать, невозможно в VBA, где вы не можете определять имена переменных во время выполнения (т. Е. ComboBox & X, даже если не «как строка», не будет ссылаться на переменную ComboBox5). Для того, чтобы достичь того, что вы хотите, я предлагаю создать публичную коллекцию:

Dim allCBoxes As Collection 

затем заселить его на главной процедуры:

Set allCBoxes = New Collection 
allCBoxes.Add ComboBox1 
allCboxes.Add ComboBox2 
'etc. 

и, наконец, выделение «XTH» выпадающий так:

With allCBoxes(X) 

End With 
+0

Ваш метод также решил проблему с объектом, но теперь я получаю эту ошибку: «Не удалось получить свойство List. Недопустимый индекс массива свойств». – Tyler

+0

@Tyler На какой строке? –

+0

Насколько я могу судить по строке .RemoveItem j во вложенном операторе if. – Tyler

1

Если вы хотите ссылаться на элемент управления, используя его имя string, используйте функцию Controls.

Такие, как:

With Controls("Combobox" & X) 

ли это решить проблему?

+0

Это решило проблему с объектом, но теперь я получаю эту ошибку: «Не удалось получить свойство List. Неверное свойство массив ". – Tyler

+0

Я собираюсь добавить новый ответ, который можно использовать в качестве совершенно другого метода решения основной проблемы: вам нужно иметь поле со списком без дубликатов. Смотри ниже. – user3561813

0

Как уже упоминалось в моем комментарии выше, вот другой подход к решению основной проблемы: нужен combobox без повторяющихся значений. Этот метод использует объект Dictionary.

Сообщите мне, если вы можете приспособить его к вашим потребностям, и если это сработает.

Private Sub UserForm_Initialize() 
    Dim oDictionary As Object 
    Dim strCellContent As String 
    Dim rngComboValues As Range 
    Dim rngCell As Range 

    Set rngComboValues = Range("A1:A26") 
    Set oDictionary = CreateObject("Scripting.Dictionary") 

    For Each rngCell In rngComboValues 
     strCellContent = rngCell.Value 

     If Not oDictionary.exists(strCellContent) Then 
      oDictionary.Add strCellContent, 0 
     End If 
    Next rngCell 

    For Each itm In oDictionary.keys 
     Me.ComboBox1.AddItem itm 
    Next itm 

    Set oDictionary = Nothing 
End Sub