0

次の問題があります。

Private Sub TextBox1_Change()
   Control (this)                <<<<----- this is Empty
End Sub
Private Sub TextBox2_Change()
   Control (this)                <<<<----- this is Empty
End Sub
Private Sub TextBox3_Change()
   Control (this)                <<<<----- this is Empty
End Sub

Public Sub Control(asdf As MSForms.TextBox)
    asdf.Font.Size = 11
    asdf.Font.Bold = True    
End Sub

コンパイラは、'this' が空であると言います。TextBox を認識するために何を入れるべきですか?

どうも

4

3 に答える 3

0

大量のテキスト ボックスができてしまった場合は、カスタム クラスでイベント ハンドラーをカスタマイズする方が簡単な場合があります。

標準モジュールでは、グローバル スコープのコレクション変数を配置します。

Public gcolTextboxes As Collection

CTbxEvents というカスタム クラス モジュールを作成します。

Private WithEvents mtb As MSForms.TextBox

Public Property Get tb() As MSForms.TextBox
    Set tb = mtb
End Property

Public Property Set tb(otb As MSForms.TextBox)
    Set mtb = otb
End Property

Private Sub mtb_Change()

    tb.Font.Size = 11
    tb.Font.Bold = True

End Sub

最後に、ThisDocument で、ドキュメントが開いたときにすべてのテキスト ボックスを読み込みます。

Private Sub Document_Open()

    Dim f As Field
    Dim clsTbxEvents As CTbxEvents

    'Globally scoped collection to hold the classes
    Set gcolTextboxes = New Collection

    'Loop throught the fields
    For Each f In Me.Fields
        'Only fields that are activex controls
        If f.Type = wdFieldOCX Then
            'only activex controsl that are textboxes
            If TypeOf f.OLEFormat.Object Is MSForms.TextBox Then
                'create a new class, add the textbox, add to collection
                Set clsTbxEvents = New CTbxEvents
                Set clsTbxEvents.tb = f.OLEFormat.Object
                gcolTextboxes.Add clsTbxEvents
            End If
        End If
    Next f

End Sub

これで、追加したテキスト ボックスはすべて同じイベント ハンドラーを使用するようになり、別のサブルーチンを呼び出す必要がなくなりました。本当にテキストボックスが 3 つしかない場合は、おそらくやり過ぎです。

于 2013-09-09T21:14:35.480 に答える
0

thisキーワードは C++/C#/Java に固有で、対応する VB/VB.NET のキーワードは次のとおりです。Me

于 2013-09-09T18:04:43.927 に答える