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

どうすればいいですか?

4

2 に答える 2

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
于 2012-09-08T20:48:50.327 に答える
3

VBA

編集:(実際の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
于 2012-09-08T19:50:56.590 に答える