Ошибка выполнения 1004 / ошибка 438 при получении свойства Text скопированной кнопки, хотя настройка свойства работает - PullRequest
0 голосов
/ 04 ноября 2019

Я вставил большое количество кнопок управления формой (с текстом "") на лист Excel путем копирования и вставки (из другой книги).

example


Эти кнопки подключены к этому макросу (который находится в файле PERSONAL.XLSB):

Option Explicit

Sub ChangeSomething()
    ' The button which called the macro.
    Dim b As Button
    Set b = ActiveSheet.Buttons(Application.Caller)

    ' Do run the code if the button was not already active.
    If b.Text <> "x" Then        ' SEEMS TO BE THE PROBLEM
        ' Do something

        ' Mark the button as activated.
        b.Text = "x"
        b.Font.Bold = True

    ' If the button was already activated, deactivate it.
    Else
        'Mark the button as deactivated.
        b.Text = " "
    End If
End Sub


Эта настройка ранее работала правильно. Но после копирования я получаю Runtime Error 1004 "Невозможно установить свойство Text класса Button" .

При обработке исключение выглядит как Error 438 "ObjectНе поддерживает это свойство или метод ".


Отладка отмечает строку:

If b.Text <> "x" Then

Меня удивляет то, что получениеКажется, что свойство text выдает ошибку времени выполнения, но установка значения выполняется нормально :

b.Text = "x"

Правильная кнопка на правильном рабочем листе правильной рабочей книги изменена.


Как только я вручную изменяю текст кнопки на что-то отличное от "", макрос, похоже, тоже работает.

К сожалению, вставленные кнопки не отображаются в списке, возвращаемом ActiveSheet.Buttons, поэтому я не могу зациклить их, чтобы изменить их значения.


Я не уверен, что это уместно, но я загрузил здесь образец файла.

1 Ответ

2 голосов
/ 05 ноября 2019

Я не уверен, что ваш вопрос содержит правильные детали. Если эти кнопки действительно являются элементами управления формой - и я думаю, что они должны быть, потому что я считаю, что элементы управления ActiveX не возвращают Caller - тогда их родительский объект - Shapes, и вы бы вызвали свойство Text из Shape.TextFrame.Characters object.

Интересно, был ли на вашем исходном листе объект Collection с именем Buttons , который содержал, возможно, список кнопок в форме объекта класса, называемого * 1010? * Кнопка (отсюда и ваше сообщение об ошибке), которая предоставляет свойства, вызываемые в вашем коде.

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

Public Sub ChangeSomething()
    Dim btn As Shape

    With Application
        'Check for correct data types.
        If Not TypeOf .ActiveSheet Is Worksheet Then Exit Sub
        If IsObject(.Caller) Then Exit Sub

        'Acquire button
        On Error Resume Next
        Set btn = .ActiveSheet.Shapes(.Caller)
        On Error GoTo 0

        'Check for a found button
        If btn Is Nothing Then Exit Sub
    End With

    'Check for non-actionable button.
    With btn.TextFrame.Characters
        If .Count = 0 Then
            .Text = "x"
            Exit Sub
        End If
    End With

    'If we've reached here, it's an actionable button.
    Debug.Print "Do something."

    'Clear the button text.
    btn.TextFrame.Characters.Text = ""

End Sub

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

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