Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
ショートカットによるユーザーフォームの終了
投稿日時: 17/10/10 11:51:42
投稿者: 隠居じーさん

ショートカットキーctrl + wでフォームを終了させたいです。
以下のコードでは終了してくれません。
尚、
フォームを×で終了し、ctrl + wを押すとメッセージボックス
"syuryo"は表示されます。
宜しくお願い致します <(_ _)>
 
thisworkbook イベントハンドラ
====================================================
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Call sk02
End Sub
Private Sub Workbook_Open()
  Call sk01
End Sub
 
標準モージュールのコード
=====================================================
Option Explicit
Sub sk01()
  Application.MacroOptions Macro:="mystr", ShortcutKey:="a"
  Application.MacroOptions Macro:="syuryo", ShortcutKey:="w"
End Sub
Sub sk02()
  Application.MacroOptions Macro:="mystr", ShortcutKey:=""
  Application.MacroOptions Macro:="syuryo", ShortcutKey:=""
End Sub
Sub mystr()
MsgBox "mystr"
  UserForm1.Show vbModeless
End Sub
Sub syuryo()
MsgBox "syuryo"
  Unload UserForm1
End Sub
 
 

回答
投稿日時: 17/10/10 13:39:55
投稿者: ピンク

>ショートカットキーctrl + wでフォームを終了させたいです。
一旦セルを選択してctrl + w では
もしくは Alt + F4

回答
投稿日時: 17/10/10 14:00:16
投稿者: ピンク

>一旦セルを選択して
マウスを使えば意味がないですね
Alt + t から Esc のあと ctrl + w も、まどろしいですね
で私の案はボツにしてください。

回答
投稿日時: 17/10/10 14:42:37
投稿者: WinArrow
投稿者のウェブサイトに移動

ユーザーフォームがアクティブの状態で
 
Private Sub UserForm_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Shift = 2 And KeyCode = 87 Then
        Unload Me
    End If
End Sub
 
のようなものを何カ所にも記述する。

回答
投稿日時: 17/10/10 15:02:18
投稿者: WinArrow
投稿者のウェブサイトに移動

ユーザーフォームがデアクティブの状態で
ということならば
 
Sub test()
    Application.OnKey "^{w}", "FCLOSE"
    UserForm1.Show vbModeless
 
End Sub
 
 
Sub FCLOSE()
    MsgBox "A"
    Unload UserForm1
    Application.OnKey "^{w}", ""
End Sub
 

回答
投稿日時: 17/10/10 21:11:46
投稿者: カリーニン

閉じるボタン(コマンドボタン等)を作成し、アクセラレーターキーを設定する、という方法でも。
これはユーザーフォームがアクティブの状態での前提です。
 
アクセラレーターキーの場合は、Alt+指定のキーとなります。

回答
投稿日時: 17/10/10 22:40:58
投稿者: WinArrow
投稿者のウェブサイトに移動

追加レス
 
Application.OnKey
は、ユーザーフォームがアクティブの状態では機能しません。
ということを付け加えておきます。

投稿日時: 17/10/11 00:25:40
投稿者: 隠居じーさん

WinArrowさん、ピンクさん、カリーニンさん
貴重なお時間を賜り、有難うございます。
ピンクさんご指摘の通りセル選択後、コントロール + wもありかと、
WinArrowさんお久ぶりです、昔、老人28で随分お世話になりました。
とても助かりましたです。
今回も貴重なご指摘、有難うございます。
第二案を
下記の通り実行致しましたが最後にご指摘の通り
セルを選択すれば動きました
test()を自動起動し、FCLOSE()の
Application.OnKey "^{w}", ""を
Application.OnKey "^{w}", "test"に変更
 
カリーニンさん、有難うございます
Private Sub UserForm_Activate()
  With UserForm1
    .Caption = "入力サポーター"
    .Label1.Caption = "入力"
    .CommandButton1.Caption = "O K"
    .CommandButton2.Caption = "取 消"
    .CommandButton3.Caption = "終 了"
    .CommandButton3.Accelerator = "w"
    .OptionButton1.Caption = "横"
    .OptionButton2.Caption = "縦"
    .OptionButton1.Value = True
    .TextBox1.SetFocus
  End With
End Sub
終了ボタンに(3)アクセラレータキーにw指定で
思い通りに動きました
alt + w
ctrl + aと alt + aに置き換えれば、機能性も扱いやすいかと!
皆様のアドバイスが無ければ、無知なまま、シングルスレッドのせいにし
c#でマルチスレッドのフォームをcomで…参照すれば…など無謀なことを
考え、また、挫折するところでした。

回答
投稿日時: 17/10/11 13:40:38
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

test()を自動起動し、FCLOSE()の
Application.OnKey "^{w}", ""を
Application.OnKey "^{w}", "test"に変更

 
FCLOSE()の
Application.OnKey "^{w}", ""
は、OnKeyのリセットの意味で記述したもので、プロシジャ名を指定しない方がよいとおもいますが、
なぜ、プロシジャ名を指定したのですか?
Testを自動実行するには、
workbook_Openイベントに
Call text
と記述します。

投稿日時: 17/10/11 14:57:36
投稿者: 隠居じーさん

WinArrowさん
済みません m(__)m
おっしゃる通りです。老人の勘違いとお笑いください
ご指摘通りで正常動作致しております。
お許しを
私のままだと初期化(後始末)が出来ず。次回起動時までも不具合が
発生すると思います。
取り急ぎ、訂正とお詫びまで

投稿日時: 17/10/11 15:32:27
投稿者: 隠居じーさん

皆様、ご教授、本当にありがとうございました
セルをマス目にし、入力文字列を一文字づつセルに格納させるマクロ
を作成していました。(最初から申し上げず済みません)もっと
素晴らしいアドバイスをいただけたかもしれません。
 
form起動はctrl + wで
起動したformを終了は alt + wで
と使い分け
Workbook_SheetSelectionChangeでformをアクティブにし?
シェルのsendkeyなども使い(textboxにfocusがかからず)
セルを新たに選択しても、しなくてもformを起動、終了させることが出来ました。
本当にありがとうございました。また宜しくお願い致します。
これで解決とさせていただきます。