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"の代わりに、実行したいプロシージャ(かプロシージャ名)を書いておけばよい。
初心者のうちは、特にビジネスなどでは、この手のキーインに関連付ける方法は避けて、別の仕組み(メニューやボタンなどか?)にして、この分野に深入りしないほうがよいと思う。
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の前に一度呼んでおいた方が良い気がする
特に、上記「なるほど」でした。
ありがとうございました。
お探しの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も見ています
-
風水の観点で選ぶ観葉植物とは?置き場所や上げたい運気ごとの注意点を紹介!
観葉植物で運気をアップするコツを、風水デザイン1級建築士の福島昌彦さんに伺った。
-
VBAでセルに値が入力されるまで待つ方法
Visual Basic(VBA)
-
無限ループ中にある任意のキーを押すと抜けるコードを作りたいのですが・・・(VB6です)
Visual Basic(VBA)
-
[Excel VBA]コマンドボタンの入力待ち方法
Visual Basic(VBA)
-
-
4
エクセルで入力待ちの状態を作るには?
Excel(エクセル)
-
5
Excel vbaでキーの操作の入力
Excel(エクセル)
-
6
ループを途中で抜けたいのですが。
C言語・C++・C#
-
7
VBAでの一時停止と再開の方法
その他(プログラミング・Web制作)
-
8
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
9
【VB.NET】別Formのボタンが押されるまで待機する方法??
Visual Basic(VBA)
-
10
vba セルに入力した時間をマクロで受け取るには?
Excel(エクセル)
-
11
DoEventsがやはり分からない
Visual Basic(VBA)
-
12
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
13
別のシートから値を取得するとき
Visual Basic(VBA)
-
14
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
15
ボタンが押された時にループから抜けるには
C言語・C++・C#
-
16
【VBA】Worksheet_changeイベントで特定のキーが押されたときだけ無効にしたい
Visual Basic(VBA)
-
17
エクセルのカーソルを非表示にする方法
Visual Basic(VBA)
-
18
VBSの処理中一旦処理を止めて再開させたい。
Visual Basic(VBA)
-
19
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
20
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定のキーを押すまでループさ...
-
WPFでの時刻入力コントロールに...
-
VB.NETのDropDownListをReadOnl...
-
C# WMPメディアの終了検知 その2
-
【VB】タブ切り替え時のイベント
-
コンボボックス選択後に非アク...
-
Excel VBA マクロ実行中のみテンキ...
-
(VBA)チェックボックスのclick...
-
Delphiコンボボックスの先頭に...
-
NULLで検索を行ったときは全件...
-
一定時間操作されないと自動で...
-
コントロールキーが押されたキ...
-
Visual Basic 6.0 コンボボック...
-
Delphiでキー入力を投げたい
-
テキストボックスの入力文字を1...
-
コマンドボタン(入力)をクリッ...
-
タブキー押下時のイベントをひ...
-
もしかして
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VB】タブ切り替え時のイベント
-
Visual Basic 6.0 コンボボック...
-
一定時間操作されないと自動で...
-
特定のキーを押すまでループさ...
-
WPFでの時刻入力コントロールに...
-
キーイベントを擬似的に発生さ...
-
(VBA)チェックボックスのclick...
-
タブキー押下時のイベントをひ...
-
テキストボックスの入力文字を1...
-
VB.NETでフォームがない...
-
エクセルVBAのテキストボック、...
-
コンボボックスにキー入力をさ...
-
KEYPREVIEW=TRUEについて。意味...
-
フォーカスについてお教えください
-
複数のテキストボックスのカン...
-
VB6で電卓を作っているのですが...
-
Excel VBA マクロ実行中のみテンキ...
-
VB.NETのDropDownListをReadOnl...
-
IEで、BackSpaceで「戻る」機能...
-
VC++ で TextBoxから、次...
おすすめ情報