Невозможно обратиться к списку на листе - PullRequest
2 голосов
/ 17 июня 2020

Я раньше не использовал списки, и мне не нужно слишком часто использовать объекты в своей работе, но по какой-то причине мой код работает нормально для этого:

ActiveSheet.ListBox1.AddItem MyName(i)

но если я попробую чтобы получить список с использованием рабочего листа вместо ActiveSheet, он ошибается

wkTest.ListBox1.AddItem MyName(i)

Где test - это рабочий лист, на котором живет ListBox1. Как лучше всего ссылаться на список, если вы хотите ссылаться на него на основе листа? Или это не правильный способ go делать это.

1 Ответ

0 голосов
/ 17 июня 2020

Недостатки элемента управления ActiveX List Box?

Настройка

  • Откройте новый рабочий лист и на вкладке Developers нажмите Insert и под ActiveX Controls щелкните List Box (ActiveX Control).
  • «Нарисуйте» элемент управления на листе. Скопируйте следующий код в стандартный модуль (например, Module1).

Выводы

  • Первая часть кода демонстрирует, что хотя вы может получить доступ к ListBox по его имени через Shapes и OLEObjects collections, оба не предоставляют возможности добавлять элементы в ListBox.
  • Единственный способ сделать это, кажется, используйте CodeName, что демонстрируется в различных решениях во второй части кода.

Это было вдохновлено идеями Рори и Майкла Смита в комментариях.

Код

Option Explicit

Sub ListBoxTest()

    ' Worksheet
    Dim wkTest As Worksheet: Set wkTest = ThisWorkbook.Worksheets("Sheet1")

    ' Shape - no use
    Dim shTest As Shape: Set shTest = wkTest.Shapes("ListBox1")
    Debug.Print "Shape", shTest.Name, shTest.Left
    'shTest.AddItem "One" 'Run-time Error '438': Object doesn't support ...

    ' OLEObject - no use
    Dim ooTest As OLEObject: Set ooTest = wkTest.OLEObjects("ListBox1")
    Debug.Print "OLEObject", ooTest.Name, ooTest.Left
    'ooTest.AddItem "One" 'Run-time Error '438': Object doesn't support ...

    Dim obj As Object

    'Set obj = wkTest.ListBox1 ' Compile error: Method or data member not found.

    ' Object 1 Solution
    Set obj = Worksheets("Sheet1").ListBox1
    Debug.Print "Object 1", obj.Name, obj.Left
    obj.AddItem "One"

    ' Object 2 Solution
    Set obj = Sheet1.ListBox1
    Debug.Print "Object 2", obj.Name, obj.Left
    obj.AddItem "Two"

    ' Object 3 Solution
    wkTest.Activate
    Set obj = ActiveSheet.ListBox1
    Debug.Print "Object 3", obj.Name, obj.Left
    obj.AddItem "Three"

    ' Favorite
    With Sheet1.ListBox1
        Debug.Print "Favorite", .Name, .Left
        .AddItem "Four"
    End With

End Sub

Sub ListBoxClear()
    Dim obj As Object: Set obj = Worksheets("Sheet1").ListBox1
    obj.Clear
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...