Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Excel 2016)
F2を編集モードとマクロ処理の両方で使いたい
投稿日時: 23/08/31 12:45:42
投稿者: hareru

OSの機能でキーボードのF2を押すと編集モードになりますがマクロ処理を作成していてF2をクリックし、クリックした際のActiveセルの内容が「特定の文字列」の場合はフォームを表示する仕様として作成しています。
Application.OnKey "{F2}", "macro"
 
この時、Activeセルの内容が特定の文字列ではない時にセルを編集モードにしたいのですがネットで検索しても見つかりません。
(そのそもF2キーを押してからF2キーの機能を使うかどうかの判断をしようとしているので矛盾しているのかも知れませんが)
何か良い方法が有ればアドバイスを頂けないでしょうか?
 
よろしくお願いいたします。

回答
投稿日時: 23/08/31 13:41:54
投稿者: WinArrow

Onkeyではなくて、「ダブルクリックしたとき」というイベントを使ったら、いかがでしょう?

回答
投稿日時: 23/08/31 13:49:13
投稿者: gombohori

引用:
OSの機能でキーボードのF2を押すと編集モード

OSの機能ではなく、Excelの機能でしょう
 
引用:
F2をクリック

クリックですか?
などよく分からないところがありますが、
 
 
Public Sub macro()
  Application.OnKey "{F2}"                      ' OnKey解除
  If ActiveCell.Value = "特定の文字列" Then
     UserForm1.Show
  Else
     SendKeys "{F2}": DoEvents          ' F2キーを送出してキーを食わせる
  End If
  Application.OnKey "{F2}", "macro"             ' OnKey再設定
End Sub

回答
投稿日時: 23/08/31 14:08:57
投稿者: gombohori

このほうがいいですね

    Public Sub macro()
      If ActiveCell.Value = "特定の文字列" Then
         UserForm1.Show
      Else
         Application.OnKey "{F2}"              ' OnKey解除
         SendKeys "{F2}": DoEvents             ' F2キーを送出し、すぐにキーを食わせる
         Application.OnKey "{F2}", "macro"     ' OnKey再設定
      End If
    End Sub

投稿日時: 23/09/01 07:53:17
投稿者: hareru

WinArrowさん、gombohoriさん
回答ありがとうございます。
 
説明不足で申し訳ありません。
 
F2押下のマクロはアドインで実装します。(特定のBOOKだけでは無く全てのBOOKで利用したいので)
また、Activeセルの「特定の文字列」による操作はF1とF2押下で各々のマクロが動きます。
例えば、F1:商品別、F2:品目別、と言った感じで、ユーザが選択する運用です。
なので「特定の文字列」のセルに対してWクリックだけでは(F1又はF2の)2つのマクロが有る為に実行できません。
また、運用上、F1,F2は頻繁に押下されるケースもあるので出来ればSendKeyを使いたくないと思っていました。
 

回答
投稿日時: 23/09/01 11:43:46
投稿者: simple

F2をカスタマイズしようということは、かなりトリッキーなことだと思います。
 
F2キーを押して編集モードになると、原則としてマクロは使えません。
そういう制約があることは先刻ご承知のことでしょう。
 
また、F2キーに別の動作をさせようとした場合、
特定文字列ではない場合は、本来のF2の処理を継続させる必要があります。
そのためには、たぶんSendKeysを使って、キー入力を模擬的に作るしかないと思われます。
それを避けたいのであれば、構想を根元から変える必要があると思います。
(つまり,ファンクションキーを使わない、ということです)
 
gombohoriさんから提示いただいたマクロは、非該当文字のとき、
F2が繰り返し実行されているような振る舞いになるように思います。
こんな書き方もあるかもしれません。これだとその点は回避できるようです。

Sub setF2()
    Application.OnKey "{F2}", "macro"             ' OnKey再設定
End Sub
Public Sub macro()
    If ActiveCell.Value = "特定の文字列" Then
        MsgBox "OK"     'test用
    Else
        Application.OnKey "{F2}"              
        SendKeys "{F2}", True 
        Application.OnTime Now(), "setF2"
    End If
End Sub
# なお、上記のマクロでも問題はあって、なぜかNumLockキーが影響を受けてしまうようです。
# 原因は不明です。Sendkeysの副作用なんでしょうか。
安定しないようなので、別の方法を検討されたほうがよい印象です。

回答
投稿日時: 23/09/01 11:56:23
投稿者: gombohori

simple さんの引用:
gombohoriさんから提示いただいたマクロは、非該当文字のとき、
F2が繰り返し実行されているような振る舞いになるように思います。

 F2がキーバッファに入った後、それが OS->Excel に渡って処理されないと、
 マクロが終了した後に、F2キーがExcelに入ってくるので、
 編集モードにならないで、永久ループになります。
 
 その対策として、F2送出直後にDoEventsをかまして、Onkeyが再設定されるまでに
 確実にExcleにF2キーの処理をさせる必要があります。
 結構タイミングはシビアだと思うので、PCの処理速度等で変わるかも知れません

回答
投稿日時: 23/09/01 12:02:31
投稿者: simple

最初は、回答そのままの形で実行しました。
たしかに環境依存ですね。
DoEventsを複数回繰り返すなどは、よく使われる方法ですね。
ご指摘のとおりかと思いました。

回答
投稿日時: 23/09/01 12:26:56
投稿者: Suzu

hareru さんの引用:
F2押下のマクロはアドインで実装します。(特定のBOOKだけでは無く全てのBOOKで利用したいので)
また、Activeセルの「特定の文字列」による操作はF1とF2押下で各々のマクロが動きます。
例えば、F1:商品別、F2:品目別、と言った感じで、ユーザが選択する運用です。

 
アドイン と言う事は、新規ブックでもその動作が実行されます。
 
フォームを表示する
F1:商品別、F2:品目別
 
から
特定処理を行うフォームを表示する事は間違いありませんよね。
 
それを、新規ブックでも実行できる様にする必要があるのでしょうか。
やるなら、参照設定ではないかと。
 
また、F2 は よく使いませんでしょうか?私だけでしょうか。
数式バークリックとか、セルダブルクリックとか、マウス操作をしたくないから
早く操作したいから、F2 で編集モードに入っているのに・・
 
それで、余計な判定が入ってきて、しかも、それが、SendKey で不安定とかだったら 発狂しますね。
Ctr + Shift + F2 とか に変更できないのですか?

回答
投稿日時: 23/09/02 10:32:48
投稿者: simple

先述のSendKeysを使うとNumLock キーがオフになる現象は、既知のバグのようです。
(当方,Win10,Excel2019)
 
「SendKeys を実行するとNumLock キーがオフになる現象を回避」
https://santane.jp/wp/?p=355
これによると、Application.SendKeysではなく、
WshScriptのSendKeysを使うと回避できるようです。ご参考まで。
 
# SendKeysの利用を推奨するものではなく、できれば回避したい手法です。
# 単なるバグ情報の提供でした。

トピックに返信