重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

マクロなのですが、
Excel97で動作していたものをExcel2003で動かすとエラーが発生します。
エラー発生場所は、

KAZU = Application.VLookup("20061201", Range("範囲"), 2, True)

で、Application.VLookup(20061201, Range("範囲"), 2, True)の値を調べたら
エラー 2042が入っていました。
Excel2003ではVLookupが使用出来ないのでしょうか?

A 回答 (5件)

補足。


VLookupでエラー値が返る時の分岐について

Sub WorksheetFunctionとの違い()
  Dim x As Variant
  
  x = Application.VLookup(1, [{1,2}], 2, 0)
  Debug.Print x
  x = Application.WorksheetFunction.VLookup(1, [{1,2}], 2, 0)
  Debug.Print x
  
  x = Application.VLookup(2, [{1,2}], 2, 0)
  Debug.Print x
  x = Application.WorksheetFunction.VLookup(2, [{1,2}], 2, 0) 'エラー
End Sub

Sub なのでエラー分岐方法が分かれる()
  Dim x As Variant
  
  x = Application.VLookup(2, [{1,2}], 2, 0)
  If IsError(x) Then MsgBox "error"
  
  x = Empty
  
  On Error Resume Next
  x = WorksheetFunction.VLookup(2, [{1,2}], 2, 0)
  On Error GoTo 0
  If IsEmpty(x) Then MsgBox "error"
End Sub
    • good
    • 0

こんばんは。



一応、私個人は、Application.VLookup という、Excel97 の書き方はしません。
別に、それで特別、根拠があるわけではないのですが、古い書き方は、なるべく避けています。変数のデータ型が雑なような気がしてくるからです。


Sub TestMarcoFormula()
Dim Kazu As String '←Variant でもよい。
'しかし、数値型は、0も値だからダメです。
Dim SearchWd As Variant '←Longでもよい。
 SearchWd = 20061201 '←なるべく、数式には直接入れない
 Kazu = "" '一旦、長さ0の文字列を入れます。Variant型は、Empty値。
 On Error Resume Next
  Kazu = WorksheetFunction.VLookup(SearchWd, Range("範囲"), 2, True)
 On Error GoTo 0
   
  If Kazu <> "" Then  '変数が更新されたか調べる
             'Variant型は、IsEmpty()
    MsgBox Kazu
  End If
End Sub


なお、「エラー2042」は、"#N/A" というエラー値です。
それから、Range("範囲") たぶん、名前登録だと思いますが、不安定になりがちですから、VBAの中で定義したほうがよいです。

Const 範囲 As String = "Sheet1!A1:B20"

として、
  Kazu = WorksheetFunction.VLookup(SearchWd, Range(範囲), 2, True) '""を取る
    • good
    • 0

(1)#1のご指摘が可能性が一番高いと思います。


(2)そのほかに、TRUE型でよいですか。ぴったりの値を探すのはFALSE型ですが。該当する値の範囲をさがすのが、TRUE型ですが?
(3)「範囲」の左端列と、第1引数の
”20061201"の数値か文字列かが合っていますか。
質問の例で下は20061201と数値、上は文字列になってます。
実態はどうなってますか。
(4))「範囲」の左端列と関数の第1引数が前後や途中スペースや半角・全角を含めて、思わぬ不統一がありませんか。
>Excel2003ではVLookup
まず変化はないでしょう。先日もバージョンのせいを疑った質問がありましたが、この習慣はよくないと思います。
基礎的な事項は97あたりから変わっていません。変わっている点も
有るので、むつかしいのでしょうが。
    • good
    • 0

こんにちは。


XL2003でも Application.VLookup は使えます。
>エラーが発生します
とは、エラーでコードが止まってしまうという意味ですね?
なんというエラーメッセージですか?

まず、確認すべき事2点あります。

1)KAZUという変数の型は何ですか?
Variant型でないと、Application.VLookupの結果が#N/Aを返す場合は、その答えを格納する事ができません。

2)そのコードは標準モジュールに書かれていますか?
それ以外、例えばシートモジュールなどに書かれている場合、
かつRange("範囲")が他シート範囲を名前定義している場合、Excel.Range("範囲")としなければいけません。



もし、エラー発生...というのが、変数KAZUにエラー値が格納されるという意味であれば、
計算結果が、一般関数でいうところの #N/A を返しているだけですので、検索値や範囲を再確認してみては。
    • good
    • 0

Application.WorksheetFunction.VLookup


では?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!