【先着1,000名様!】1,000円分をプレゼント!

コマンドボタンのEnterイベント後に、フォーカスを移動したい。

フォームに「TextBox1」(TabIndex=0)「TextBox2」(TabIndex=1)「CommandButton1」(TabIndex=2)の3つのコントロールがある場合。

CommandButton1がクリックされた場合も、TextBox2からCommandButton1に、タブキーまたはエンターキーで、フォーカスが移った場合にも、同じ処理を行い、処理結果によってTextBox1やTextBox2にフォーカスを移したいと考えています。

以下のようなサンプルを作成しました。

Private Sub CommandButton1_Enter()
CommandButton1_Click
End Sub

Private Sub CommandButton1_Click()
MsgBox ("OK")
TextBox2.SetFocus
End Sub

この場合、CommandButton1_Enterのイベントが起こった場合、CommandButton1_Click()のTextBox2.SetFocusは効きません。
(正確には、CommandButton1_Enterイベントが終わった時点で無効でしょうか。)

Enterイベントは、フォーカスが移動する前に発生するため、このイベントが終わった後に、そもそもの動作に戻り、フォーカス移動が発生してしまうからなのだと思っております。

要は、コマンドボタンにタブキーやエンターキーでフォーカスしても、コマンドボタンをクリックしたのと同じ処理を行い、所定の位置にフォーカスを持っていきたいのですが、どのように行えば良いか、わからない状況です。

よろしくお願いいたします。

A 回答 (2件)

No.1です。



> 結果、textBox2ではなく、textBox1にフォーカスが移動してしまいました。

Windows XP Home・Excel2003/l2007のユーザーフォームにて、同じ動作に
なることを確認しました。
確かに、BENGALさんが質問文で記述されているように、Enterイベントの
発生するタイミングが「フォーカス移動の直前」であるために、VBAでFocusを
設定した後に、Enter/Tabの入力が反映されてしまっているようです。

試行錯誤の末、一応、「TextBox2のExitイベントを制御するための変数を
モジュールレベルで宣言」することにより、TextBox2にフォーカスを残すように
できました・・・が、今度はコマンドボタンのクリックによる移動の場合に、
TextBox2から抜けるのに2回Enter/Tab/Clickが必要になってしまいました(汗)
(Accessと違い、Excelのユーザーフォームでは、SetFocusによる移動時には
 Enterイベントが発生しないらしく、フラグが意図した通りに初期化されない)

ともあれ、こちらで試したコードを以下に提示します:


Option Explicit

'TextBox2のExitイベントを制御する変数を宣言
'(=TextBox2のExitイベントをキャンセルさせるためのフラグ)
Private bolT2Hold As Boolean

Private Sub CommandButton1_Enter()
  MsgBox "Ok"
  'Exitイベントのキャンセルフラグをオンにする
  bolT2Hold = True
  TextBox2.SetFocus
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  'フラグがオンの場合はExitイベントをキャンセルしてフォーカスを保持する
  Cancel = bolT2Hold
  'フラグを初期化(TextBox2の編集後などにまでキャンセルされるのを回避)
  bolT2Hold = False
End Sub


CommandButton1で立てるフラグをTrue/Falseではなく時刻の記録とし、
「TextBox2のExitイベント発生時の時刻とほぼ同時ならキャンセル」と
いうのも試してみましたが、Tabキーを押しっぱなしにした場合などの動作が
結局制御できていない状態になるため、断念しました(汗)

以上、中途半端な回答で申し訳ありませんが、参考まで。
(通常通り、コマンドボタンのクリック/コマンドボタン上でのEnterキー入力で
 対応した方が、(特にExcelユーザーフォームでは)制御しやすそうです(汗))
    • good
    • 0
この回答へのお礼

大変遅くなりまして申し訳ありません。

さらに、細かく調べて頂いてありがとうございます。

ご提示いただいた内容だけでも、納得な事が多く参考になりました。
ありがとうございます!

お礼日時:2009/07/24 08:01

「コマンドボタン上でのEnterキーの入力でコマンドボタンのClickイベントを」


ではなく、「コマンドボタンへの移動だけでコマンドボタンのClickイベントを」
というのは、かなり特殊な動きかと思います。

この特殊な動きをさせるのであれば、イベントへの動作の割り当ての仕方も、
特殊になることを覚悟した方がよさそうです。

・・・ということで、
  コマンドボタンのClickイベントには一切処理を置かず、
  Clickで行おうとしていた全ての処理を、Enterイベントに割り当て
とされてはいかがでしょうか。
(「コマンドボタンをマウスクリックした後、再クリック」したとしても、1回目の
 クリックで他のコントロールにフォーカス移動しているので、2回目のクリック
 でもコマンドボタンのEnterイベントはちゃんと発生してくれます)

Private Sub CommandButton1_Enter()
  MsgBox "Ok"
  textBox2.SetFocus
End Sub


※ご質問のアプリケーションが不明ですが、こちらはAccess2003で動作確認
 しました。
    • good
    • 0
この回答へのお礼

ありがとうございます。

さっそく試してみました。

結果、textBox2ではなく、textBox1にフォーカスが移動してしまいました。
もしかしたら、各コントロールの設定によっても挙動が変わってくるのでしょうか。

こちらの環境をお伝えするのを忘れておりました。
Windows Vista home premium
Excel2007
となります。

お礼日時:2009/06/16 14:04

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

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

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

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

Qテキストボックス(VBA)でEnterを押したときに作動するマクロ

Excel2000を使用しています。

VBAで、ワークシート上にあるテキストボックス内にカーソルがある状態で、Enterキーが押されたときに作動するマクロを作りたいのですが、方法が分かりません(ヘルプや翔泳社のVBA辞典も見たのですが、どうもよく分かりません)

ちょうど、gooやYahoo!の検索窓のような感じでマクロを動作させたいのですが、どのようにしたら良いでしょうか?ご存知の方、どうか宜しくお願いいたします。

Aベストアンサー

「テキストボックス」と言ってもいろいろ種類があるのですが・・・
オートシェーブの「テキストボックス」ではないですよね。

Excelのメニューから[表示]-->[ツールバー]-->[コントロールツールボックス]を
指定し、ツールボックスの中ににある「テキストボックス」をクリックして、
シート上でクリックして配置します。
そのコントロールをWクリックして表示されたコードウィンドウで、下記コードを
上書き貼り付けします。

これで如何でしょうか。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
    ByVal Shift As Integer)
  If KeyCode <> 13 Then Exit Sub
  MsgBox "<Enter>を押しましたね。"

  'ここにコードを記述します。

End Sub

QVBA エンターキーでイベントに入りたい。

テキストボックスにデータ入力後エンターキーの押下でイベントに入りたいのですが、下記のコーディングで[通過]メッセージが表示されません。英数字は通過しますが、エンターキーは動作停止します。
これと全く同じコーディングでVB6は正しく動きます。(ただし、Pvate Sub text1_KeyPress(KeyAscii As Integer)に変更してます。)
<コーディング>
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Msgbox "通過"
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
End If
End Sub

これが出来ると、そのつどキーボードから手を離さずに済むので作業効率がグンとあがります。どうかよろしくご教示ください。Excel2003SP3

Aベストアンサー

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃっているようですが、はっきり言えば、その最初のコードは、VBAでは間違っています。それに気がついてください。

質問のコードのままのコードでは、Enter キーのイベントは、取れないのです。別にPCの故障でもソフトの問題でもないし、こちらが試していないわけでもありません。

Visual Basic とVBAは、細かい点で違います。

VBAのこの種のイベントの KeyAscii では、VB6 で取れる、EnterキーのKeyAsciiの 「13」 は、取れません。 KeyAscii は、MSForms.ReturnIntegerとなって、Integer ではありません。

だから、私は、その代わりとして、KeyDown イベントを使えばよいとしているわけなのです。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = vbKeyReturn Then
  MsgBox "Enterキーが入りました", 64
  'KeyCode =0
 End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 MsgBox "通過"
End Sub

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃってい...続きを読む

QエクセルVBA テキストボックスへのセットフォーカスについて

エクセルVBAでユーザーフォーム内に配置されたテキストボックス
への数値の入力時に、指定範囲内になければメッセージボックスで
規格外であることを警告し、その規格外が入力されたテキストボックス
を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが
どうすればよいのでしょうか?
自分で考えた構文です。
Private Sub TextBox1_AfterUpdate()
Dim A As Single

A = TextBox1.Text
If A < 1.99 Or A > 3.00 Then
MsgBox "規格外!!"
    TextBox1.Text = ""
TextBox1.SetFoucus
End If
Exit Sub

End Sub

これですと、次のテキストボックスにフォーカスが移動してしまいます。
次のテキストボックスにフォーカスを移動させずに、規格内の値が
入力されるまでフォーカスを移動させない方法を教えて下さい。
お願い致します。

エクセルVBAでユーザーフォーム内に配置されたテキストボックス
への数値の入力時に、指定範囲内になければメッセージボックスで
規格外であることを警告し、その規格外が入力されたテキストボックス
を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが
どうすればよいのでしょうか?
自分で考えた構文です。
Private Sub TextBox1_AfterUpdate()
Dim A As Single

A = TextBox1.Text
If A < 1.99 Or A...続きを読む

Aベストアンサー

こんにちは。Wendy02です。

>イベントをAfterUpdateにしましたが、Wendy02さんはExitを使っていますが、AfterUpdateではなぜ正しく動作しないのでしょうか?

イベント自体の問題よりも、イベントの機能を良くみたほうがよいですね。
_Exit(ByVal Cancel As MSForms.ReturnBoolean)

ここで、Return(戻り値)のブーリアン値があるようなので、それを利用しただけです。

>Cancel = True
が、フォーカスの移動をキャンセルしています。

別に、Exit でなくても良いのです。例えば、

_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
のKeyCode に入った 「13(Enter)」のコードを 0 で打ち消す方法でも、可能です。

If が True の時に、
 MsgBox "規格外!!",16
 TextBox1.Text = ""
 KeyCode = 0

でも可能です。

「なぜ?」というよりも、そういうパターンがあるということです。たぶん、AfterUpDateでも、方法によってはできるとは思いますが、かなり難しくなるのではないかなって思うだけです。

こんにちは。Wendy02です。

>イベントをAfterUpdateにしましたが、Wendy02さんはExitを使っていますが、AfterUpdateではなぜ正しく動作しないのでしょうか?

イベント自体の問題よりも、イベントの機能を良くみたほうがよいですね。
_Exit(ByVal Cancel As MSForms.ReturnBoolean)

ここで、Return(戻り値)のブーリアン値があるようなので、それを利用しただけです。

>Cancel = True
が、フォーカスの移動をキャンセルしています。

別に、Exit でなくても良いのです。例えば、

_KeyDown(By...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QユーザーフォームでTextBox1にカーソルを移動したい

お世話になっております。

ちょっと前に http://bit.ly/2bBRhzo で、
ユーザーフォームからNASの中にある図面(pdf)を
タブレットの画面に表示するというマクロを頂きました。
アドバイスして下さったみなさん、ありがとうございます。

ものすごく良く出来たマクロで、
びっくりしてるのですが、1点追加したい機能があります。
画像を見て頂ければおわかりのように、
ユーザーフォーム上に、テキストボックスが2つあります。

2段目右の「クリア上下」というボタンをタップしたら、
テキストボックスが2つともクリアになるのですが、
「クリア上下」をタップした後、
マウスカーソルが上のテキストボックス(TextBox1)に移動するようにしたいと思っております。

素人の感覚で考えると、「Range("A1").Select」で、
カーソルが「A1」セルに移動するので、

Range("TextBox1").Select とか
TextBox1.Value = ""  とかで、

マウスカーソルがTextBox1の中に移動するような気がします。
ですが、実際にやってみたのですが、
両方とも機能しません。

Range("TextBox1").Select エラー
TextBox1.Value = "" 空欄になるだけでカーソルの移動なし

という状況です。

すいませんが詳しい方、説明の上手な方、直接、コードで説明できる方、
お手数ですがユーザーフォームでボタンを押したらカーソルがTextBox1に
移動する方法を教えて下さい。よろしくお願いします。

------------------------

追記
http://bit.ly/2bBRhzo でコードを書いて下さった。
ki-aaaさん、ありがとうございます。

軽くカスタムして使っておりますが、
細かいところまで、しっかり作りこんで頂いて
本当に感謝しております。

この場を借りて改めてお礼させて頂きます。
ありがとうございました。

※特に以下の件はチョー助かってます。

1)ボタン1発でパターンAとBの両方に対応している。
2)ファイルパスの書き換えが1か所
  ※NASのフォルダーが深いので助かりした。
3)「Sheet2」への書き込み
  ※忘れてました!サンプルにMacro1を記載しておいて良かったです

お世話になっております。

ちょっと前に http://bit.ly/2bBRhzo で、
ユーザーフォームからNASの中にある図面(pdf)を
タブレットの画面に表示するというマクロを頂きました。
アドバイスして下さったみなさん、ありがとうございます。

ものすごく良く出来たマクロで、
びっくりしてるのですが、1点追加したい機能があります。
画像を見て頂ければおわかりのように、
ユーザーフォーム上に、テキストボックスが2つあります。

2段目右の「クリア上下」というボタンをタップしたら、
テキストボッ...続きを読む

Aベストアンサー

「TextBox1.SetFocus」ではダメですか?

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エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?

エクセルのVBAでユーザーフォームの中に
テキストボックスとラベルがあります。

ラベルの縦幅とテキストボックスの縦幅は
同じです。(文字1行分くらい)

そのテキストボックスの左隣にラベルを置いて、
項目名的なものを表示させたいと思うのですが
ラベルの値が上に寄っているので、垂直方向に
中央揃えさせたいのですが、設定の仕方が
分からず困っています。

ちなみにエクセルはXPで、VBAは詳しくありません。
詳しくないけど調べながらちょっとずついろいろ
作業しています。

どうぞよろしくお願いします。

Aベストアンサー

文字の上下中央設定は、確かにできませんね。
代案ですが、次のような操作はいかがでしょうか。

1.双方を選択した状態でプロパティを表示し、AutuSize の値を True にする。
2.前回のようにコントロールの位置を上下中央で揃える。
3.各コントロールの長さ(幅)や文字サイズを調整する。

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

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

Aベストアンサー

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

Qエクセルで、任意のテキストボックス等にフォーカスを移したい

すいません、またまた質問です。

エクセルXPで、ユーザーフォーム上に
複数のテキストボックスやリストボックスを
置いて入力した値が任意のシートのセルに
入力されるというものを作っています。
(しかしながらVBAがほとんど見様見真似レベル
なのでかなり悪戦苦闘(~_~*))

そこで、ユーザーフォームにて例えばTEXTBOX1に
入力後、Enterで次のテキストボックス(又は
リストボックス)にフォーカスを移したいのですが、
その時に任意のテキストボックス等にフォーカスを
移すことは可能でしょうか。

番号順(なのかな?)に自動でフォーカスを
移動させることはできたのですが、任意の対象へ
移動させるやり方とかってあるのでしょうか。

例えばTEXTBOX1からRISTBOX5へ移すとか。

入力する順番に移動できたらユーザーフォーム上での
入力作業が非常に楽になると思って(^o^;)

どうぞよろしくお願いします。

Aベストアンサー

#2 tommy-pie83 さんのご回答で良いとおもいますが、
その作業は面倒なので、

VBE でフォームオブジェクトを表示した状態で、
[表示]-[タブオーダー]

で調整です。ちなみに、フォーカスを取得させない
コントロールなら、「TabStop」プロパティーを
False にします。

QEXCELマクロで上書きメッセージ無しで保存する方法

EXCELマクロで上書きメッセージ無しで保存する方法をお願いします
ActiveWorkbook.SaveAs "C:\Documents andSettings\Nakatani\MyDocuments\Book1.xls"
の様にするとすでにファイルがある場合上書きメッセージが出ます
メッセージを出さずに上書きするプログラミングを教えて下さい
宜しくお願いします

Aベストアンサー

Application.DisplayAlerts = False
ActiveWorkbook.SaveAs "C:\Documents andSettings\Nakatani\MyDocuments\Book1.xls"
Application.DisplayAlerts = True


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

人気Q&Aランキング