
No.2ベストアンサー
- 回答日時:
いろんなやり方があるかもしれませんが、私ならモジュールレベル変数とか
Public変数とかの「フラグ」を使って制御しますかね。
以下は、EscapeかQキーを押すまで、ひたすら数値をカウントアップしていく
プログラムです。細かいエラー制御とかはしてませんのでご了承を。
あ、VB2005 Expressで書いてます。他のバージョンだと(特にVB6とか)
改造しないと動かない可能性があります。
(今後、バージョンは明記して下さいね…)
あと、Do~Loopとかを使うと基本的にフルパワーでループしてしまうので
(DoEvents入れたら、フリーズまでは しないですが)、繰り返し処理を
している状況をユーザに見せたりする場合は適しませんので、
今回はタイマーを使ってます。
Form1にLabel1、Timer1を貼り付けて、以下のソースを貼り付けてください。
Public Class Form1
'表示用カウンタ
Private Counter As Integer = 0
'取得した、特定の入力キー
Private InputKey As System.Windows.Forms.Keys = 0
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Timer1.Start()
End Sub
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
'既に入力キーが登録されていれば何もしない
If InputKey <> 0 Then Exit Sub
Select Case e.KeyCode
Case Keys.Q, Keys.Escape
'入力キー登録
InputKey = e.KeyCode
End Select
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Select Case InputKey
Case Keys.Q, Keys.Escape
Timer1.Stop()
Exit Sub
End Select
Counter += 1
Label1.Text = Counter.ToString
End Sub
End Class
上の例では、InputKeyがフラグの役目を果たします。
InputKey関連の処理を行っているSelect Caseを改造する事で、いろんな事が
出来ると思いますよ。
フラグを利用ですね。なるほど。
以下のようなコードはあまり良くないですか。
宣言部で
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
定義部で
Do
(様々な処理。。)
Application.DoEvents()
Loop Until GetAsyncKeyState(Keys.Escape)
No.3
- 回答日時:
ANo.2です。
GetAsyncKeyState ですか…
使った事は無いけど、使って 出来ない事も無さそうな気がしますね。
でも、ちょっと調べてみた感じ、たぶん提示されたコーディングでは
あまり宜しくない気がします。
・GetAsyncKeyState では、「以前にGetAsyncKeyStateが呼ばれたあとの
キー押下」が検知できるみたいなので、Do~Loopの前に一度
呼んでおいた方が良い気がする
・Loop Until GetAsyncKeyState(Keys.Escape) について
ここの条件はBoolean(論理式)として判断できるものでなければ
いけません。
Trueは数値にすると-1なので、-1となる式なら判定に掛かるかも
しれませんが、GetAsyncKeyStateの戻り値は調べて見た感じ、
0~3のような気がする(自信は無い)ので、ビルドに成功したとしても
実際にはずっと条件に引っ掛からないと思います。
上記のあたりだけ何とかすれば、使えなくは ない気がします。
保証は出来ませんが。
…でも、DoEventsを挟むなら、たぶんループの途中でもKeyDownイベントの
プロシージャも動いてくれると思うんですが… そうであれば、わざわざ
API使うまでもないです。
調べてまで頂き、ありがとうございました。教えていただいたことを参考にしながら、もう少しがんばってみます。
>Do~Loopの前に一度呼んでおいた方が良い気がする
特に、上記「なるほど」でした。
ありがとうございました。
No.1
- 回答日時:
>Do While...LoopやDo...Loop Whileを使えばよいのは分かるんですが、キー入力を取ってきて、そのキー・・
勉強(ウインドウズの仕組みの)が十分でないうちの知識で、断定しないこと。奥が深いものだという自戒して勉強が必要。
こういうのは、ユーザーが察知するために、ユーザーのプログラムでループして察知するのでなく、OSというかシステムに捉えてもらい、それをユーザーがもらうというカタチのもので、イベントを捉えてもらうというようなものだ。
(1)本来はAPIを使う分野になるとおもう
(2)中途半端だが、旧Basicの時代から、ゲームなどのプログラムのキーインされたキーで処理を分けるために、OnKeyといったステートメントがあった。
その系列なのかVBAにも、Application.OnKey がある。
標準モジュールに
Sub auto_Open()
Application.OnKey "{Esc}", "test01"
End Sub
(Auto_Openについて
http://www.relief.jp/itnote/archives/001502.php )
Sub test01()
MsgBox "aaa"
End Sub
のようなのを入れて実行(ブックを開く)しておくと、{}内のjキー(この場合エスケープキー)を押すと、この場合aaaが表示される。実際はMsgBox "aaa"の代わりに、実行したいプロシージャ(かプロシージャ名)を書いておけばよい。
初心者のうちは、特にビジネスなどでは、この手のキーインに関連付ける方法は避けて、別の仕組み(メニューやボタンなどか?)にして、この分野に深入りしないほうがよいと思う。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- フリーソフト 1秒毎にキーの←を押すソフト 1 2023/03/06 04:27
- マウス・キーボード キーボードのCaps Lockキーと変換キーの挙動がおかしくなりました。 4 2022/09/04 22:44
- Visual Basic(VBA) vba GetAsyncKeyState関数について 1 2023/08/24 12:08
- マウス・キーボード テンキーの設定がおかしくなっています。 5 2023/08/09 15:35
- その他(コンピューター・テクノロジー) プリントスクリーンについて 6 2022/11/23 11:17
- Mac OS mac os xの設定の(起動ディスク)にブート用dvdが表示されません 1 2022/05/28 13:29
- マウス・キーボード HPのパビリオンのキーボード異常 2 2023/07/25 11:40
- iOS これは日本語入力の大発明ですか? 7 2022/12/21 07:17
- Visual Basic(VBA) ExcelVBA No.を自動連番で設定をしながらデータ入力をしたい 2 2022/08/03 18:19
このQ&Aを見た人はこんなQ&Aも見ています
-
無限ループ中にある任意のキーを押すと抜けるコードを作りたいのですが・・・(VB6です)
Visual Basic(VBA)
-
[Excel VBA]コマンドボタンの入力待ち方法
Visual Basic(VBA)
-
VBAでセルに値が入力されるまで待つ方法
Visual Basic(VBA)
-
-
4
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
5
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
6
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
7
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
8
DO~LOOP でのLOOPの抜け方
Visual Basic(VBA)
-
9
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
10
【VB.NET】別Formのボタンが押されるまで待機する方法??
Visual Basic(VBA)
-
11
エクセルで入力待ちの状態を作るには?
Excel(エクセル)
-
12
マクロを実行中に、msgbox を表示させたまま、ワークシートを上下左右に移動表示させたい。
Excel(エクセル)
-
13
特定のセルがアクティブになったときのイベント?
Excel(エクセル)
-
14
VBAでの一時停止と再開の方法
その他(プログラミング・Web制作)
-
15
ループを途中で抜けたいのですが。
C言語・C++・C#
-
16
文字列から英数字のみを抽出する関数
Excel(エクセル)
-
17
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
18
Excel vbaでキーの操作の入力
Excel(エクセル)
-
19
GetAsyncKeyState() を利用するときの良い方法は
Visual Basic(VBA)
-
20
ボタンが押された時にループから抜けるには
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
エクセルのVBAコードと数式につ...
-
エクセルのマクロについて教え...
-
エクセルの改行について
-
【VBA】 結合セルに複数画像と...
-
vbsでのwebフォームへの入力制限?
-
算術演算子「¥」の意味について
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
Vba セルの4辺について罫線が有...
-
vb.net(vs2022)のtextboxのデザ...
-
ダブルクリックで貼り付けた画...
-
VBAの「To」という語句について
-
VBAでユーザーフォームを指定回...
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】変数を使った、文字...
-
エクセルのVBAコードについて教...
-
ワードの図形にマクロを登録で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
【マクロ】並び替えの範囲が、...
-
エクセルの改行について
-
エクセルのマクロについて教え...
-
vb.net(vs2022)のtextboxのデザ...
-
VBAでCOPYを繰り返すと、処理が...
-
VBA ユーザーフォーム ボタンク...
-
エクセルのVBAコードと数式につ...
-
エクセルのVBAコードについて教...
-
[VB.net] ボタン(Flat)のEnable...
-
【マクロ】変数を使った、文字...
-
改行文字「vbCrLf」とは
-
質問58753 このコードでうまく...
-
【マクロ】シートの変数へ入れ...
-
ワードの図形にマクロを登録で...
-
算術演算子「¥」の意味について
おすすめ情報