Excel VBA質問箱 IV

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

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


11348 / 13644 ツリー ←次へ | 前へ→

【16563】ユーザーフォームでのイベントとカーソル移動について おっちゃん 04/8/2(月) 18:12 質問[未読]
【16566】Re:ユーザーフォームでのイベントとカーソ... IROC 04/8/2(月) 19:34 回答[未読]
【16571】Re:ユーザーフォームでのイベントとカーソ... ichinose 04/8/2(月) 21:56 回答[未読]
【16592】Re:ユーザーフォームでのイベントとカーソ... おっちゃん 04/8/3(火) 13:45 お礼[未読]
【16598】Re:ユーザーフォームでのイベントとカーソ... ichinose 04/8/3(火) 16:40 発言[未読]

【16563】ユーザーフォームでのイベントとカーソル...
質問  おっちゃん  - 04/8/2(月) 18:12 -

引用なし
パスワード
   ユーザーフォームのカーソル移動で質問です。
(過去ログも検索しましたが、うまくヒットしなかったので)

下のようなユーザーフォームがあります。

電話番号
+------+
|   |
+------+

氏名      住所1         住所2
+----------+ +--------------------+ +--------------------+
|     | |          | |          |
+----------+ +--------------------+ +--------------------+

品番   品名     数量   単価   金額
+-----+ +----------+ +-----+ +-----+ +-----+
|   | |     | |   | |   | |   |
+-----+ +----------+ +-----+ +-----+ +-----+

電話番号をキーとして、”得意先情報”シートを検索してヒットしたら氏名、住所1,2を表示して品番にカーソルを移動する。ヒットしなかったらカーソルを氏名に移動するようにしたいのです。
ちなみに電話番号、氏名、住所などはテキストボックスです。
タブオートは、電話番号、氏名、住所1、2、品番の順です。
電話番号のテキストボックスのイベントで、Changeを使いましたが1文字入力するとすぐにイベントが発生してしまい、電話番号チェックに行ってしまいます。仮に1文字の電話番号を登録しておくと検索が成功し、住所が表示されカーソルは品番に移動します。検索が失敗したときは氏名へカーソルが移動します。こちらの意図した通りの動きですが1文字入力しただけでChangeイベントが発生するのは困ります。
ということでExitイベントに変えてみました。
今度は複数文字が入力できるのですが、検索成功後の品番.SetFocusでまたExitイベントが発生してしまい、電話番号チェックを2回通ります。
(なぜExitイベントが起きるかわかるような気もしますが)
その上に検索が成功したとのカーソルが住所2になってしまいます。妙な動きです。

こういう処理をしたいときには、どのようなイベントと処理を行うのが良いのでしょうか?

よろしくお願いします。

【16566】Re:ユーザーフォームでのイベントとカー...
回答  IROC  - 04/8/2(月) 19:34 -

引用なし
パスワード
   Exitイベントを使わずに検索用のコマンドボタンを
配置するのはダメなのでしょうか?

【16571】Re:ユーザーフォームでのイベントとカー...
回答  ichinose  - 04/8/2(月) 21:56 -

引用なし
パスワード
   おっちゃん さん、IROCさん、こんばんは。

ユーザーフォームのExitイベント・・・、
扱いづらいですよね!!

>ユーザーフォームのカーソル移動で質問です。
>(過去ログも検索しましたが、うまくヒットしなかったので)
>
>下のようなユーザーフォームがあります。
>
>電話番号
>+------+
>|   |
>+------+
>
> 氏名      住所1         住所2
>+----------+ +--------------------+ +--------------------+
>|     | |          | |          |
>+----------+ +--------------------+ +--------------------+
>
> 品番   品名     数量   単価   金額
>+-----+ +----------+ +-----+ +-----+ +-----+
>|   | |     | |   | |   | |   |
>+-----+ +----------+ +-----+ +-----+ +-----+
>
>電話番号をキーとして、”得意先情報”シートを検索してヒットしたら氏名、住所1,2を表示して品番にカーソルを移動する。ヒットしなかったらカーソルを氏名に移動するようにしたいのです。
>ちなみに電話番号、氏名、住所などはテキストボックスです。
>タブオートは、電話番号、氏名、住所1、2、品番の順です。
>電話番号のテキストボックスのイベントで、Changeを使いましたが1文字入力するとすぐにイベントが発生してしまい、電話番号チェックに行ってしまいます。仮に1文字の電話番号を登録しておくと検索が成功し、住所が表示されカーソルは品番に移動します。検索が失敗したときは氏名へカーソルが移動します。こちらの意図した通りの動きですが1文字入力しただけでChangeイベントが発生するのは困ります。
>ということでExitイベントに変えてみました。
>今度は複数文字が入力できるのですが、検索成功後の品番.SetFocusでまたExitイベントが発生してしまい、電話番号チェックを2回通ります。
>(なぜExitイベントが起きるかわかるような気もしますが)
>その上に検索が成功したとのカーソルが住所2になってしまいます。妙な動きです。
>
>こういう処理をしたいときには、どのようなイベントと処理を行うのが良いのでしょうか?
これ自体は、Keydownイベントなどで対処できます。
一例ですが、
'=========================================================================
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Select Case KeyCode
   Case 13, 9 'EnterキーとTabキー
   With TextBox1
     If .Text = "1" Then '実際にはここを電話番号を検索した結果で分岐する
      TextBox5.SetFocus
      End If
     End With
   Case 40
    KeyCode = 0
   End Select
End Sub


確認してみて下さい

【16592】Re:ユーザーフォームでのイベントとカー...
お礼  おっちゃん  - 04/8/3(火) 13:45 -

引用なし
パスワード
   IROC さん、ichinose さん ありがとうございます。
Changeイベントは、私の理解が違っていたようで、正しい使い方ではなかったようです。

IROCさんの検索ボタンは、とても有効です。早速取り入れたいと思います。
どうしても今やっていることがうまくいかないと、代替案などの余裕が無くなってしまっていて、とても恥ずかしいです。

ichinoseさんのKeydownイベント案、こんな使い方なんですね。
こちらもとても参考になります。

IROCさんと、ichinoseさん、お二人ともとても詳しいようですが、どう勉強されたのですか?私は、独学というかとりあえずやりたいことをしながら解決しているため、基礎となる部分がありません。良い勉強法は、やはり専門書を見ることですか?

よろしくお願いします。

【16598】Re:ユーザーフォームでのイベントとカー...
発言  ichinose  - 04/8/3(火) 16:40 -

引用なし
パスワード
   ▼おっちゃん さん:
こんにちは。
>>ichinoseさんのKeydownイベント案、こんな使い方なんですね。
>こちらもとても参考になります。
昨日は、ねむくなっちゃって・・・、Setfocusメソッドが言う事を聞いてくれる
KeyDownイベントしか記述しませんでしたが・・・。

実は、おっちゃん さんが なさりたいと思われる仕様はこれだけでは
不十分なんです。
KeyDownイベントは、あくまでキーを押したときに発生するイベントです。
仮に前回のコードでTextbox1に"1"を入力した後にマウスでTextbox6をクリックした場合
KeyDownイベントは発生しません(おそらくは、これではおっちゃん さんの仕様と違うのでは??)。
Userformのテキストボックスを使用して一般的なアプリのような動作をさせるのは
簡単ではないという前置きをして・・・。
以下のようなコードを試してみて下さい。
おっちゃん さんの最初の投稿にあるようなユーザーフォーム(Userform1)を考えます。
テキストボックスは、Textbox1〜Textbox9として

このユーザーフォームのモジュールに
'=================================================================
Private t1_ev_flg As Long
'0: イベントは実行されていない
'1: Keydownが実行された
'=================================================================
Private Sub UserForm_Initialize()
  t1_ev_flg = 0
End Sub
'======================================================================
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Select Case KeyCode
   Case 13, 9 'EnterキーとTabキー
   t1_ev_flg = 1
   With TextBox1
    If 検索(.Text) = True Then '実際にはここを電話番号を検索した結果で分岐する
      TextBox5.SetFocus
      End If
     End With
   Case 40
    KeyCode = 0
   End Select
End Sub
'================================================================
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If t1_ev_flg = 0 Then 'Keydownイベントが発生していない場合
   Call 検索(TextBox1.Text)
   End If
  t1_ev_flg = 0
End Sub
'================================================================
Function 検索(txt) As Boolean
'ここには、実際は電話番号(Textbox1)での検索処理を記述します
'結果として、見つかったか、見つからなかったかをTrue、Falseで呼び出し
'側に返します。

'ここでは、簡単に"1"だったらTrue、それ以外Falseにしました
'また、"1"のときは、
' Textbox2〜Textbox4には、名前や住所の代わりに"aaa"がセットされます

  Dim mes As String
  検索 = False
  If txt = "1" Then
   mes = "aaa"
   検索 = True
  Else
   mes = ""
   End If
  For idx = 2 To 4
   Controls("textbox" & idx).Text = mes
   Next
End Function

上記のようにしておくとTextbox1に"1"が指定されて、マウスで例えば
Textbox7がクリックされてもTextbox2〜Textbox4に検索した結果が
表示されるはずです。


>どう勉強されたのですか?
このサイトで回答投稿をする事で勉強しました、いえ、今も勉強中です。
これは、私個人の考えですが、とにかく、他人のコードをたくさん読むことは
おすすめです。それをHELPやこういう質問箱を使いながら解読していく。
それと何でもいいからご自分で仕様をきめてひとつ完成品をつくることですよ。

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