2015-01-26 4 views
0

У меня есть набор элементов управления ActiveX и переходниками, которые соответствуют друг другу, как это:Изменение имени в ListBox Excel ActiveX

  1. типов пользователей в ActiveX TextBox,
  2. TextBox_Click запускает выполнение 3 подлодки.
  3. Первая субстанция обновляет значение именованного диапазона на листе; на основе этого значения обновленного таблица создается в Excel, используя функцию смещения
  4. Второй суб копирует диапазон таблицы обновляются в 3 и paste.values ​​в диапазон на листе (для устранения формул)

Вот где он разрушается.

  1. Когда я устанавливаю лист вверх, я создаю один ListBox (ListBox1). Третий из трех подписчиков, упомянутых в № 2 выше, показывает, существует ли в листе ActiveX ListBox1. Если нет, намерение заключается в том, что код будет определять то, что вызывается ListBox (LB1 или LB2 или LB2 и т. Д.), Изменяет имя на «ListBox1» и вставляет таблицу из № 4 выше в ListBox1. Затем команда ListBox1_Click может запускать уникальный набор кода для выполнения.

Сейчас я просто проверяю переключение между именами ListBox1 и ListBox2.

Идея состоит в том, что, например, пользователь вводит в TextBox1, ListBox1 обновляется при каждом нажатии клавиши. Поэтому введите «g», а в списке отобразится 20 имен, начинающихся с первого «g» в листе базы данных. Затем введите «ge», и в списке показано 20 имен, начинающихся с первого «ge» в листе базы данных и т. Д. И т. Д. Пользователь нажимает на имя, а ListBox1_click делает что-то уникальное. Если пользователь вводил текст в TextBox2, они увидели бы разные данные в ListBox (которые я бы хотел переименовать в ListBox2), и если они нажмут уникальный набор кода, ListBox2_Click.

Проблема в №5 - это ошибка «Я получаю ошибку« Объект не поддерживает это свойство или метод »в первый раз, когда я пытаюсь выполнить. Второй раз это нормально. Если я сделаю что-то еще на листе и вернусь к нему, я снова получу ошибку.

Вот код # 5, который находится в модуле:

Sub PutListInListBox() 

    Dim OBJ As Object 

    On Error Resume Next 
     Set OBJ = ActiveSheet.OLEObjects("ListBox1") 
    On Error GoTo 0 

    If OBJ Is Nothing Then 
     ActiveSheet.ListBox2.Name = "ListBox1" 
    End If 

    ActiveSheet.ListBox1.Clear 
    ActiveSheet.ListBox1.List = Sheets("Search Criteria Control").Range("G1:G21").Value 

End Sub 

Я понятия не имею, что я делаю не так, и любая помощь приветствуется.

Надеюсь, я проясню это.

UPATED КОД У меня есть куча ActiveX Lables и текстовых полей, так что я использовал первую форму вы предложили для поиска конкретных случаев имен. Я читал об этом и не вижу, что у меня здесь не так. После ввода в TB5 LB не обновляется. Я перехожу обратно в режим разработки и вижу, что имя по-прежнему является ListBox2.

Любые идеи?

Private Sub TextBox5_Change() 

    Call UpdateValues(TextBox5.Value) 
    Call CopyTable 

    Dim OLEOBJ As OLEObject 

    For Each OLEOBJ In ActiveSheet.OLEObjects 
     Select Case OLEOBJ.Name 
      Case "ListBox1", "ListBox2", "ListBox3" 
       OLEOBJ.Name = "ListBox1" 
       OLEOBJ.ListFillRange = Sheets("Search Criteria Control").Range("G1:G21").Address(external:=True) 
     End Select 
     Exit For 
    Next 

End Sub 
+0

Можете ли вы показать остальные коды? – Davesexcel

+0

Конечно, добавлено выше. Дайте мне знать, если вас больше интересует. Спасибо, что заинтересованы в этом. – mchac

+0

Примечание. Я просто работаю с двумя ТБ и двумя LB, пока я тестирую, как он может работать. – mchac

ответ

0

Я сосредоточусь на вашем кодексе № 5.

Во-первых, если вы меняете имя ListBox Object, лучше итерации Object Collection принадлежит, так как вы не уверены в его имени.Что-то вроде этого:

Dim oleobj As OLEObject 
Dim sh As Worksheet: Set sh = ActiveSheet 

For Each oleobj In sh.OLEObjects 
    Select Case oleobj.Name 
    Case "LB1", "LB2", "ListBox1", "ListBox2" 'put the possible names here 
     oleobj.Name = "ListBox1" 'change it to the name you want 
    End Select 
    Exit For 'if you have more than 1 ListBox 
Next 

Если вы просто хотите, чтобы изменить имя существующего ListBox, затем пропустить проверку.

For Each oleobj In sh.OLEObjects 
    oleobj.Name = "ListBox1" 
    Exit For 'if you have more than 1 ListBox 
Next 

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

oleobj.ListFillRange = Sheets("Search Criteria Control") _ 
    .Range("G1:G21").Address(, , , True) 'add this line within the loop 

Обратите внимание, что вам не нужно очищать предыдущий список. Он будет автоматически обновляться.
Поскольку я не уверен, чего вы хотите достичь целиком, я остановлюсь здесь. HTH, хотя.

+0

Хорошо спасибо. Я буду работать над этим в ближайшее время и вернуться назад. – mchac

+0

Спасибо, что представили случай выбора. Я раньше этого не использовал. Я поставил выше в моем коде, но я делаю что-то неправильно. ListBox не изменяет имя. Я не уверен в правилах на этой доске. Есть ли какая-то проблема с тем, что я отправляю свой код в «ответ», чтобы вы могли видеть, что у меня есть? – mchac

+0

@mchac Нет, не ответ, но добавьте его в свой вопрос. Замените другие коды на то, что вы пробовали и не работаете. – L42

Смежные вопросы