Вопрос по vba, excel – Как получить имя элемента управления по имени?

6

У меня есть простая функция, где есть поле со списком. Если значение поля со списком равно «Отключить», я отключу текстовое поле B. Существует много комбинированных полей с соответствующими текстовыми полями B, расположенными в строках и названными вручную. Если поле со списком A названоProduct1текстовое поле B будет названоProduct1_status

Я думал что-то вроде:

If value_of_a = "disable" Then 
 Dim name_of_b as String
 name_of_b = Me.Combo.Name + "_status"
 get_object_by_name(name_of_b).Enabled = False
End If

Как мне это сделать?

Ваш Ответ

2   ответа
3
VBA

Sub Macro1()
'
' GetControl By Name
'
    If value_of_a = "disable" Then
        GetControl(ComboBox1.Name + "_status").Enabled = False
    End If

End Sub

Function GetControl(nameOfControl As String) As OLEObject
    Dim ctrl As OLEObject

    For Each ctrl In ActiveSheet.OLEObjects
        If ctrl.Name = nameOfControl Then
            Set GetControl = ctrl
        End If
    Next ctrl
End Function
VB.Net

Код для VB.Net, если кто-то хочет по этой причине:

Sub Main()
    If value_of_a = "disable" Then 
        GetControl(ComboBox_1.Name + "_status").Enabled = False
    End If
End Sub

Function GetControl(nameOfControl As String) As Control
    For Each ctrl In Me.Controls
        If ctrl.Name = nameOfControl Then
            Return ctrl
        End If
    Next ctrl

    Return Nothing
End Function
Спасибо за ответ. Я обнаружил, что оба ответа в значительной степени соответствуют тому, что я хотел сделать, только то, что Даг более точно отражает мой сценарий. Damon Aw
VBA не используетReturn - эквивалент VBA будетSet GetControl = ctrl
Хорошо, спасибо, я изменю свой ответ. Извини насчет этого.
Да, это нормально. Удачи!
5

как вы это называете, но вот отдельная процедура, которая должна помочь:

Sub test()

Dim ws As Excel.Worksheet
Dim ProductCombo As OLEObject
Dim ProductText As OLEObject

Set ws = ThisWorkbook.Sheets(1)
With ws
    Set ProductCombo = .OLEObjects("Product1")
    Set ProductText = .OLEObjects(ProductCombo.Name & "_status")
    ProductText.Enabled = ProductCombo.Object.Text <> "Disabled"
End With
End Sub

РЕДАКТИРОВАТЬ: я действительно ненавижу элементы управления листа - я начинаю с нуля каждый раз, когда я программирую их! Тем не менее, я думал, что добавлю эту подпрограмму, которая сбрасывает каждое текстовое поле, имя которого соответствует шаблону Product # _status, в соответствии с его парным списком. Логика предполагает, что имена начинаются с Product1, Product2 и т. Д., Без нумерации:

Sub test2()

Dim ws As Excel.Worksheet
Dim ctl As OLEObject
Dim i As Long
Dim ProductComboboxesCount
Dim ProductCombo As OLEObject
Dim ProductText As OLEObject
Const ControlPrefix As String = "Product"

Set ws = ThisWorkbook.Sheets(1)
With ws
    For Each ctl In .OLEObjects
        If TypeOf ctl.Object Is MSForms.ComboBox And Left(ctl.Name, Len(ControlPrefix)) = ControlPrefix Then
            ProductComboboxesCount = ProductComboboxesCount + 1
        End If
    Next ctl
    For i = 1 To ProductComboboxesCount
        Set ProductCombo = .OLEObjects(ControlPrefix & i)
        Set ProductText = .OLEObjects(ControlPrefix & i & "_status")
        ProductText.Enabled = ProductCombo.Object.Text <> "Disabled"
    Next i
End With
End Sub
Спасибо! Это здорово. Просто FYI, партнеры по проекту моей подруги в основном просто использовали ActiveSheet.OLEObjects (& quot; name_of_target_control & quot;), чтобы получить управление и предположить, что оно правильное. -_- Damon Aw

Похожие вопросы