• ベストアンサー

Excelユーザーフォームにて

Excelユーザーフォームのある部分にて 『職員番号』を入力したら『職員氏名』がでる仕組みを作りたいのですが Label職員名.Caption = Application.VLookup(Text職員番号.Value, Worksheets("Sheet1").Range("A45:D64"), 2, False) で『型が一致しません』とエラー13が出ます? どこがおかしいのでしょうか? 自分でいろいろ調べましたが皆目見当つきません よろしくお願いします

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 たぶん、誰が書いたものをみて、そういうコードを書いたのだと思いますが、元の参考にしたコードがうまくないかもしれません。ワークシートの関数の扱いはとても難しいです。特に、エラー値を返すものは、きちんとした書き方をテキストやしかるべき人のコードを参考にして覚えたほうがよいです。ちなみに、私個人のコードでは、あまり、そのように書いたことはありません。何があるか分からないからです。 '-------------------------------------- Label職員名.Caption = Application.VLookup(Text職員番号.Value, Worksheets("Sheet1").Range("A45:D64"), 2, False) Label職員名.Caption ←いきなり、Label に入れてはいけません。 Text職員番号.Value の出力には、BSコードなど文字以外のものも含まれます。それを、関数に入れたら、必ずエラーが発生します。今回のエラーはこれに該当するように思います。 また、VlookUpは、引数のデータ型の区分けをしますから、数値なら、ValやCLng(CDbl)で、数値に変換しなければなりません。一部の人が批判するVal のバグは、VB6 では解消されています。IsNumeric で仕分けをすれば、CLng 等でも可能ですが、そのまま、CLng(TextBox1.Value)などは使ってはいけません。Val はエラーは出しませんが、文字列に対して、CLng はエラーを出します。 (私の思いつく範囲で、まだあるかもしれません) '-------------------------------------- Dim buf As Variant '←Variant 型のみ If IsNumeric(Text職員番号.Value) Then  buf =Application.VLookup(Val(Text職員番号.Value), Worksheets("Sheet1").Range("A45:D64"), 2, False) End If If Not IsError(buf) Then  Label職員名.Caption = buf End If '-------------------------------------- これ以上でエラーが発生したり、値が出ない場合は、一旦、ワークシートで、関数を確かめてください。

Alshark
質問者

お礼

ありがとうございます 動作しました、まだまだサンプルデータやネットからコピペすることが多いのでエラーに対応しきれないのが現状です >Label職員名.Caption ←いきなり、Label に入れてはいけません これも全く知りませんでした。 結局同じだから短縮してもいいのかと(汗) もっともっと勉強しなくてはと再認識しました 解りやすい回答ありがとうございました

その他の回答 (1)

回答No.1

Sheet1 の A列のセルの型は? 数値扱いになってないでしょうか。

Alshark
質問者

お礼

早速の回答ありがとうございます おっしゃる通りA列は番号(数値)、B列は氏名、C列は姓のみ…と続きます 式自体がおかしいのですか?

関連するQ&A