• ベストアンサー

エクセル VBA ID入力について

TextBox2に数字をIDを入力して 名前をComboBox1.Text に表示させるようにしました。 しかし、数字入力すると認識される物もあるのですが 表示されない=数字の値は同じ数字 なぜなのでしょうか? Private Sub TextBox2_Change() Dim vRet As Variant vRet = Application.VLookup(TextBox2.Text, _ Sheets("マスタ").Range("A:B"), _ 2, _ False) If VarType(vRet) <> vbError Then ComboBox1.Text = vRet Else ComboBox1.Text = "<< 該当なし >>" End If End Sub Private Sub UserForm_Initialize() With TextBox2 .SetFocus .Text = "ID入力"  .SelLength = Len(.Text) End With 教えて下さい!Sheet2の数字の書式が問題なのでしょうか?

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

試してみれば分かりますが、エクセルでは数値と文字列は「別物」として扱われます      A列   B列 1行目 1    A 2行目 2    B 3行目 3    C という表に対して  =VLOOKUP("1",A1:B3,2,0) は #NA!エラーになります。でも  =VLOOKUP(1,A1:B3,2,0) は結果が「A」になります。つまりエクセルは「数値」と「文字列」を別物として扱うのです。 TextBoxで得られる値は「文字列」です。ですから検索するシートが数値なら、この値でVlookup関数を用いても期待する結果になるとは限りません。 検索するシートの値が「数値」なら Dim A as Double If IsNumeric(TextBox1.value) Then  A = Cdbl(TextBox1.value)  vRet = Application.VLookup(TextBox2.Text,Sheets("マスタ").Range("A:B"), 2, False) End If のように数値に変換してから検索してみてはいかがでしょう

pop2003
質問者

補足

ありがとうございます! Dim A as Double If IsNumeric(TextBox1.value) Then←ComboBox1ですよね?  A = Cdbl(TextBox1.value)←ComboBox1ですよね?  vRet = Application.VLookup(TextBox2.Text,Sheets("マスタ").Range("A:B"), 2, False) End If これをしたの所に入れたのですが・・・ Private Sub TextBox2_Change() 何故でしょうか?出来る所は出来るのですが 出来ない箇所はマクロを変えても SheetのマスタA列に直接、文字形式を数字又は文字列にセルの書式設定 させても認識されません! すいません、理論は理解出来ましたが 何故上手く認識してくれないのでしょうか?

その他の回答 (2)

  • keirika
  • ベストアンサー率42% (279/658)
回答No.3

>表示されない=数字の値は同じ数字 この場合、一つのIDに対して複数の名前が存在すると考えて良いのでしょうか。 また、テキストボックスでは無く、コンボボックスを使用すると言う事は、1つの名前では無く、複数の名前を表示してその中から選択すると 言うことでしょうか。

pop2003
質問者

補足

返事遅れてすいません!お願いします! >この場合、一つのIDに対して複数の名前が存在すると考えて良いのでしょうか。 氏名とIDは個々に持っています。 >また、テキストボックスでは無く、コンボボックスを使用すると言う事は、1つの名前では無く、複数の名前を表示してその中から選択すると言うことでしょうか。 テキストBoxは数字入力=IDです!それが出来ない人がいるのでコンボボックスで選択するようにしました!

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#01です >何故上手く認識してくれないのでしょうか? どんなデータが入力されているか分からないので再回答しようがありません。このような補足を書かれる方が割と多くいらっしゃいますが、回答を得たいならなぜ回答に足る情報を提供しないのでしょうか 先の回答で誤りがありましたので先に訂正します If IsNumeric(TextBox2.value) Then  A = Cdbl(TextBox2.value)  vRet = Application.VLookup(A,Sheets("マスタ").Range("A:B"), 2, False) End If が正しかったです。意味はお考えになりましたか? Vlookupで検索する「TextBox2.Textの値が数値なら」型変換しているのです。(検索するIDは「数値である」ことを前提にしています) ですから補足にある  >←ComboBox1ですよね? は意味を取り違えていると思います。 さて問題の解決策ですが実際のデータが分からない以上一般論で書くしかありませんが、可能性があるものとして ・Double型ではなくLong型あるいはInteger型に変換したらどうか ・TextBox2.Textの代わりに「値」を直書きして実行したらどうなるか ・検索するIDを文字型データに書き換えて実行したらどうなるか など、結局は自分で色々試行錯誤するしかありませんよ。がんばってくださいね(^^)

pop2003
質問者

お礼

返事遅くなりました!すいません。 色々試してみました!が一番最初の記述で Sheets(”マスタ”)のA列のID番号を全て 打ち直したら、表示する事が出来ました! 自分としてはなぜ?と思い悔しいです!(^^! マスタのSheetsにはA:B列に 101122 氏名1 101234 氏名2 ・・・ という具合になっています! 文字列方データーにしたり色々試したのですが・・ ちなみにLong型あるいはInteger型も試しましたが 表示されない氏名もありました。ところが A列を最初から入力し直したら最初の記述で表示出来ました! なぜでしょうか?・・悔しいです!理解不足なのでしょうか? Private Sub TextBox2_Change() Dim vRet As Variant Dim A As Double If IsNumeric(TextBox2.Value) Then A = CDbl(TextBox2.Value) vRet = Application.VLookup(A, Sheets("マスタ").Range("A:B"), 2, False) End If vRet = Application.VLookup(TextBox2.Text, _ Sheets("マスタ").Range("A:B"), _ 2, _ False) If VarType(vRet) <> vbError Then ComboBox1.Text = vRet Else ComboBox1.Text = "<< 該当なし >>" End If End Sub Private Sub UserForm_Initialize() Dim LastRow As Long LastRow = Sheets("マスタ").Range("B65536").End(xlUp).Row ComboBox1.RowSource = "マスタ!B2:B" & LastRow Me.テキスト日付.Value = Format(Now(), "yyyy/mm/dd") With TextBox2 .SetFocus .Text = "ID入力" .SelStart = 1 .SelLength = Len(.Text) End With End Sub やっぱり表示されない氏名はIDを入力し直した方が 良いのでしょうか///

専門家に質問してみよう