dポイントプレゼントキャンペーン実施中!

VBA VLOOKUP 別のファイルを参照

いつもこちらでお世話になっている者です。
VBAの勉強をしております。

別のファイルからVLOOKUPで値を参照したいのですが、
範囲を指定してみましたが、
「worksheetFunctionクラスのVlookupプロパティを参照できません」
とのメッセージが出てしまいます。

なお、値は空白になる行もありますので、
if関数で回避してみましたがうまくいきません。

いろいろ試しましたが、何度やってもうまくいかないので
こちらに質問させていただきました。
お詳しい方、ご伝授いただければ助かります。
よろしくお願い致します。
環境はExcel2007です。

Sub sample()

Dim 範囲 As Range
Dim wb As Workbook, wb2 As Workbook
Dim r As Integer,intRow As Integer

Workbooks.Open Filename:="***.xlsm"
Set wb = ThisWorkbook
Set wb2 = ActiveWorkbook
Set 範囲 = wb2.Sheets("PvtSht2").Range("Database3")

r = wb.Sheets("sheet1").Range("A28:N28").End(xlToRight).ColumnintRow = 3
With wb.Sheets("sheet1")
Do Until .Cells(intRow, 1).Value = ""
.Cells(intRow, (r + 1)) = Application.WorksheetFunction.If((Application.WorksheetFunction.VLookup(Cells(intRow, 1), 範囲, 2, False)) = 0, "", Application.WorksheetFunction.VLookup(Cells(intRow, 1), 範囲, 2, False))
intRow = intRow + 1
Loop
End With

End sub

A 回答 (2件)

2つ問題があると思います。



1.Application.WorksheetFunction.If
WorksheetFunctionには「If」はありません。
 単純にVBAのIFを使えば良いと思いますが、結果が「空白」か「0」かまたは
 マッチしない時等対応を変えないとだめだと思います。

2.「worksheetFunctionクラスのVlookupプロパティを参照できません」
 式は合っているとは思いますが、Range("Database3")が気になります。
 試しにRange("A1:B9")等2列以上は問題がありませんが、Range("A1:A9")の1列の場合
 上記エラーメッセージが表示されます。
 「"Database3"」の範囲を確認した方が良いかと思います。

この回答への補足

お返事ありがとうございます。
さっそく試してみました。

1.そうだったのですね、if文は外しました。
On Error Resume Next~On Error GoTo 0で挟んでみたのですが問題ないでしょうか?

2.Set 範囲 = wb2.Worksheets("PvtSht2").Range("Database3")を
MsgBox 範囲.Addressで試してみましたが、参照してほしい場所がきちんと選ばれていました。
範囲は2列です。

下記のように書き直してみたところ、
vlookupが1行ずつずれてしまうのです・・・

もしお分かりでしたら、ご指南いただけますか、よろしくお願い致します。

Sub test2()

Dim wb As Workbook, wb2 As Workbook
Dim r As Integer, intRow As Integer
Dim 範囲 As Range
Dim Database3 As Range


Workbooks.Open Filename:="***.xlsm"
Set wb = ThisWorkbook
Set wb2 = ActiveWorkbook


'wb.Sheets("sheet1").Activate

r = wb.Sheets("sheet1").Range("A28:N28").End(xlToRight).Column


With wb2.Sheets("PvtSht2")
.Range("A4:B" & .Range("A" & _
.Rows.Count).End(xlUp).Row).Name = "Database3"
End With

Set 範囲 = wb2.Worksheets("PvtSht2").Range("Database3")

MsgBox 範囲.Address

intRow = 3
With wb.Sheets("sheet1")

Do Until .Cells(intRow, 1).Value = ""

On Error Resume Next
.Cells(intRow, (r + 1)) = Application.WorksheetFunction.VLookup(Cells(intRow, 1), 範囲, 2, False)
intRow = intRow + 1
On Error GoTo 0
Loop
End With
wb.Activate

End Sub

補足日時:2010/06/08 12:25
    • good
    • 0
この回答へのお礼

こちらの件、あれから試行錯誤して動くようになりました。
おそらく、wbやwb2をきちんとactivateしてなかったのが、原因と思われます。
助言いただきましてありがとうございました。

お礼日時:2010/06/08 16:20

 


ちょっと見で気づいた点。


>VLookup(●Cells(intRow, 1), 範囲, 2, False)

 ●の部分には .(ドット)が必要だと思いますが。。。
 

以上です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
こちらの件、直してみました。
ありがとうございました。

お礼日時:2010/06/08 16:16

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