
セルに入力したあとその入力したキーが「Delete」キーかどうか判定するプログラムを作りたいのですが、下記のようにコードを書きました。
'標準モジュール
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
'Microsoft Excel Objects(ワークシート)
Private Sub Worksheet_Change(ByVal Target As Range)
If GetAsyncKeyState(46) <> 0 Then 'キーボードの「Delete」キーかどうか判定
○○
Else
○○
End If
End Sub
ところが、「Delete」キーを押してもGetAsyncKeyState(46)の値が「0」になり、「Delete」キーを押してないことになってしまいます。どのようにすればよいのでしょうか?
回答よろしくお願いします。
No.6
- 回答日時:
こんにちは。
何か、求めている方向が違っているような気がします。実際、API関数を使う場面というのは、VBAでは、ほとんど出てこないというか、私などは、VBAでは、あまり必要とすることがありません。
今回の「お礼」側に書かれて内容からすると、ある程度、既出の問題のような気がします。
全体的なマクロコードは見せられていないので、はっきりとしたことはいえないのですが、単に、このようなことではないでしょうか?入力後の移動自体というのも、関係ないような気がします。
'同じ列の違う行に自動的に入力する
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
Target.Offset(10).Value = Target.Value
Application.EnableEvents = True
End Sub
No.5
- 回答日時:
こんにちは。
日にちが経ったもので、補足側に書かれると、どうしても、確認が遅くなってしまいます。多少でもよいので、お礼側に、「質問があります」とか、少しでも書かないと、補足側に付けられては、ここを再び開けるまで確認できないのです。
>ステップインするとやはり値が0になってしまいます。
どうして、同じような質問になるのか、私には良く分からないのです。
アットタイムで、その判定を取りたいなら、MsgBox を出せばよいのではありませんか?
ステップモードで必ずしも正しく取れるものではありません。話が、ごちゃごちゃになっていると思うのです。VBEditor で動かして、それで、キーボードとして判定するのは、無理です。それは、VBAの範囲ではありません。あくまでも、キーボードが押され、API関数が感知する範囲だと思います。
>プログラムを一時停止して動かしたとき
もともと、それは、何をするものですか?キーボード自体の判定を目的にするなら、VBAプログラムは、もうあきらめたほうがよいのではありませんか?
VBAで、コードを作る場合は、Office アプリケーションの扱える範囲内で、どういう仕事を目的にするか、ということだと思います。
はたして、本当に、API関数が必要なのか、もう一度、考え直したほうがよいのではないか、と思います。Delete 自体を押したことを判定するなら、#1 さんの示した、OnKey で十分なのです。
すいません。補足に付けると確認ができないんですね。
ステップモードで必ずしも正しく取れるものではないというのは初めて知りました。
もともと、それは、何をするものですか?>これはワークシートのある一定のセルに入力したときに、同じ列の違う行に自動的に入力するようなプログラムを作りたかったからです。今セルがどこにあるのか判定するためなのですが、セルに入力すると移動し、「Del」キーの場合は移動せずに変わってしまうのでその判定をしたかったのです。
あと、オプションの入力後の移動を変えても正しく判定するようにしたいと思っていました。
ありがとうございました。
No.4
- 回答日時:
直接の回答ではありませんが、
何をしたいために「Del」キーの押下をチェックするのか判りませんが、
もし、改変されたくないセルを保護するためだけなら、「シート保護」で対応するなど、
「はたして、VBAで対応すべき」かどうかを全体的に考え直すことも必要です。
VBAを組み込んでしまうと、
1.メンテを作成者にしか頼めなくなる
2.VBAでなくても実現できることもVBAに走るクセがつく
2.マクロ入りのエクセルを開くと表示される「ウイルス」云々の警告メッセージに
エンドユーザーが過剰反応してしまう。
ということがおきがちです。
そうですね。プログラムでやらなければいけないか考えなくてはいけませんね。プログラムで便利な部分と不便な部分と考えて作りたいと思います。
ありがとうございました。
No.3
- 回答日時:
こんにちは。
こちらで、そのコードを試してみましたが、一応、問題なく動作します。
>「Delete」キーを押してもGetAsyncKeyState(46)の値が「0」になり
この部分で、どのようにチェックされているのかは分かりませんが、それは、このAPI関数取得のタイムラグの許容範囲を越えているのではありませんか?それと、念のために、GetAsyncKeyState の値をクリアしてから、やってみたらいかがでしょうか?
しかし、
>セルに入力したあとその入力したキーが「Delete」キーかどうか判定するプログラムを作りたいのですが、
この内容にもよると思います。これで次のイベントが発生したら、すべてご破算になってしまいます。元が、Worksheet_Change イベントですから、他のコントロールのKeyDown やKeyUp イベントのように、キーに対するイベントにはなっていません。
#1 さんのような、OnKey で、[Delete]キーを固定した方法が良いかもしれません。Worksheet_Change イベントの場合は、[Delete]キー自体を監視するというよりも、ワークシートのデータに関わる監視のはずです。そのキー自体を監視する目的ではないでしょう。
今回、一応、以下のように試してみました。
'シートモジュール
Private Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
Private Const VK_DELETE As Long = &H2E
Private Sub Worksheet_Change(ByVal Target As Range)
Call GetAsyncKeyState(0&)
If GetAsyncKeyState(VK_DELETE) <> 0 Then 'キーボードの「Delete」キーかどうか判定
Beep
Else
'------------
End If
End Sub
参考:
プラットフォーム SDK
GetAsyncKeyState
http://msdn.microsoft.com/library/ja/default.asp …
この回答への補足
ブレークポイントを解除してプログラムを走らせたところGetAsyncKeyStateで問題なく動きました。
しかし、ブレークポイントを設定(If GetAsyncKeyState(46) <> 0 Thenの部分)してチェックしてステップインするとやはり値が0になってしまいます。
これはプログラムを一時停止して動かしたときに他の入力をしたことにより「Del」キーが無効になったということでしょうか?
よろしくお願いします。
No.1
- 回答日時:
ご提示していただいた方法では、
DEL キー押下 --> セルのデータが消去される --> イベント発生
となって初めてキー状態のチェックですからね、、、通常 DEL キー
は長押ししないし、連打もしないですからキーの入力判定の段階では
既に DEL キーは押されてないからでは?
ループで監視でもしない限り GetAsyncKeyState API での判定は無理
だと思います。
代わりに OnKey メソッドを使ってみたら?
' // 場所:標準モジュール
Sub Auto_Open()
Application.OnKey "{DEL}", "PressDelKey"
End Sub
Sub Auto_Close()
Application.OnKey "{DEL}"
End Sub
Private Sub PressDelKey()
If UCase$(TypeName(Selection)) = "RANGE" Then
If ActiveSheet Is ThisWorkbook.Worksheets("Sheet1") Then
MsgBox "Sheet1 で Delキーが押されました", vbInformation
End If
End If
' // DELキーを送信
AppActivate Application.Caption
SendKeys "{DEL}", True
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) Excelマクロでセルに値が入力されたら実行する 5 2023/08/06 11:03
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
このQ&Aを見た人はこんなQ&Aも見ています
-
【VBA】Worksheet_changeイベントで特定のキーが押されたときだけ無効にしたい
Visual Basic(VBA)
-
エクセルVBAのDeleteキーによるエラー
Excel(エクセル)
-
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
-
4
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
VBA deleteをクリックすると型が一致しないとデバッグになります。
Visual Basic(VBA)
-
7
Changeイベントでの複数セルのクリアの処理について
Visual Basic(VBA)
-
8
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
9
Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる
Visual Basic(VBA)
-
10
ExcelのVBAでエラー13が出てしまいます。(泣き)
Excel(エクセル)
-
11
EXCELで特定のセルに表示された項目をヘッダーやフッターに出力するには
Excel(エクセル)
-
12
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
13
VBAで行削除できないようにするには
その他(プログラミング・Web制作)
-
14
VBA/Worksheet_Changeがうまくいかない
PowerPoint(パワーポイント)
-
15
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
16
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
17
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
18
EXCELマクロ 保護されているシートのダイアログを表示させない方法
Visual Basic(VBA)
-
19
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
20
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
縦書き文章で『―』表示を『|』...
-
メールアドレスの下線の入力方法
-
¥マークのキーにある横棒の出...
-
Word2007でTabキーを押すと改ペ...
-
C言語 1文字入力(Enterキーなし)
-
Backspaceで文字が全部消える…。
-
ワードの表中での「箇条書き」...
-
急に大文字と小文字が逆に入力...
-
2分の1。分数を打ち込むには?
-
エクセルVBA セルの入力後「De...
-
リターンキー → エンターキー?
-
ミドルバー(真ん中棒)
-
半角英数大文字の入力方法について
-
英数字を打ち込む時、シフトキ...
-
Tabキーの逆はどうやるんですか?
-
エクセルの下部のシートタブの...
-
エクセルで別シートの同じ位置...
-
マウスのポインタが勝手に上下...
-
マウスのクリック、指離したの...
-
シート全体を他のブックのシー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
縦書き文章で『―』表示を『|』...
-
メールアドレスの下線の入力方法
-
Word2007でTabキーを押すと改ペ...
-
¥マークのキーにある横棒の出...
-
ミドルバー(真ん中棒)
-
ワードの表中での「箇条書き」...
-
Backspaceで文字が全部消える…。
-
C言語 1文字入力(Enterキーなし)
-
eの上のカンマの出し方
-
手術 という漢字。この漢字を、...
-
半角英数大文字の入力方法について
-
エクセルVBA セルの入力後「De...
-
|(縦棒)を、キーボードから...
-
PUBGをやっていてbad module in...
-
実働時間を電卓で簡単に計算す...
-
Becky!で入力時の改行がおかし...
-
ExcelVBAでテキストボックスに...
-
Thunderbirdのアドオン"Quickte...
-
リターンキー → エンターキー?
-
エクセル ショートカットキー
おすすめ情報