- ベストアンサー
エクセルVBA テキストボックス処理?
エクセル2000 VBAにて入力フォームの テキストボックス1に下記を書き込んだのですが カーソルがテキストボックス1にあるとき 他の処理(コマンドボタン、マウスにて他のテキストボックスに カーソルを移すなど)が出来ません。 フォームを閉じるときもメッセージボックスのコメントがでます。 どの処理を行ってもテキストボックス1の処理が終わってからしか 行わないようなのですが??? Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Integer '品番確認用 For i = 3 To 100 If Sheets("品番マスタ").Cells(i, 1) = TextBox1.Text Then Label1 = Sheets("品番マスタ").Cells(i, 2).Value 'メーカー Label2 = Sheets("品番マスタ").Cells(i, 3).Value 'タイプ Label3 = Sheets("品番マスタ").Cells(i, 4).Value '品名 Label4 = Sheets("品番マスタ").Cells(i, 5).Value '内容量 Label6 = Sheets("品番マスタ").Cells(i, 8).Value '背番号 Exit Sub End If Next i MsgBox "品番がありません" TextBox1 = "" Cancel = True End Sub どのように変更すればいいでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 プロパティを入れていなかったりするのは気になるけれども、それ以外は、そんなに問題が見出せませんね。 >カーソルがテキストボックス1にあるとき他の処理(コマンドボタン、マウスにて他のテキストボックスにカーソルを移すなど)が出来ません。 意味がよく理解できないです。ご自身が考えて作ったものではないのでしょうか? それは、Cancel =True の動きのようですが、組み立てた人の考え方ですから、見つからなければ処理させない、という前提に立っているなら、必要なのではないでしょうか? 逆の言い方をすると、見つからなければどうするか、という手順を決めていない、ということだと思います。その部分のコードを取ればよいのか、どうするのかは、他人の私は決められないですね。「見つからなかった」後を、どうするかです。 ちょっと書き換えてみました。良いのか悪いのかは分かりませんが、検索値が見つからなければ、次に進めません。それでは困るなら、Cancel= True を取ればよいです。 それから、検索後に、TextBox1 を空にしてしまうのは、ちょっと抵抗ありましたので、別の方法を考えてみました。 私個人では、Findメソッドなどを使うでしょうけれども、それは、この程度なら差はないと思います。 -------------------------------------------------------------- Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Integer '品番確認用 If TextBox1.Text = "" Then Exit Sub With Worksheets("品番マスタ") For i = 3 To 100 If .Cells(i, 1).Value = TextBox1.Text Then Label1.Caption = .Cells(i, 2).Value 'メーカー Label2.Caption = .Cells(i, 3).Value 'タイプ Label3.Caption = .Cells(i, 4).Value '品名 Label4.Caption = .Cells(i, 5).Value '内容量 Label6.Caption = .Cells(i, 8).Value '背番号 Exit For End If Next i End With If i > 100 Then MsgBox "品番がありません" Cancel = True '見つからなければ進まない End If End Sub 'あえて、終了時に TextBox1_Exit に再帰的に戻っては困るので、以下のようにしました。 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) TextBox1.Text = "" End Sub
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 割り込みさせていただきます。 >テキストボックス1が空白時、Enter処理を行ったとき >次のテキストボックス2にカーソルが行かないようにしたかったのですが・・・ >VBだと >If Text1 = "" then >Text1.SetFocus >End If 今、手元に、VBはないのですが、一応、VBAとして、SetFocus のその考え方では、うまく行かないと思います。 >テキストボックス1が空白時、Enter処理を行ったとき >次のテキストボックス2にカーソルが行かないようにしたかったのですが・・・ 私などは、以下のようなコードを作ります。 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 And TextBox1.Text = "" Then KeyCode = 0 End If End Sub 意味としては、キーコードに、Enter キーを入れても、中身が空(="")なら、そのキーコードはなかったことにする、という意味です。
お礼
ありがとうございます。 参考になりました。
- imogasi
- ベストアンサー率27% (4737/17069)
私が力不足で、良く理解できてないかもしれないが エクセルのシート名 品番マスタ をつくり A1:F5 に模擬データを作った 品番 メーカー タイプ 品名 内容量 背番号 123 ああ123 BA アイウ 23 54 124 あい124 CA カキク 23 54 125 あう125 AA タチツ 23 54 Userform1を挿入 その上に TextBox1 ラベル1-6の6つ(コードからは5つでよいが6つにした) コマンドボタン1つーーこれは事情で独自追加 貼り付けました。 コードはTwxtBox1のExitイベントに Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Integer '品番確認用 For i = 3 To 100 p1: If Sheets("品番マスタ").Cells(i, 1) = TextBox1.Text Then Label1 = Sheets("品番マスタ").Cells(i, 2).Value 'メーカー Label2 = Sheets("品番マスタ").Cells(i, 3).Value 'タイプ Label3 = Sheets("品番マスタ").Cells(i, 4).Value '品名 Label4 = Sheets("品番マスタ").Cells(i, 5).Value '内容量 Label6 = Sheets("品番マスタ").Cells(i, 8).Value '背番号 Exit Sub End If Next i MsgBox "品番がありません" TextBox1 = "" GoSub p1 'Cancel = True End Sub 'Cancel = TrueとGosubを追加 ーー 実行ーユーザーフォームの実行をクリック。 エクセルの上例により、TextBox1に123を入れました。 (1)テキストボックス1つだけであとラベルだけではFocusの移しようが無いのでは?。この点どうしますか。私はとりあえずコマンドボタンで逃げました。 それならいっそ、Exitイベントなどやめて、検索のキッカケをコマンドボタンのクリックにしては。 ーー 結果 123の場合はシートA列に123が存在するので正しき表示しました (2)この後どうしたいのですか。 画面は元のままで、続けて124,125など入れて、コマンドボタンをクリックするとラベルの表示が、それなりに変わりましたが、終わりはどうするつもり? (3)存在しない番号の126を入れてコマンドボタンをクリックしました。「品番がありません」と出て(上記のコードでは)ラベルの前回の表示を消して、フォームは初期状態です。 本当はどうしたいのでしょう。Xボタンでフォームの消滅を待つのでしょうか。 (4)前回の照会結果が、ラベルに残りますが、消去については、どう考えているのでしょうか。? ーー >カーソルがテキストボックス1にあるとき 他の処理(コマンドボタン、マウスにて他のテキストボックスに カーソルを移すなど)が出来ません。 カーソルを引き取るコントロールが無いからでは >フォームを閉じるときもメッセージボックスのコメントがでます。 Xでフォームを消すとそういうことは起こりません出した。これが間違ってますか。 >どの処理を行ってもテキストボックス1の処理が終わってからしか 行わないようなのですが??? どの処理とはどん案処理のことですか?
補足
説明が悪くてすみません。 NO.2 benelli様の指摘があったように、品番が一致しない限り テキストボックス1を抜け出ることが出来なかったのです。 皆様の意見を聞いて品番が無いときはテキストボックス1に カーソルが残るのですが、 テキストボックス1が空白時、Enter処理を行ったとき 次のテキストボックス2にカーソルが行かないようにしたかったのですが・・・ VBだと If Text1 = "" then Text1.SetFocus End If 以上でカーソルがテキスト1に戻ったと思ったのですが・・・ よかったら、方法を教えてください。
- benelli
- ベストアンサー率51% (78/152)
このソースだと、TextBoxの中身が品番と一致しない限り抜け出せなくなってしまってますよね? (For文内のExit Sub以外にCancel = Trueを回避する方法がないため) ひとまず Cancel = True この部分は不要ではないでしょうか?取りたくない気持ちは分からなくもないですが、こんな頻発するところにCancel入れてしまうと使う側も作る側も困ってしまいます。目先の問題もこの行が原因ですし。 本当にCancelの行を削除してよいかはソース全体を見ないとなんとも言えませんが、ひとまずTextBox1_Exitがいつ発生するのかをもう一度考慮して作り直してみてください。
お礼
ありがとうございます。 そのご指摘のとうりで困っていたのです。 ありがとうございます。 Cancel=Trueはとりあえず削除しました。 品番が無いときはエラーメッセージを出して もう一度、品番を入れなおすようにテキストボックス1に カーソルを戻し、Wendy02様を参考にさせていただきました。 空白は最後に入力するコマンドボタンでチェックするように 変更しました。
- gatyan
- ベストアンサー率41% (160/385)
どうしたいのか???ですが、とりあえず、TextBoxが空文字列ならチェックしないようにしてみては?…すぐにExit Subする その場合、必要なところで品番のチェックとLabel郡の設定をしなおす必要がありますが…
補足
テキストボック1にカーソルが点灯したままで コマンドボタンをクリックしてもコマンドボタンの 処理を行わずカーソルが点灯したままなのですが? >チェックしないようにしてみては?… とはどのようなことなのでしょうか?
お礼
ありがとうございます。 とても参考になりました。 皆様の意見で改造を入れさせていただきました。