[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォーム エクセルの値をTextBoxに表示方法』(ひなの)
いつもお世話になっております。 今回もまた検索でエラーになり原因がわからず質問に来ました。 また、教えていただけると大変助かります。
以前はフィルターを使っての検索方法を教えていただいたんですが。
Q1.今回はApplicationで検索を試したのですが、 エラーで値が検索されないのです。原因がわかりましたら教えてください。よろしくお願いします。
▼フォームの使用 TextBox1 検索値(商品NO) TextBox2〜TextBox10 が 検索結果を表示してます。
▼コード Private Sub TextBox1_Change()
Dim Ap As Long ' Dim ListNo As Long Dim Ctrl As Control
For Each Ctrl In Controls If TypeName(Ctrl) = "TextBox" Then _ Ctrl.Value = "" Next Ctrl
With Worksheets("商品")
Ap = Application.Match(TextBox1.Value, Worksheets("商品").Range("B:B"), 0)
'lRow = .Range("A" & Rows.Count).End(xlUp).Offset(1).Row 'i = 'TextBox1と同じ商品NOを検索
If IsNumeric(Ap) Then TextBox2.Value = .Cells(Ap, 2).Value 'NO TextBox3.Value = .Cells(Ap, 3).Value '商品名 TextBox4.Value = .Cells(Ap, 4).Value '容量 TextBox5.Value = .Cells(Ap, 7).Value '数量 TextBox6.Value = .Cells(Ap, 10).Value '重量 TextBox7.Value = .Cells(Ap, 11).Value '価格 TextBox8.Value = .Cells(Ap, 12).Value '原価 TextBox9.Value = .Cells(Ap, 13).Value '仕入数
Else '↓値が有るときは MsgBox "新規データです。" End If
End With
End Sub
< 使用 Excel:Excel2010、使用 OS:Windows7 >
MATCH をかける前に
For Each Ctrl In Controls If TypeName(Ctrl) = "TextBox" Then _ Ctrl.Value = "" Next Ctrl
ここで TextBox の値をすべて "" にしていますね? 当然 TextBox2 の値も "" になっているわけですが
その "" である TextBox2.Valueで検索していますから具悪いのではないですか?
ところで、 TextBox2 の値で検索しなおすわけですから TextBox1_Change ではなく TextBox2_Change だと思うのですが?
(β) 2016/07/19(火) 19:07
(β)いつもありがとうございます。今回もよろしくお願いします。
早速ドジ発覚ですね ( ̄ ̄ ̄∇ ̄ ̄ ̄;
>ところで、 TextBox2 の値で検索しなおすわけですから TextBox1_Change ではなく TextBox2_Change だと思 うのですが?
すみません間違えです。
指摘していただいた箇所直したんですが、やはり Application=0のままです。
これが原因でしょうか? 検索値は商品番号です。「A01」「B05」とかです。
でもTextBox1に「A」と入力後すぐエラーになります。数字を入れる暇がありません。 これはどうなっているのでしょうか?
Private Sub CommandButton4_Click()こちらは問題なく表示されるんですが。 ただ、ほかのところが・・・・
Private Sub TextBox1_Change()
Dim Ap As Long
With Worksheets("商品")
Ap = Application.Match(TextBox1.Value, Worksheets("商品").Range("B:B"), 0)
'lRow = .Range("A" & Rows.Count).End(xlUp).Offset(1).Row
If IsNumeric(Ap) Then TextBox2.Value = .Cells(Ap, 2).Value 'NO TextBox3.Value = .Cells(Ap, 3).Value '商品名 TextBox4.Value = .Cells(Ap, 4).Value '容量 TextBox5.Value = .Cells(Ap, 7).Value '数量 TextBox6.Value = .Cells(Ap, 10).Value '重量 TextBox7.Value = .Cells(Ap, 11).Value '価格 TextBox9.Value = .Cells(Ap, 12).Value '原価 TextBox10.Value = .Cells(Ap, 13).Value '仕入数
Else '↓値が有るときは MsgBox "新規データです。" End If
End With
End Sub
Private Sub CommandButton4_Click() Dim Ap As Long
With Worksheets("商品")
Ap = Application.Match(TextBox1.Value, Worksheets("商品").Range("B:B"), 0)
'lRow = .Range("A" & Rows.Count).End(xlUp).Offset(1).Row
If IsNumeric(Ap) Then TextBox2.Value = .Cells(Ap, 2).Value 'NO TextBox3.Value = .Cells(Ap, 3).Value '商品名 TextBox4.Value = .Cells(Ap, 4).Value '容量 TextBox5.Value = .Cells(Ap, 7).Value '数量 TextBox6.Value = .Cells(Ap, 10).Value '重量 TextBox7.Value = .Cells(Ap, 11).Value '価格 TextBox9.Value = .Cells(Ap, 12).Value '原価 TextBox10.Value = .Cells(Ap, 13).Value '仕入数
Else '↓値が有るときは MsgBox "新規データです。"
End If
End With End Sub
(ひなの) 2016/07/19(火) 19:36
TextBox1_Changeなら問題が発生し、CommandButton4_Clickではうまくいくという理由は1つだけ。 処理コードは全く同じですから、違うのは、検索値として何を与えているかのみ。
ユーザーフォームのTextBoxやComboBoxのChangeイベントは、扱いがきわめて厄介なものです。
たとえば ABC というものをいれて MATCHさせるとします。 おそらく TextBox1.Value に ABC という値が入った形で、TextBox1_Changeが実行されると、そう思っていますよね?
でも、違います。 TextBox に対してAとタイプされた瞬間に動きます。 次に B を入れたときに AB という値で動きます。次に C をいれた時点で ABC という値で動きます。
つまり ABC のうち、A がタイプされたとたんに TextBox1.Value が A という内容で動いてしまいます。 で、A で検索する。見つからない。なので【実行時エラー】になるはずです。(後述)
Changeイベントで対応するなら、見つからない場合は、入力途中だと認識して、セットすべき値をクリアして あとは何もしないで抜ける。
でも、そうすると、最終的にABCで見つからなかった場合も、マクロ内でのMsgBoxによるメッセージもだせないということになります。
CommandButtonクリックによる処理の場合は、ちゃんと ABC と入れた後にクリックするわけですから、検索ができるということなんです。
TextBoxイベントを使うなら、Changeイベントではなく、ABCと入力して確定(EnterやTabなどの押下)させたときに発生する BefopreUpdateやAfterUpdateといった Exit系のイベント処理をする必要がありますね。
次に、【実行時エラー】の件。
MATCHで検索値がない場合、シート上では #N/A になる局面ですね。 この場合、WorksheetFunction.Match を使うと【実行時エラー】になり、マクロが中断します。 それを避けるために Application.Match を使っているわけですね。こちらのほうは、マクロ中断することなく 戻り値として『エラー値』が返されます。(検索成功すれば数値になりますね)
ここまではいいのですが、問題は Dim Ap As Long 。 Long型変数にエラー値を格納しようとすると、【型が違います】という実行時エラーになります。 ですから、エラー値であっても受け入れることができる Variant型で、Dim Ap As Variant として規定します。 そうすると、実行時エラーにはならず、If IsNumeric(Ap) Then が真ではないので、Else にいって MsgBox "新規データです が実行されます。
★ただし、Variant型で受けて実行時エラーを回避したとしても ABC の A だけで動いてしまうことの対処は 必要ですね。
(β) 2016/07/20(水) 07:02
ありがとうございます。
Dim Ap As Long と Dim Ap As Variant てこんなに違いがあるんですね。
Changeイベントもこのような落とし穴があるとは知らなかったです。 使い勝手によってここら辺を気を付けなければならないのですね。 大変勉強になりました。
下記を直したら使用することができました。
IF関数も問題なく作動しています。
他の問題が起こらないことを祈って、ほんとにありがとうございました。
Private Sub TextBox1_AfterUpdate()
Dim Ap As Variant
With Worksheets("商品")
Ap = Application.Match(TextBox1.Value, Worksheets("商品").Range("B:B"), 0)
'lRow = .Range("A" & Rows.Count).End(xlUp).Offset(1).Row
If IsNumeric(Ap) Then TextBox2.Value = .Cells(Ap, 2).Value 'NO TextBox3.Value = .Cells(Ap, 3).Value '商品名 TextBox4.Value = .Cells(Ap, 4).Value '容量 TextBox5.Value = .Cells(Ap, 7).Value '数量 TextBox6.Value = .Cells(Ap, 10).Value '重量 TextBox7.Value = .Cells(Ap, 11).Value '価格 TextBox9.Value = .Cells(Ap, 12).Value '原価 TextBox10.Value = .Cells(Ap, 13).Value '仕入数
Else '↓値が有るときは MsgBox "新規データです。" End If
End With
End Sub (ひなの) 2016/07/20(水) 08:31
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.