[[20091211095835]] 『ファンクションキーの設定』(いいちこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ファンクションキーの設定』(いいちこ)

 いつも勉強のため、拝見させて頂いております。

 ファンクションキーF1を押すと、form3のコマ
 ンドボタン3がクリックされるというような
 ことはできるのでしょうか?

 そのBookの ThisWorkbookモジュールに以下のように3つのプロシージャを
 記述して、保存していったん終了してから、
 ユーザーフォームを開いて、
 [F1]キーを押してみてください。

 '--------------------------------
 Option Explicit

 Private Sub Workbook_Open()
    Application.OnKey "{F1}", "ThisWorkbook.OnF1Key"
 End Sub

 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.OnKey "{F1}"    '[F1]の機能を元に戻す
 End Sub

 Sub OnF1Key()
    If DoEvents Then 'UserFormが表示されていたら
        UserForms(0).CommandButton3.Value = True
    End If
 End Sub

   (kanabun)

 フォームを閉じるとF1キー本来の機能に戻します。
      (弥太郎)
 '----------
 標準モジュールへ
 Sub macro()
    UserForm3.CommandButton3.Value = True
 End Sub

 フォームモジュールへ
 Private Sub CommandButton3_Click()
     MsgBox "コマンドボタン3がクリックされました"
 End Sub
 Private Sub UserForm_Initialize()
     Application.OnKey "{F1}", "macro"
 End Sub
 Private Sub UserForm_Terminate()
     Application.OnKey "{F1}"
 End Sub


 実際にそのユーザーフォームのコントロールの配置構成など記述した方がよいと思いますよ
 それによっては、別の方法もあるかもしれないので・・・。

 対象ユーザーフォームをUserForm3(最低、コマンドボタンのCommanbutton3は、存在する)だとすると、

 まず、クラスモジュール(名前は、既定 Class1)に

 '==================================================================
 Option Explicit
 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 Private Declare Function GetAsyncKeyState Lib _
        "User32.dll" (ByVal vKey As Long) As Long
 Event keypress(ByVal kcode As Long)
 Private stopflg As Long
 '=================================================================
 Sub key_ment(ParamArray KeyCode() As Variant)
   Dim g0 As Long
   Dim ky As Long
   On Error Resume Next
   stopflg = 0
   Do Until stopflg = 1
     Sleep 50
     DoEvents
     For g0 = LBound(KeyCode()) To UBound(KeyCode())
        ky = KeyCode(g0)
        If GetAsyncKeyState(ky) <> 0 Then
           RaiseEvent keypress(ky)
           Exit For
        End If
     Next
   Loop
   On Error GoTo 0
 End Sub
 '===================================================================
 Sub stop_keyment()
    stopflg = 1
 End Sub

 対象であるUserForm3のモジュールに

 '====================================================================
 Option Explicit
 Private WithEvents cls As Class1
 Private Sub cls_keypress(ByVal kcode As Long)
    If kcode = vbKeyF1 Then
       CommandButton3.Value = True
    End If
 End Sub
 '======================================================================
 Private Sub UserForm_Activate()
    Set cls = New Class1
    cls.key_ment vbKeyF1
 End Sub
 '======================================================================
 Private Sub UserForm_Terminate()
    cls.stop_keyment
    Set cls = Nothing
 End Sub
 '======================================================================
 Private Sub CommandButton3_Click()
     MsgBox "コマンドボタン3がクリックされました"
 End Sub

 最後に標準モジュールに

 '=====================================================================
 Option Explicit
 Sub main()
    UserForm3.Show
 End Sub

 これでmainを実行してください。 UserForm3が表示されます。

 F1キーを押すことで CommandButton3をクリックしたときと同じ動作をします。

 試してみてください。

 尚、F1キーにこだわらないなら、Accelerator を使う方法もあります。検討してみてください。

 ichinose


 ご参考。
 
[[20070314151621]]『コマンドボタン(VBA) 』(純丸) 
 
(純丸)(o^-')b

上記の件なんですが、F1キーだけじゃなく複数のファンクションキー
の設定はできますか?

自分なりにコードに追加などして試したのですが、
できませんでした。

できるのであれば、love_0825_1104_taiga@wcm.ne.jp宛にご返信願いますか?
(かつ) 2015/08/12(水) 08:37


 メールアドレスはさらさない方がいいかと。

 ここは個人的やり取りをする場ではなく公開の掲示板なんで
 なぜ公開でレスを受け付けないのかが疑問です。

 ※メアド公開してるのって大体うっかりメールしたら迷惑メール
 わんさか来るってパターンが多いのでメアドにメールする人とい
 うのはここでは皆無かと思います。
(カエムワセト) 2015/08/12(水) 08:58

 メールアドレスに関しては、カエムワセトさんのコメント通り。
 レスは、ここを閲覧すれば十分でしょ? 怖くてβもメールでのレスなんてできません。

 それはさておき。

 >F1キーだけじゃなく複数のファンクションキー の設定はできますか? 
 >自分なりにコードに追加などして試したのですが

 Application.Onkey のヘルプ等、検索してみましたか?

https://msdn.microsoft.com/ja-jp/library/office/Ff197461.aspx

(β) 2015/08/12(水) 09:15


ご返信ありがとうございます。
ヘルプ拝見したんですけど、よくわかりません

この件のコードに関してはよく理解ができずに
自分なりに変更してみたのですができませんでした。

独学で勉強してるのでご回答?をお願いできませんか?
(かつ) 2015/11/04(水) 08:03


 この機能を有効化するタイミング、無効化して初期状態に戻すタイミング、
 ファンクションキーで何を実行するのか、といったことは要件に合わせて
 弥太郎さんやichinoseさんが提示されたコードを参考に組み立ててください。

 以下は基本です。難しいことは何もありません。標準モジュールに。

 SerFunc を実行した後、ファンクションキーを押せばファンクションコードごとに紐つけた処理を行います。
 ResetFuncを実行すれば、そのあとファンクションキーを押しても、標準の動きになります。

 Sub SetFunc()
    Application.OnKey "{F1}", "ProcF1"
    Application.OnKey "{F2}", "ProcF2"
    Application.OnKey "{F3}", "ProcF3"
 End Sub

 Sub ResetFunc()
    Application.OnKey "{F1}"
    Application.OnKey "{F2}"
    Application.OnKey "{F3}"
 End Sub

 Sub ProcF1()
    MsgBox "F1が押されました"
 End Sub

 Sub ProcF2()
    MsgBox "F2が押されました"
 End Sub

 Sub ProcF3()
    MsgBox "F3が押されました"
 End Sub

(β) 2015/11/04(水) 09:42


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.