如何获得名称的控制名称?

有一个combobox,我有一个简单的function。 如果combobox的值等于“禁用”,我将禁用文本框B.有许多combobox及其对应的文本框B,排列成行并用手指名。 如果comboboxA被命名为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 

我该怎么做呢?

我不确定你是怎么称呼这个的,但是这是一个独立的程序,应该有所帮助:

 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 

编辑:我真的讨厌工作表控件 – 我从头开始每次我编程! 尽pipe如此,我还是想添加这个子程序,根据配对的combobox,重新设置名称符合模式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 

VBA

编辑:(更改实际的VBAmacros)

 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