Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7840 / 13645 ツリー ←次へ | 前へ→

【36548】マクロが走らない kao 06/4/3(月) 10:58 質問[未読]
【36556】Re:マクロが走らない inoue 06/4/3(月) 12:33 発言[未読]
【36558】Re:マクロが走らない kao 06/4/3(月) 13:54 質問[未読]
【36563】Re:マクロが走らない ichinose 06/4/3(月) 20:00 発言[未読]
【36565】Re:マクロが走らない kao 06/4/3(月) 20:13 お礼[未読]

【36548】マクロが走らない
質問  kao  - 06/4/3(月) 10:58 -

引用なし
パスワード
   どなたかお願いします。下記のようなコードを書いておりますが、DelKeyを押しても一度目だけはマクロが動きません。空白になった後,もう一度数値を入れてEnterKeyを押した後はDelのほうも機能しだします。なぜでしょうか。

Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
If Target.Column = 6 Then 'F列に記入するならば実行する
    Application.OnKey "{ENTER}", "kizyutu" 'NumKeyのEnterで実行する
    Application.OnKey "{DELETE}", "sakuzyo"

End If
End Sub

【36556】Re:マクロが走らない
発言  inoue E-MAILWEB  - 06/4/3(月) 12:33 -

引用なし
パスワード
   提示マクロのIfステートメント内にデバッグ表示等を入れて、
DelKey打鍵前に動いたのかを確認されれば良いと思います。

Workbook_SheetChangeイベントに書いているわけですから、
当該イベントが起きて、対象がF列でなければ
DelKeyに対するマクロが動かないのは当然です。

【36558】Re:マクロが走らない
質問  kao  - 06/4/3(月) 13:54 -

引用なし
パスワード
   ▼inoue さん:
ありがとうございます。一度テストBookで下記のように記述してみました。

ThisWookBookに;
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
If Target.Column = 6 Then 'F列に記入するならば実行する

    Application.OnKey "{ENTER}", "kizyutu" 'NumKeyのEnterで実行する
    Application.OnKey "{DEL}", "sakuzyo"
  MsgBox ("Fれつです")
End If
End Sub

標準モジュールに;
Sub kizyutu()

MsgBox ("kizyutusaimasu")
End Sub

Sub sakuzyo()

MsgBox ("sakuzyosiimasu")
End Sub

そうしますと一度目はDelを押しますと”Fれつです”が出ます。それ以降は前の部分にある”sakuzyosimasu”が出るので一度目だけApplication.OnKeyは動いていないようです。さらにF列だけでなくどの列でEnterを押してもDelを押しても動きます。どうなっているのでしょうか。教えていただけるでしょうか。

【36563】Re:マクロが走らない
発言  ichinose  - 06/4/3(月) 20:00 -

引用なし
パスワード
   kao さん:
inoue さん:
こんばんは。


まず、Application.Onkeyがどんなメソッドなのか
Helpで確認された方がよいです。
たぶん、勘違いされています。
>    Application.OnKey "{ENTER}", "kizyutu" 'NumKeyのEnterで実行する
というコードでEnterキーを察知し即kizyutuというプロシジャーを実行する
わけではありませんよ!!これは、キーに関連付けを設定するコードです。

それとApplication.Onkeyでは、Changeイベント内で完全にはキーを
制御できないみたいですよ!!

本来の正常な仕様が記述されていないので
感ですが・・・。


新規ブックのThisworkbookのモジュールに

'===============================
Private Declare Function GetAsyncKeyState Lib _
    "User32.dll" (ByVal vKey As Long) As Long
'=========================================================================
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  If Target.Column = 6 Then
   Select Case key_code
    Case 13
     MsgBox ("kizyutusaimasu")
    Case 46
     MsgBox ("sakuzyosiimasu")
    End Select
   MsgBox "F列です"
   End If
End Sub
'==========================================================
Function key_code() As Long
  Dim inkey As Long
  key_code = 0
  inkey = GetAsyncKeyState(13)
  If inkey <> 0 Then
   key_code = 13
  Else
   inkey = GetAsyncKeyState(46)
   If inkey <> 0 Then
     key_code = 46
     End If
   End If
End Function


として、F列に値を入力してEnterキーで確定したり、
Delキーで削除したりしてみて下さい。
この二つのキーに反応するはずです。

簡単なテストではうまく作動していますが、
私もシートチェンジイベントでキーの取得と言うことを
初めて試してみたので完全に大丈夫かはわかりません。
(私は、こういう大変な仕様には大概しません・・・)

【36565】Re:マクロが走らない
お礼  kao  - 06/4/3(月) 20:13 -

引用なし
パスワード
   ▼ichinose さん:
>まず、Application.Onkeyがどんなメソッドなのか
>Helpで確認された方がよいです。
>たぶん、勘違いされています。
>>    Application.OnKey "{ENTER}", "kizyutu" 'NumKeyのEnterで実行する
>というコードでEnterキーを察知し即kizyutuというプロシジャーを実行する
>わけではありませんよ!!これは、キーに関連付けを設定するコードです。

はい勘違いしてました。inoue さん,ichinose さんありがとうございます。投稿後に考えてみて,Target.RangeのチェンジでApplication.Onkeyが初めて有効になるので一度目はだめなはずだと気づきました。わたくしの仕様の場合Auto_Open()にDelKeyの方だけ入れて対処しようかと考えていました。

>
>それとApplication.Onkeyでは、Changeイベント内で完全にはキーを
>制御できないみたいですよ!!

そうなんですか。参考になります。それに下のは大変興味深いです。VBAをやっとかじれるぐらいになったところなのでC系のは新鮮です。ありがとうございます。

>
>
>新規ブックのThisworkbookのモジュールに
>'============================================================
>Private Declare Function GetAsyncKeyState Lib _
>    "User32.dll" (ByVal vKey As Long) As Long
>'==========================================================================
>Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
>  If Target.Column = 6 Then
>   Select Case key_code
>    Case 13
>     MsgBox ("kizyutusaimasu")
>    Case 46
>     MsgBox ("sakuzyosiimasu")
>    End Select
>   MsgBox "F列です"
>   End If
>End Sub
>'===========================================================
>Function key_code() As Long
>  Dim inkey As Long
>  key_code = 0
>  Do While key_code = 0
>   inkey = GetAsyncKeyState(13)
>   If inkey <> 0 Then
>    key_code = 13
>   Else
>    inkey = GetAsyncKeyState(46)
>    If inkey <> 0 Then
>      key_code = 46
>      End If
>    End If
>   Loop
>End Function
>
>として、F列に値を入力してEnterキーで確定したり、
>Delキーで削除したりしてみて下さい。
>この二つのキーに反応するはずです。
>
>簡単なテストではうまく作動していますが、
>私もシートチェンジイベントでキーの取得と言うことを
>初めて試してみたので完全に大丈夫かはわかりません。
>(私は、こういう大変な仕様には大概しません・・・)

7840 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free