こんにちは。GetKeyStateについて質問させていただきます。

VB6にて、APIの「GetKeyState」を使用し、Tabキーのキー入力判断を行っているのですが、その他の操作(GetKeyStateを判断しているフィールドより
マウス左ボタンにて他のコントロールに移動した時等)に、Tabキーを押して
いないのに、プログラムはTabキーを押した状態のロジックが動作していま
す。下記にそのコードを記述しますので、原因・対処方法がありましたら、
教えてください。

****コード
Private Sub TXT_ATAI_LostFocus()

Dim SUBM0030 As SUBM0030_AREA
Dim X As Variant

If (GetKeyState(vbKeyTab) <> 0) Then
If FRM70.TXT_ATAI.Text <> "" Then
Call MEDIA_DECODE3_SEC(SUBM0030, "1")
If SUBM0030.RETURN_CD <> "0" Then
FRM70.GRD1.Col = 7
FRM70.TXT_ATAI.SetFocus
FRM70.MousePointer = vbDefault
Exit Sub
End If
End If
End If

End Sub

**** 開発環境
・OS:Windows98 4.10.1998
・メモリ:64MB
・CPU:P2-233
・PC:FMV6233-D9

このQ&Aに関連する最新のQ&A

OS 開発」に関するQ&A: OSの開発に付いて

A 回答 (4件)

>If (GetKeyState(vbKeyTab) <> 0) Then



If (GetKeyState(vbKeyTab) < 0) Then
では?

参考URL:http://support.microsoft.com/default.aspx?scid=k …
    • good
    • 0
この回答へのお礼

todo36さん。ありがとうございました。条件記述を変更後に動作確認をしたら、
質問の内容は解決しました。

お礼日時:2001/12/27 17:58

プロパティのMultiLineをTrueにしていませんか?



その場合、そういうことがあるようです。

対応としましては、

MultiLineをFalseにするか、

下記のようにコードを固定すればいいと思います

intSts = GetKeyState(vbKeyTab) And &HFE
If intSts = 128 Then
  MsgBox "Tab"
End If

参考になれば。。
    • good
    • 0

すいませんTodo36さん、その通りです。



リンク先より:If the return value is negative, the key has been pressed.

たしかに・・・m(_ _)m

さらに、GetAsyncKeyState(vbKeyTab) <> "0" ←なぜか文字列で比較している

akfkさんご迷惑かけました、todo36さん、ありがとうございます。
    • good
    • 0

NT40(SP6)+VB5(SP3)環境での回答とさせていただきます。



確かにGetKeyState(vbKeyTab) <> 0の記述ではその現象が発生します、理由は調べていません(--;)

目的がTABキーの状態の取得でしたら、次のコードでも実現可能です。

----------------- 標準モジュール
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
----------------- FRM70
Private Sub TXT_ATAI_LostFocus()

If GetAsyncKeyState(vbKeyTab) <> "0" Then
MsgBox "TAB"
End If

End Sub
------------------
参考になれば幸いです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qキーボードが押されたことの感知(エクセルVBA)

キーボードが押されたことを、イベントとするマクロってできるのでしょうか?例えば、ctlキーが押されたら、"押されました"、離されたら”離れました”って表示する方法をご伝授願えればと思います。どなたか、VBAに詳しい方、宜しくお願いいたします。また、感知することが出来ないキーや、右や左で判別できない(例えば、shiftキー)キーもあるのでしょうか?

Aベストアンサー

こんばんは。

以前、9x系で、Win32APIを、見よう見まねで、キーイベントを作ろうとして、見事に失敗した経験があります。理論的は間違いないつもりでいたのですが、二度と試そうとは思いません。基本的には、無理だと考えてよいと思います。

>Win32API のGetKeyboardState 関数は、現在押しているかの判別だと思いますが???正しいのでしょうか?

確かに、そのとおりではあるのですが、あくまでも、API関数を通しての結果だったと思います。

>Alt キー、Ctrl キー、Shift キー(今考えているのは、Ctrl キー、Shift キー)を押した時に、メニューバーの表示を切替えようと考えています。

必要ないというよりも、Alt キーは、Excel等のアプリケーションと、コンフリクトを起こすのではないでしょうか?せいぜい、シフトキーまでにしないと、あぶなくてしょうがないです。それから、シフトキーだけでメニューを換えるというのは、既存のアプリでも出来ていませんね。あくまでも、ボタンのクリック・イベントに対して、シフトキーをチェックしてメニューを換えるようにされています。

あまり凝った方法にしないで、新たに、ツールバー全体を作るか、メニューバー自体を入れ替えたほうが早いのでは?どんなに多くても、100までにはならないと思いますが。というか、それだけのプロシージャを確保して運用しても、重すぎるのではないか、と思います。

私の苦い経験で、最初の大きく構えて設計段階でコケてしまうと、後が全滅になりますよ。小技を構築して、大きなものを作ったほうが、成功率は高いです。

また、ロータス方式のように、ひとつの大メニューバーのメニューコマンドに対して、小メニューバーを設けていってもよいのではありませんか?

これ以上は、私としては、なんとも言い様がありません。

こんばんは。

以前、9x系で、Win32APIを、見よう見まねで、キーイベントを作ろうとして、見事に失敗した経験があります。理論的は間違いないつもりでいたのですが、二度と試そうとは思いません。基本的には、無理だと考えてよいと思います。

>Win32API のGetKeyboardState 関数は、現在押しているかの判別だと思いますが???正しいのでしょうか?

確かに、そのとおりではあるのですが、あくまでも、API関数を通しての結果だったと思います。

>Alt キー、Ctrl キー、Shift キー(今考えているのは、Ct...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QExcelのVBA。public変数の値が消える

VBAについて。Excelの2003や2007を使っています。標準モジュールで public 変数を定義しました。 ユーザーformを使い、パブリック変数に値を入れたり変更し、標準モジュールに戻ったとき、そのpabulic変数が resetされてしまっている事があります。全く同じマクロで、この現象が起こることと、起こらないことがあります。excelの2003でも2007でも、同じ現象が起こります。簡単なマクロで再現性のある具体的なものを示したいと思い、試しましたが、できませんでした。簡単なマクロでは、きちんとパブリック変数は保持されています。問題のあるマクロはかなり長いものなので、とても示せません。問題がどこにあるのかわかりません。このマクロで不都合があるという具体的なマクロを示すことができない状態での質問で、申し訳ありません。
また、このようなプログラミングをしていて思ったのですが、ユーザーフォームに対してユーザーが任意の引数を渡す方法あるいは、ユーザーフォームから引数を受け取る方法はあるのですか?今は、pubulic変数を用いたり、具体的なセルに値を代入したりしていますが、どう考えてもそれはエレガントではないし、汎用性もないと思います。引数で引き渡すのが一番綺麗でいいとは思うのですが、それが可能かどうかわかりません。

VBAについて。Excelの2003や2007を使っています。標準モジュールで public 変数を定義しました。 ユーザーformを使い、パブリック変数に値を入れたり変更し、標準モジュールに戻ったとき、そのpabulic変数が resetされてしまっている事があります。全く同じマクロで、この現象が起こることと、起こらないことがあります。excelの2003でも2007でも、同じ現象が起こります。簡単なマクロで再現性のある具体的なものを示したいと思い、試しましたが、できませんでした。簡単なマクロでは、きちんとパブリック変数は保...続きを読む

Aベストアンサー

IDは違うけれども、同じ内容の質問のようですね。
http://oshiete.goo.ne.jp/qa/6420530.html

具体的にこんなことをしています、ということをおっしゃれば、話は変わるかとも思います。
今のままでは、いくら説明しても、たぶん納得いかないだろうと思います。

最初に、#3の方のMSのサポートの文章で、
>[VBA] Public 宣言された変数の有効期間
この内容、ご質問者さんは、意味を誤解しているようです。

「ほとんどの場合、プロシージャ終了後も値は保持されますが、
 ……Public 変数がアプリケーション終了時まで有効であること
 を期待する VBA マクロの実装は、推奨されません。」

どうして、保持した変数がなくなってしまうか、いろんな理由はあっても、完成したマクロでは、原因はひとつで、End Sub を通っていないままに終了しているからです。

 「ある Office ドキュメントが VBA のマクロを含む場合、…… Public 変数
  の値が有効である期間は、あるプロシージャの実行を開始
 し、そのプロシージャが "End Sub" で終了するまでの間のみです。」

この文章は間違いです。その話のままだったら、Public 変数など意味がなくなってしまいます。値だって確保しているし、変数は動的です。しかし、実務上、構造化マクロで、きちんと作られたマクロの流れ(ルーチン)が通る間だけだと思ってよいです。

>ユーザーformを使い、パブリック変数に値を入れたり変更し、標準モジュールに戻ったとき、そのpabulic変数が resetされてしまっている事があります。

Public 変数が、リセットされるというのは、マイクロソフトの文章は間違いに近いです。これは、極論すると、不完全なマクロだということです。しかし、本当に完全なコードを提供出来るかというのは、それは誰も自信などありません。だから、そういう方法を避けるわけです。

Public 変数は、標準モジュールを経由して、ローカルのUserForm に供給を受けるけれども、それを戻すということはしないのです。

図式化するとこうなります。

・ローカルで発生した値 →標準モジュールのPublic 変数 →UserFormのローカルのプロシージャ
・標準モジュールのPublic 変数 → UserFormのローカルのプロシージャ

※ただし、起動時の一回きり、それ以上の持ち回しはしない。逆もしない。

「ユーザーフォームに対してユーザーが任意の引数を渡す方法
 ユーザーフォームから引数を受け取る方法はあるのですか?」
出来ないわけではありませんが、これらは、変数で渡すということはしないということです。

>ただ、ユーザーフォーム aUS 全体で参照し値を変更できる 変数a のようなものを、使えたらいいなあ、と思い、

理屈では、一旦、標準モジュールのPublic 変数に送っておいて、そこから他のプロシージャ等に送ればと思いますでしょうが、それはしないということです。ルーチンが別だからです。

私の基本的な設計の考え方を示しておくと、UserForm自身とか、その中にあるものは、OLEオブジェクトのインスタンスです。つまり、モノ(オブジェクト)がある限りは、値は確保しているのです。だから、UserFormが残っている以上は、変数ではなくて、モノから、値を取得するのです。そのためには、UserForm はModalモードを、Offにしておくのが良いわけです。

例えば、UserForm1.TextBox1.Value とかで取れるわけです。

これは、システム設計の話で、それを見れば分かっていただけます。非表示のワークシートのセルに書くような話は、それは状況(渡す変数の数)によります。ただ、わざわざワークシートのセルに代入する必要はないということです。そのような方法はシステム設計では全体にリスクを高くするので賛成出来ないです。

私の失敗の経験から、Public 変数については、ひとつのルーチン以上に用いないことです。また、動的には用いないことです。一回きりの静的な変数として使うべきです。静的といっても、Static 変数の意味ではなく、文字通り変数を変化させないということです。ただし、時間の間隔やカウントなどの単純なものは別です。

Public 変数が空かどうかチェックする方法も考えられますが、意味がありませんから、それなら、参照渡しにすればよいのです。

IDは違うけれども、同じ内容の質問のようですね。
http://oshiete.goo.ne.jp/qa/6420530.html

具体的にこんなことをしています、ということをおっしゃれば、話は変わるかとも思います。
今のままでは、いくら説明しても、たぶん納得いかないだろうと思います。

最初に、#3の方のMSのサポートの文章で、
>[VBA] Public 宣言された変数の有効期間
この内容、ご質問者さんは、意味を誤解しているようです。

「ほとんどの場合、プロシージャ終了後も値は保持されますが、
 ……Public 変数がアプリケーション終了時...続きを読む

QCtrlキーが押されたことの検出

コントロールキーを押しながらコマンドボタンを押した時と、単にコマンドボタンを押した時とで、処理を変えようかと考えています。
Application.OnKey "^{}", "ctrl"で、キーを捕まえようかと考えましたが。エラーになります。
で、質問ですが、1つは、Ctrlキー、Shiftキー、Altキーを単体で押したときに任意のプロシージャーを実行することってできますか?
2つ目は、任意のプロシージャーではなく、押されているかどうかの状態のみ調べる方法ってありますか?
どなたか、詳しい方教えて頂けないでしょうか?宜しくお願い致します。

Aベストアンサー

こんにちは。KenKen_SP です。

ついでの余談ですが、、、

GetAsyncKeyState 関数はキーの同時押しをうまく判定できません。
[SHIFT]+[CONTROL]キーの同時押しなどを判定する必要があれば、
GetKeyboardState 関数を使います。

あとは NT 系の OS に限定されますが、SHIFT、CNTROL、ALT の左右
を判定することも可能です。

サンプルを見て下さい。今回のご質問にあわせてボタンクリック時
のキーの状態を表示させてますが、もちろん、任意のタイミングで
キーの状態を取得できますよ。

これらの API は KeyDown イベントなどが使えない(用意されてい
ない)場合、つまり今回のなどで用いることが


'// キーの同時押しを判定
Private Sub CommandButton1_Click()

  Dim KeyState(255) As Byte
  
  GetKeyboardState KeyState(0)
  
  If CBool(KeyState(VK_SHIFT) And &H80) And _
    CBool(KeyState(VK_CONTROL) And &H80) And _
    CBool(KeyState(VK_MENU) And &H80) Then
    MsgBox "[SHIFT]+[CONTROL]+[ALT]+[クリック]"
  ElseIf CBool(KeyState(VK_SHIFT) And &H80) And _
    CBool(KeyState(VK_MENU) And &H80) Then
    MsgBox "[SHIFT]+[ALT]+[クリック]"
  ElseIf CBool(KeyState(VK_SHIFT) And &H80) And _
    CBool(KeyState(VK_CONTROL) And &H80) Then
    MsgBox "[SHIFT]+[CONTROL]+[クリック]"
  ElseIf CBool(KeyState(VK_CONTROL) And &H80) And _
    CBool(KeyState(VK_MENU) And &H80) Then
    MsgBox "[CONTROL]+[ALT]+[クリック]"
  ElseIf CBool(KeyState(VK_SHIFT) And &H80) Then
    MsgBox "[SHIFT]+[クリック]"
  ElseIf CBool(KeyState(VK_CONTROL) And &H80) Then
    MsgBox "[CONTROL]+[クリック]"
  ElseIf CBool(KeyState(VK_MENU) And &H80) Then
    MsgBox "[ALT]+[クリック]"
  Else
    MsgBox "[クリック]"
  End If

End Sub

'// SHIFT、CTRL、ALT キーの左右を判定(NT系OSのみ)
Private Sub CommandButton2_Click()

  Dim KeyState(255) As Byte

  GetKeyboardState KeyState(0)
  If CBool(KeyState(VK_LCONTROL) And &H80) Then
    MsgBox "[左CTRL]+[クリック]"
  ElseIf CBool(KeyState(VK_RCONTROL) And &H80) Then
    MsgBox "[右CTRL]+[クリック]"
  Else
    MsgBox "[クリック]"
  End If
  
End Sub


'【標準モジュール】----------------------------------------------------

'// Win32API キーボードの仮想キーの状態を取得する
Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long

'// キーコード定数
Public Const VK_SHIFT = &H10  'Shift
Public Const VK_CONTROL = &H11 'Ctrl
Public Const VK_MENU = &H12   'Alt
Public Const VK_LSHIFT = &HA0  'NT系OS only 左Shift
Public Const VK_RSHIFT = &HA1  'NT系OS only 右Shift
Public Const VK_LCONTROL = &HA2 'NT系OS only 左Ctrl
Public Const VK_RCONTROL = &HA3 'NT系OS only 右Ctrl

こんにちは。KenKen_SP です。

ついでの余談ですが、、、

GetAsyncKeyState 関数はキーの同時押しをうまく判定できません。
[SHIFT]+[CONTROL]キーの同時押しなどを判定する必要があれば、
GetKeyboardState 関数を使います。

あとは NT 系の OS に限定されますが、SHIFT、CNTROL、ALT の左右
を判定することも可能です。

サンプルを見て下さい。今回のご質問にあわせてボタンクリック時
のキーの状態を表示させてますが、もちろん、任意のタイミングで
キーの状態を取得できますよ。

これら...続きを読む

QExcel VBA あるセルでENTERを押すと特定のセルへ移動したい

Excel VBAで例えばセル"A2"をセレクトしている状態で
「ENTER」を押すとB5に自動的にセレクトすることはできないでしょうか?

Worksheet_Change関数を使おうと思ったのですが
"A2"の中身が変化しないと発動しません。

Worksheet_SelectionChange関数を使って"A2"を選択している状態で「ENTER」を押すと"A3"が選択されることを利用し、
「"A3"が選択されたら"B5"に飛ぶ」
も考えたのですが、マウスやキーボード操作で"A3"を
選択すると"B5"に飛んでしまうので、これも使えません。

何か対策案はないでしょうか。ご教授よろしくお願いします。

Aベストアンサー

こんばんは。

これは、定番のコードですが、私は、それに、もう少し工夫を凝らしてみました。
本来は、クラスによるインスタンスが良いとは思いますが、それを一般的にお勧めするには、ちょっと荷が重いような気がしました。

'<標準モジュール>

Private Sub ReturnDirectrion2SelectCell()
 If ActiveCell.Address(0, 0) Like "A2" Then
  Range("B5").Select
 Else
  'Original ReturnDirection の再現
  On Error Resume Next
  Select Case Application.MoveAfterReturnDirection
  Case xlDown
    ActiveCell.Offset(1).Select
  Case xlToRight
    ActiveCell.Offset(, 1).Select
  Case xlToLeft
    ActiveCell.Offset(, -1).Select
  Case xlUp
    ActiveCell.Offset(-1).Select
  End Select
 End If
End Sub

Sub SetKeys()
  '設定用
  Application.OnKey "~", "ReturnDirectrion2SelectCell"
  Application.OnKey "{Enter}", "ReturnDirectrion2SelectCell"
End Sub
Sub SetOffKeys()
 '解除用
 Application.OnKey "~"
 Application.OnKey "{Enter}"
End Sub

'-----------------------------------------

自動設定が必要な場合は、以下のコードを加えてください。

'-----------------------------------------
'<標準モジュール>
Sub Auto_Open()
 Call SetKeys
End If
Sub Auto_Close()
 Call SetOffKeys
End If
'-----------------------------------------

なお、現在の設定では、全てのブックの全てのシートに同じように適用されます。Auto_Open等の代わりに、例えば、Worksheet_Activate や Workbook_SheetActivateなどに、SetKeysをCall し、Worksheet_DeactivateやWorkbook_SheetDeactivateに、SetOffKeysをCallするようにすると良いと思います。

こんばんは。

これは、定番のコードですが、私は、それに、もう少し工夫を凝らしてみました。
本来は、クラスによるインスタンスが良いとは思いますが、それを一般的にお勧めするには、ちょっと荷が重いような気がしました。

'<標準モジュール>

Private Sub ReturnDirectrion2SelectCell()
 If ActiveCell.Address(0, 0) Like "A2" Then
  Range("B5").Select
 Else
  'Original ReturnDirection の再現
  On Error Resume Next
  Select Case Application.MoveAfterReturnDirection
  ...続きを読む

QExcelVBAで、キーボード方向キーを押したら、その方向に塗りつぶし

ExcelVBAで、キーボード方向キーを押したら、その方向に塗りつぶしたセルを移動させたいです。

とりあえず、以下のようなマクロを組んだのですが、
方向キーを一度でも押すと、押した方向の彼方へ一瞬で飛んでいってしまいます。


Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long 'キー入力のAPI


'一番最初に塗りつぶすセル
set 塗りつぶし = Range("B2,C2") 


do
塗りつぶし.Interior.ColorIndex = 3 '赤く塗りつぶし

'左入力したら塗りつぶしセルを左に移動
If GetAsyncKeyState(37) Then
    塗りつぶし.Interior.ColorIndex = 0
    Set 塗りつぶし = 塗りつぶし.Offset(0, -1)
End If

'右入力したら塗りつぶしセルを右に移動
 If GetAsyncKeyState(39) <> 0 Then
塗りつぶし.Interior.ColorIndex = 0
Set 塗りつぶし = 塗りつぶし.Offset(0, 1)
End If

Loop


予想なんですが、一度でもキーを入力したら、
その方向へずっと入力しているようになっている
と思うのですが、どう直して良いか分かりません。

宜しくお願いします。

ExcelVBAで、キーボード方向キーを押したら、その方向に塗りつぶしたセルを移動させたいです。

とりあえず、以下のようなマクロを組んだのですが、
方向キーを一度でも押すと、押した方向の彼方へ一瞬で飛んでいってしまいます。


Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long 'キー入力のAPI


'一番最初に塗りつぶすセル
set 塗りつぶし = Range("B2,C2") 


do
塗りつぶし.Interior.ColorIndex = 3 '赤く塗りつぶし

'左入力したら塗りつぶしセ...続きを読む

Aベストアンサー

> ExcelVBAで、キーボード方向キーを押したら、
> その方向に塗りつぶしたセルを移動させたい

何のためにこのマクロを作るのかによって答えは全然違ってきますが、
  目的:マクロのお勉強で、背景色をセル移動してみたい
  セルを移動: セルのデータではなく背景色だけ移動する
と勝手に仮定してアドバイスをします   (^_^)

まず、この目的で GetAsyncKeyState API を使うのは不適切でしょう。
その理由は、いくつか試されたら簡単にわかります。

で、例えばこんな感じでもイケます
以下のコードを目的のシートのコードペイン(モジュールではなくて)
に貼り付けてください。
なお、この例では事前に目的のシートの "D6" を選択し、背景色をつけておいてから試します。


Option Explicit

Dim 初期化済み As Boolean
Dim 直前の色つきセル As Range
Dim 色番号 As Variant

Private Sub 初期設定()
Set 直前の色つきセル = Range("D6") ' ★★★ ここは適当にアレンジしてね
色番号 = 直前の色つきセル.Interior.ColorIndex
初期化済み = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim r0 As Long, c0 As Long, r1 As Long, c1 As Long
If Not 初期化済み Then 初期設定
r0 = Abs(Target.Row - 直前の色つきセル.Row)
c0 = Abs(Target.Column - 直前の色つきセル.Column)
If r0 > 1 Or c0 > 1 Then Exit Sub ' 方向キー以外で移動したときは処理しない
直前の色つきセル.Interior.ColorIndex = xlColorIndexNone
Target.Interior.ColorIndex = 色番号
Set 直前の色つきセル = Target
End Sub


以下、余談ですが
Excel上ではなく Visual Basic 2008ですとか、その他本格的なプログラム言語でつくる Window ならキー入力イベントがありますから、それで方向キー入力をイベントドリブンで処理できます。
しかしExcel上にはその機能がないので、方向キーなど、キー入力に応じて何かするというのは、難しいとおもいます。
なので、ご質問のようなことをなさるには本格的なプログラム言語をお使いになることを薦めます。

> ExcelVBAで、キーボード方向キーを押したら、
> その方向に塗りつぶしたセルを移動させたい

何のためにこのマクロを作るのかによって答えは全然違ってきますが、
  目的:マクロのお勉強で、背景色をセル移動してみたい
  セルを移動: セルのデータではなく背景色だけ移動する
と勝手に仮定してアドバイスをします   (^_^)

まず、この目的で GetAsyncKeyState API を使うのは不適切でしょう。
その理由は、いくつか試されたら簡単にわかります。

で、例えばこんな感じでもイケます
以下のコー...続きを読む

QVB上で実行中の無限ループの止め方

今まで、CUIベースのBASICでのプログラムの経験はあるのですが
Visual系のBASICは初心者です。
原因はわかっているのでプログラムの修正はできるのですが
VB上でコンパイルして実行したときに無限ループに陥ってしまって
どうにもプログラムをとめられなくなります。
そんなことがないように、実行前に全てのプロジェクトを保存して
いますので、そんなに実害はないのですが、どうすればとめられるのでしょう・・
今現在は、タスクマネージャーから強制終了させています。

Aベストアンサー

無限ループの一番内側に
DoEvents
を入れておくと、ウィンドウ切替え->デバッガ終了操作が出来ますよ

危なそうなとこにも入れておくと、何かと安心です。

QEnterキーでマクロを起動さす。

Excelの(例)A1のセルに検索値を入力しEnterキーを押すと事前に組まれたマクロが起動する方法を教えて下さい。

又はEnterキーにマクロは設定できませんか?

Aベストアンサー

#4のnojioさんの補足ということでお読みください。(書いているうちにかぶってしまいました。)

Worksheet_Changeがsumi-hamaさんの意図かもしれませんが・・・下記はEnterに対して機能します。


下記コードを標準モジュールに貼り付け、
 Onkey_Set を実行することでEnterキーにマクロが割り当てられます。
 マクロ側で(MacroTest)Sheet1のA1を特定しています。

 Onkey_Off を実行することでEnterキーは元の機能に戻ります。


'Enterキーにマクロを割り当て
Sub Onkey_Set()
  Application.OnKey "{Enter}", "MacroTest"
End Sub

'デモ(Sheet1のセルA1のみで機能させる)
Sub MacroTest()
  If ActiveSheet.Name = "Sheet1" Then
    If ActiveCell.Address(0, 0) = "A1" Then
      MsgBox "Sheet1のセルA1でEnterキーを押しました"
    End If
  End If
End Sub

'Enterキーを元の機能に戻す
Sub Onkey_Off()
  Application.OnKey "{Enter}"
End Sub

#4のnojioさんの補足ということでお読みください。(書いているうちにかぶってしまいました。)

Worksheet_Changeがsumi-hamaさんの意図かもしれませんが・・・下記はEnterに対して機能します。


下記コードを標準モジュールに貼り付け、
 Onkey_Set を実行することでEnterキーにマクロが割り当てられます。
 マクロ側で(MacroTest)Sheet1のA1を特定しています。

 Onkey_Off を実行することでEnterキーは元の機能に戻ります。


'Enterキーにマクロを割り当て
Sub Onkey_Set()
  Applic...続きを読む

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QTextBoxでEnterキーを押すと、にあるButtonを押したのと同じ効果を出す方法

VB初心者です。
まだ、はじめたばかりなので、上手く質問を説明できませんが、よろしくお願いします。

環境はVisualBasic .net 2003です。

フォームにテキストボックス(TextBox)とボタン(Button)があります。
テキストボックス内でEnterキーを押すと、ボタン(Button)を押したのと同様の効果をだしたいのですが。
VC++6.0だと、SendMessage(WM_COMMAND , .....
のようなやり方でできたはずですが・・・
---------------------------
テキストボックスのコード
Private Sub txtTest_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtTest.KeyDown
If (e.KeyCode = Keys.Enter) Then
'★★★ここでどういうコードを書いてよいかわかりません。
End If
End Sub
----------------------------
ボタンを押したときのイベントハンドラ
Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
    ボタンを押したら、このイベントハンドラを呼び出したい。
    もしくは、間接的に呼び出したい。
-------
どなたか、やり方をご存知の方がいらっしゃいましたら、よろしくお願いします。

VB初心者です。
まだ、はじめたばかりなので、上手く質問を説明できませんが、よろしくお願いします。

環境はVisualBasic .net 2003です。

フォームにテキストボックス(TextBox)とボタン(Button)があります。
テキストボックス内でEnterキーを押すと、ボタン(Button)を押したのと同様の効果をだしたいのですが。
VC++6.0だと、SendMessage(WM_COMMAND , .....
のようなやり方でできたはずですが・・・
---------------------------
テキストボックスのコード
Private Sub txtTest_KeyDown(ByVal ...続きを読む

Aベストアンサー

>SendMessage(WM_COMMAND
とは、多少意味合いが異なりますが。。。

btnTest.PerformClick()
と行うと、btnTestオブジェクトと関連付いたイベントハンドラが起動します。
http://okwave.jp/kotaeru.php3?q=1688744


また、エンターキーの動きに限るのであれば、フォームのAcceptButtonプロパティを利用すると、コーディングが不要です。ついでにエスケープにも動作を持たせたいのであれば、CancelButtonプロパティを利用するといいです。



どうしてもCと全く同様に、イベントを起こすのであれば、Cと同じ手続きでAPIで起こせばよいと思います。
http://okwave.jp/kotaeru.php3?q=199357


Public Class Form1
  Inherits System.Windows.Forms.Form

  Private Declare Auto Function SendMessage Lib "user32" ( _
    ByVal hWnd As Integer, _
    ByVal wMsg As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As Integer _
  ) As Integer
  Private Declare Auto Function GetDlgCtrlID Lib "user32" ( _
    ByVal hWnd As Integer _
  ) As Integer

  Private Const WM_COMMAND As Integer = &H111
  Private Const BN_CLICKED As Integer = &H0

#Region " Windows フォーム デザイナで生成されたコード "
#End Region

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    btnTest.PerformClick()
    SendMessage( _
      Me.Handle.ToInt32, _
      WM_COMMAND, _
      BN_CLICKED * GetDlgCtrlID(btnTest.Handle.ToInt32) * &H10000, _
      btnTest.Handle.ToInt32 _
    )
  End Sub
End Class

>SendMessage(WM_COMMAND
とは、多少意味合いが異なりますが。。。

btnTest.PerformClick()
と行うと、btnTestオブジェクトと関連付いたイベントハンドラが起動します。
http://okwave.jp/kotaeru.php3?q=1688744


また、エンターキーの動きに限るのであれば、フォームのAcceptButtonプロパティを利用すると、コーディングが不要です。ついでにエスケープにも動作を持たせたいのであれば、CancelButtonプロパティを利用するといいです。



どうしてもCと全く同様に、イベントを起こすのであれば、...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報