[[20240317101630]] 『自作アドインでキーボードショートカットの設定が』(かりかり) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『自作アドインでキーボードショートカットの設定ができない』(かりかり)

Ctrl+Qでメッセージが表示される下記のマクロをアドイン(xlam)で保存しました。

★保存ファイル名 『メッセージ.xlam』

Private Sub Workbook_Open()
 Application.MacroOptions Macro:="メセージマクロ", ShortcutKey:="q"
End Sub

Sub メッセージマクロ()
 MsgBox "OK"
End Sub

オプションでアドオン登録して新規ブックを起動すると
"実行時エラー1004"
"MacroOptions メソッドは失敗しました Applicationオブジェクト"
のエラーが出ます。

エラーの発生行は
Application.MacroOptions Macro:="メセージマクロ", ShortcutKey:="q"
のところです

対応として以下の3つを試しました
(xlamで保存、アドインに登録)

★Workbook_Openの代わりにWorkbook_AddinInstallを使う
Private Sub Workbook_AddinInstall()
 Application.MacroOptions Macro:="メセージマクロ", ShortcutKey:="q"
End Sub
⇒アドイン登録時に同じエラーが発生

★表示化してみる
Private Sub Workbook_Open()
 Application.Windows(ThisWorkbook.Name).Visible = True
 Application.MacroOptions Macro:="メセージマクロ", ShortcutKey:="q"
End Sub
⇒エラー発生
 実行エラー9
 "インデックスが有効範囲にありません"
 ThisWorkbook.Nameはマクロがある『メッセージ.xlam』でした。
 ただ、メッセージ.xlamを開いて表示タブの再表示のリストに出て来ていないので無理かなと思いましたが・・・
 

★エラーを無視する
Private Sub Workbook_Open()
 On Error Resume Next
 Application.MacroOptions Macro:="メセージマクロ", ShortcutKey:="q"
 On Error GoTo 0
End Sub
⇒エラーは出ないが、ショートカットもできなかった

下記の2つのマクロでキーボードショートカットの設定はできています
(xlamで保存、アドインに登録)

★マクロを開発タブのマクロ⇒マクロオプションでキーボードショートカットを設定してからxlamファイルで保存
Sub メッセージマクロ()
 MsgBox "OK"
End Sub

★Application.OnKeyを使う 
Private Sub Workbook_Open()
 Application.OnKey "^q", "メッセージマクロ"
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Application.OnKey "^q"
End Sub

Sub メッセージマクロ()
 MsgBox "OK"
End Sub

アドイン(xlam)をWorkbook_OpenでApplication.MacroOptionsの設定をするのは無理なのでしょうか
良い方法があればご教示いただければと思います
よろしくお願いします

< 使用 Excel:Excel2010、使用 OS:Windows10 >


  > Application.MacroOptions Macro:="メセージマクロ", ShortcutKey:="q"
                      ↑
                 そこ、"メッセージマクロ" になっていないのですが、大丈夫?

(半平太) 2024/03/17(日) 15:59:22


返信ありがとうございます

ご指摘の『メセージマクロ』、気づいてませんでした
助かります
記述のマクロは質問用に名前を変えたもので、実際のマクロの名前は合っています
(かりかり) 2024/03/17(日) 16:12:23


 >★エラーを無視する
 >Private Sub Workbook_Open()
 > On Error Resume Next
 > Application.MacroOptions Macro:="メセージマクロ", ShortcutKey:="q"
 > On Error GoTo 0
 >End Sub
 >⇒エラーは出ないが、ショートカットもできなかった

 ↓これだと、どうなりますか?

 Private Sub Workbook_Open()
  ThisWorkbook.IsAddin = False
    Application.MacroOptions Macro:="メッセージマクロ", ShortcutKey:="q"
  ThisWorkbook.IsAddin = True
 End Sub

(半平太) 2024/03/17(日) 17:15:32


半平太さん、ありがとうございます

アドバイスのコード実行しました
"MacroOptions メソッドは失敗しました Applicationオブジェクト"
のエラーが出ます。
(かりかり) 2024/03/17(日) 18:02:03


 そうですか。。

 こちらでは問題なく出来ているので、ちょっと分かりません。m(__)m

(半平太) 2024/03/17(日) 18:49:28


アドイン保存先[パス]
メッセージマクロの配置先は[モジュール名]

関係有りませんでしょうか。。。 ← なにかありソぉな感じがするのですが^^;
m(__)m
(隠居Z) 2024/03/17(日) 18:57:38

 当方Excel2021ですが、半平太さんの提示案で期待動作してます。
 「メッセージマクロ」は標準モジュールに書いてますか?

 <ThisWorkbookモジュール>
 Private Sub Workbook_Open()
    ThisWorkbook.IsAddin = False
    Application.MacroOptions Macro:="メッセージマクロ", ShortcutKey:="q"
    ThisWorkbook.IsAddin = True
 End Sub
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.Saved = True
 End Sub

 <標準モジュール>
 Sub メッセージマクロ()
  MsgBox "OK"
 End Sub

(まる2021) 2024/03/17(日) 19:29:06


 毎回、Workbook_Openで登録しなくても、アドイン保存時に1回だけ登録しても期待動作しました。

 (1)新規ブックの標準モジュールに以下をコピペ
      Sub Regist()
         Application.MacroOptions Macro:="MyProc1", ShortcutKey:="q"
         Application.MacroOptions Macro:="MyProc2", ShortcutKey:="m"
      End Sub
      Sub MyProc1()
         MsgBox "MyProc1"
      End Sub
      Sub MyProc2()
         MsgBox "MyProc2"
      End Sub
 (2)「Regist」を実行
 (3)上記ブックを「名前を付けて保存」でアドイン形式(.xlam)として保存
 (4)上記アドインを有効にする
 (5)EXCEL終了=>EXCEL起動

 以上で、当方では再起動後もShortcutKeyが有効になりました。
 「Ctrl+Q」「Ctrl+M」を押して試してみて下さい。
(まる2021) 2024/03/17(日) 19:39:35

アドイン保存先[パス]はオプションから登録の場合は何処でも良いみたいでね
参照設定では多少動作が違ってくる感じがしないではありませんが。
(まる2021) さん 2024/03/17(日) 19:29:06
半平太 さん
のご案内で、当方でも動作確認が出来ました。(*^^*)
でわ
m(__)m
(隠居Z) 2024/03/17(日) 20:12:29

MacroOptions メソッドは、
そのマクロを記述しているワークブックに、
有効な(表示されている)ワークシートが
1つも無い(全て非表示を含む)場合は、
実行時エラーとなります。

ワークシートが無い場合に FXボタンが無効に
なる事から想像するに、この時には関数群の
管理オブジェクトへのアクセスが不可になって
いると思われます。

MacroOptions メソッドは関数のカテゴリやコメント等を
操作対象にしている為、アドインのように有効なワークシート
が1つも無い状態では、この管理オブジェクトへアクセス出来なくて、
実行時エラーになるものと思われます。

その対策として、アドインブックではMacroOptions メソッドの前後で
IsAddinプロパティのオンオフを切り換えて、一時的にワークシートを
表示させます。同時にScreenUpdateもオンオフして、動作を隠します。

〜補足〜
尚、Excel2013以降の SDI 環境では、このIsAddinプロパティの
切り換えが招く「立て続けに起こるActiveWindowの遷移」が原因で
不具合を起こすケースが有りますので注意が必要です。
この不具合はMicrosoftに問合せ&調査を依頼した結果、その原因で
間違いないという回答を貰っています。その際に公開された KB は
現在は消滅してますが…

この件の詳細は私のAddinBoxサイトの下記記事を参照。
「Excel2013でエクセル終了時に空ウィンドウが残る」

(AddinBox_角田) 2024/03/18(月) 13:07:20


 (無駄話を投下します)

 自分しか使わないファイルなら好きにすればいいんですけど、
 他人に使わせる前提のファイルにこれをコッソリと仕込んでる奴ホント迷惑っス。
 (Ctrl + D に入力が「即時全吹っ飛び」するマクロ仕込んだウチの総務。許さん... orz)

 「Ctrl + 何か」って、WindowsやExcel自身に元々組み込まれているショートカットと
 あまりにもバッティングし過ぎませんかね?

 Excelの機能で「Ctrl + 何か」に割り当ての無いキーって、
     Ctrl + E
     Ctrl + M
     Ctrl + Q
     Ctrl + , (<)
     Ctrl + バックスラッシュ (_)
     Ctrl + {Ecs}
 くらいしか無いんじゃないかと(ちょっと情報古いかもですけど)

 自分も自作アドインにショートカット持たせてますけど、
 OnKey使って「Ctrl + Shift + 何か」とか「Ctrl + Alt + 何か」とか
 なるべく標準のショートカットを上書きしない様にしてます。
 上書きするのは、あえて標準機能のオーバーライドっぽい事をしたい時に限ります。
 例)
     {F8}            選択範囲の拡張         => 選択範囲拡張用のユーザーフォームを表示
     Shift + {Space} 選択範囲を行全体に拡張 => 複数エリア選択時にも対応させる
     Ctrl + {Space}  選択範囲を列全体に拡張 => (同上)

 まあ、代わりにOnKeyを使ったからと言って、
 本題の「登録/解除」の部分の作り込みがシンプルになるよ、という訳ではないでしょうけど、
 一応関連情報のひとつとして。

(白茶) 2024/03/18(月) 14:51:51


半平太さん
隠居Zさん
まる2021さん
AddinBox_角田さん

みなさん、返信ありがとうございます

半平太さん、コードありがとうございました

隠居Zさん、コードは別のxlamファイルでThisWorkbook、標準モジュール両方にかいて試しました
エラーも両方で発生していたのですが、本日コードを実行したら標準モジュールでは出なくなりました
原因はわかりません

まる2021さん、コードありがとうございます
事前にマクロオプションをつける方法ですね
コード実行後に開発タブにあるマクロオプションを見たらショートカットが登録されていました
まる2021さんの方法の方が、ショートカットの処理の流れがコードに書いてあるので後で見た時にわかりやすくていいですね
ただ、書き方により少し挙動が違いました
 ・標準モジュールだとエラーは出ない
 ・ThisWorkbookに書くとエラーが出る 『MacroOptions メソッドは失敗しました Applicationオブジェクト』
原因はわかりませんでした

AddinBox_角田さん、詳細な解説ありがとうございました
アドインファイルの状態がどうなっているのがわかって凄く勉強になりました

半平太さんのコードをxlamファイルで保存して、それを開いて1行ずつマクロを実行したところ

ThisWorkbook.IsAddin = False (←シートが表示)
Application.MacroOptions Macro:="メッセージマクロ", ShortcutKey:="q" (←エラーが発生)

といった挙動です。

シートが表示されたので、AddinBox_角田さんのおっしゃるアドインOFF状態である思われますがエラーが出ました

ただ、今回デバックした時に気づいたのですが、エラーが2つ発生することがわかりました
(ThisWorkbookのみ。標準モジュールではエラーは出なくなりました)

Private Sub Workbook_Open()
 Application.MacroOptions Macro:="メセージマクロ", ShortcutKey:="q" "←エラー発生後、停止せずにステップを1つ戻ってこの行を再度実行"
End Sub

1回目のエラーは 『MacroOptions メソッドは失敗しました Applicationオブジェクト』 ですが、
2回目は 『実行時エラー1004』『クラスが登録されていません』
に変わっています
以降、ステップを戻っても『クラスが登録されていません』が出ます
まる2021さんのコードをThisWorkbookに書いた時も同じでした
原因を調べてもわかりませんでした

(かりかり) 2024/03/18(月) 17:39:23


白茶さん、返信ありがとうございます

確かに、適当にショートカット追加していってたら自爆するかも・・・

・「Ctrl + Shift + 何か」とか「Ctrl + Alt + 何か」
・上書きするのは、あえて標準機能のオーバーライドっぽい事をしたい時に限ります

参考にさせていただきます

(かりかり) 2024/03/18(月) 17:49:37


 ThisWorkbookに書くならこうかな...
 自分はすごく違和感がありますが....

 Private Sub Workbook_Open()
    ThisWorkbook.IsAddin = False
    Application.MacroOptions Macro:="ThisWorkbook.メッセージマクロ", ShortcutKey:="q"
    ThisWorkbook.IsAddin = True
  End Sub
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.Saved = True
 End Sub
 Sub メッセージマクロ()
    MsgBox "OK"
 End Sub
(まる2021) 2024/03/18(月) 18:04:41

↑ なるほど^^
いけますね(*^^*)v
m(__)m
(隠居Z) 2024/03/18(月) 18:08:33

上記のまる2021さんの方法でエラーが発生せずにいけました

"ThisWorkbook.メッセージマクロ"
このような書き方もあるのですね
大変勉強になりました

みなさま、色々なアドバイスありがとうございました

(かりかり) 2024/03/19(火) 15:01:47


コメント返信:

[ 一覧(最新更新順) ]


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