こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル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

どのように変更すればいいでしょうか?

投稿日時 - 2007-10-26 23:34:38

QNo.3464254

すぐに回答ほしいです

質問者が選んだベストアンサー

こんにちは。

プロパティを入れていなかったりするのは気になるけれども、それ以外は、そんなに問題が見出せませんね。

>カーソルがテキストボックス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

投稿日時 - 2007-10-27 09:23:58

お礼

ありがとうございます。
とても参考になりました。
皆様の意見で改造を入れさせていただきました。

投稿日時 - 2007-10-29 17:53:33

ANo.3

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

こんにちは。

割り込みさせていただきます。

>テキストボックス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 キーを入れても、中身が空(="")なら、そのキーコードはなかったことにする、という意味です。

投稿日時 - 2007-11-01 12:13:30

お礼

ありがとうございます。
参考になりました。

投稿日時 - 2007-11-06 18:51:55

ANo.4

私が力不足で、良く理解できてないかもしれないが
エクセルのシート名 品番マスタ をつくり
A1:F5  に模擬データを作った
品番メーカータイプ品名内容量背番号
123ああ123BAアイウ2354
124あい124CAカキク2354
125あう125AAタチツ2354
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の処理が終わってからしか
行わないようなのですが???
どの処理とはどん案処理のことですか?

投稿日時 - 2007-10-27 20:57:18

補足

説明が悪くてすみません。
NO.2 benelli様の指摘があったように、品番が一致しない限り
テキストボックス1を抜け出ることが出来なかったのです。
皆様の意見を聞いて品番が無いときはテキストボックス1に
カーソルが残るのですが、

テキストボックス1が空白時、Enter処理を行ったとき
次のテキストボックス2にカーソルが行かないようにしたかったのですが・・・
VBだと 
If Text1 = "" then
Text1.SetFocus
End If
以上でカーソルがテキスト1に戻ったと思ったのですが・・・
よかったら、方法を教えてください。

投稿日時 - 2007-10-29 17:30:30

ANo.2

このソースだと、TextBoxの中身が品番と一致しない限り抜け出せなくなってしまってますよね?
(For文内のExit Sub以外にCancel = Trueを回避する方法がないため)

ひとまず

Cancel = True

この部分は不要ではないでしょうか?取りたくない気持ちは分からなくもないですが、こんな頻発するところにCancel入れてしまうと使う側も作る側も困ってしまいます。目先の問題もこの行が原因ですし。

本当にCancelの行を削除してよいかはソース全体を見ないとなんとも言えませんが、ひとまずTextBox1_Exitがいつ発生するのかをもう一度考慮して作り直してみてください。

投稿日時 - 2007-10-27 00:33:22

お礼

ありがとうございます。
そのご指摘のとうりで困っていたのです。
ありがとうございます。
Cancel=Trueはとりあえず削除しました。
品番が無いときはエラーメッセージを出して
もう一度、品番を入れなおすようにテキストボックス1に
カーソルを戻し、Wendy02様を参考にさせていただきました。
空白は最後に入力するコマンドボタンでチェックするように
変更しました。

投稿日時 - 2007-10-29 17:51:58

ANo.1

どうしたいのか???ですが、とりあえず、TextBoxが空文字列ならチェックしないようにしてみては?…すぐにExit Subする
その場合、必要なところで品番のチェックとLabel郡の設定をしなおす必要がありますが…

投稿日時 - 2007-10-26 23:46:40

補足

テキストボック1にカーソルが点灯したままで
コマンドボタンをクリックしてもコマンドボタンの
処理を行わずカーソルが点灯したままなのですが?
>チェックしないようにしてみては?…
とはどのようなことなのでしょうか?

投稿日時 - 2007-10-27 00:01:14

あなたにオススメの質問