2

アクセラレータ キーを使用せずにユーザー フォーム (または他のコマンド) を閉じたい。

たとえば、ユーザーが F4 キーを押すと、次のフォームが Excel から開かれます。F4でも閉じる(Unload Me)ようにしたいです。

不必要に大きいように見えますが、これは私が現在使用しているものです。

Private Sub TextBoxA_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxB_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxC_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxD_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxE_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxF_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxG_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxH_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxI_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxJ_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxK_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxM_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxN_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxO_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Sub moveme(keycode As Integer)
If keycode = 115 Then Unload Me
End Sub

私はこのようなものを探していると思いますが、わかりません:

loop:
Private Sub TextBox[i]_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
Sub moveme(keycode As Integer)
If keycode = 115 Then Unload Me
End Sub
4

3 に答える 3

2

Access では、関数をコントロールのイベント コード ボックスに直接配置できます。複数のコントロールに同じ関数を含めることができます。

Excel や Word では、これを行う唯一の方法は WithEvents を使用することだと思います。このトピックに関する情報へのリンクをいくつか示します。それだけでは不十分な場合は、Google の「Excel WithEvents」を使用してください。(WithEvents は 1 つの単語です。)

チップ・ピアソンのサイト

Mr.エクセルフォーラム

于 2013-06-15T22:34:20.707 に答える
2

各テキストボックスには、いくつかの理由から独自のイベントハンドラーが必要です。また、あなたが何をしたいのかは理解できますが、プロシージャーの外でステートメントを実行することはできないため、Private Sub TextBox[i]...プロシージャーの外で一連のステートメントを作成することはできません。 .

幸いなことに、を使用してこれを行う簡単な方法があるかもしれませんApplication.OnKey

フォームを初期化するマクロがある標準モジュールでは、次のようにします。

Sub showform()
    'Displays/initializes the form and assigns hotkey function to F4
    Application.OnKey "{F4}", "CloseForm"
    UserForm1.Show vbModeless
End Sub

Sub CloseForm()
    'Sub to close the userform when F4 is pressed
    Unload UserForm1
    'optionally, revert F4 to its normal behavior
    'Application.OnKey "{F4}"

    'reset F4 to open the form:
    Application.OnKey "{F4}", "showform"
End Sub

フォームを開くために既に F4 を使用している場合は、ロジックを少し調整して、フォームが既に表示されているかどうかを確認したり、エラー処理などを行う必要があります。

ただし、これにはいくつかの問題があります。フォームにフォーカスがある間は機能しないため、フォームが表示されない限り機能しませんvbModeless。これはvbModal、フォームがそのように表示されている間、フォームイベントのみが認識されるため、表示されたフォームでは機能しません。そのため、フォームオブジェクトのイベントハンドラーから呼び出されない限り、ホットキーは閉じる機能をトリガーしません。

それ以外の場合は、各フォーム オブジェクトのイベントをそのままの方法で処理するか、WithEventsオプションを検討している可能性があります。

于 2013-06-15T22:32:38.347 に答える
2

David と Pete は調査のための優れた洞察を私に与えてくれたので、私は Pete を正しいものとしてマークしました。Mr Excel フォーラムのリンクは非常に役に立ちました。コードのために、私は次のようになりましたが、おそらく他のユーザーにとっては狭すぎるため、正しいとはマークしませんでした。

Userform1 コード

Dim TBs() As New TBClass

Private Sub UserForm_Initialize()
    Dim TBCount As Integer
    Dim Ctrl As Control
    TBCount = 0
    For Each Ctrl In Absence_Viewer.Controls
        If TypeName(Ctrl) = "TextBox" Then
            TBCount = TBCount + 1
            ReDim Preserve TBs(1 To TBCount)
            Set TBs(TBCount).TBGroup = Ctrl
        End If
    Next Ctrl
'Do other stuff
End Sub

TBClass という名前のクラス モジュール コード

Public WithEvents TBGroup As MSForms.TextBox
Private Sub TBGroup_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
If keycode = 115 Then Unload Userform1
End Sub
于 2013-06-16T05:04:56.543 に答える