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

エクセル2002使用です。

VBAの記述で、WorksheetFunction.VLookupを使って求めた値の入っているセルの列方向に一つ下の値を取得したいのですが・・・・

range("A1").Value =WorksheetFunction.VLookup( range("B1").Value, Range("A3:C10"), 3, 1)

例えば上記で得た値がC4セルにあるのであれば、C5セルの値を取得したいのです。
offset(0,1)プロパティーをどこにおけば良いのか良くわかりません。


どうかよろしくお願いします。

A 回答 (4件)

こんにちは。



アイデアとしては面白いですが、基本的なことが違いますね。

Vlookup というのは、もともと、値だけを取り出して、それを扱っているので、そこから、Rangeオブジェクトの情報を取り出すことは出来ません。Rangeオブジェクトのまま使うなら、Index 関数を使いますが、あまり標準的ではありません。通常は、VBAのFind関数を使いますが、Vlookup関数のオプションとの整合性はありません。ですから、この場合は、Match関数を使って切り抜けます。

Columns(3) が、VLookup( range("B1").Value, Range("A3:C10"), 3, 1) の列の「3」にあたります。

'---------------------------------------
Sub TestSample1()
Dim rnum As Long
On Error Resume Next
 rnum = WorksheetFunction.Match(Range("B1").Value, Range("A3:C10").Columns(3), 1)
On Error GoTo 0
If rnum <> 0 Then
 Range("A3:C10").Columns(3).Cells(rnum).Offset(, 1).Select
 rnum = 0 'このプロシージャ一回限りなら、ここは必要はない。
End If
End Sub
'---------------------------------------

この回答への補足

Wendy02様 いつも早速のご回答ありがとうございます。

お時間ございましたら追記お願いしまう。

値を取得するために、
Sub TestSample1()
Dim rnum As Long
On Error Resume Next
 rnum = WorksheetFunction.Match(Range("B1").Value, Range("A3:C10").Columns(3), 1)
On Error GoTo 0
If rnum <> 0 Then
 Range("A3:C10").Columns(3).Cells(rnum).Offset(, 1).Select
  Range("A1").Value = Selection.Value ←値の取得
End If
End Sub

としたのですが、うまくいきません。。。

Range("A3:C10").Columns(3).Cells(rnum).Offset(, 1).Select
の使い方が良くわからないのですが、
お手数でなければよろしくお願いします。

match関数はばっちりできました。

補足日時:2005/10/11 16:13
    • good
    • 0
この回答へのお礼

Wendy02様ありがとうございました。

なんとか無事解決しました。
今後ともよろしくお願いします。

お礼日時:2005/10/11 23:23

こんばんは。



うまくいかなくてすみません。ちょっとヘンだなっと思って、最初のご質問を読み直してみました。

>上記で得た値がC4セルにあるのであれば、C5セルの値を取得したいのです。
>offset(0,1)プロパティー ←これが違いますね。(^^;

Range("A3:C10").Columns(3).Cells(rnum).Offset(, 1).Select
の部分を、


Range("A3:C10").Columns(3).Cells(rnum).Offset(1).Select

それで、OKが出来ましたら、

'---------------------------------------

Range("A1").Value = Range("A3:C10").Columns(3).Cells(rnum).Offset(1).Value

'-------------------------------------

と、つなげてしまったほうが、負担が少ないです。

この意味は、
("A3:C10")の範囲の(3)列目の(rnum)番目という場所の下(Offset(1))ということです。

ダメなときは、その部分に、
これを使ってチェックしてみてください。

 MsgBox Range("A3:C10").Columns(3).Cells(rnum).Offset(1).Address(0,0)
    • good
    • 0
この回答へのお礼

("A3:C10")の範囲の(3)列目の(rnum)番目という場所の下(Offset(1))ということです。

こんな記述の仕方もあるのですね。
VBAはセルの参照とかが一番難しいです。
ありがとうございました。

お礼日時:2005/10/11 23:28

Offsetメソッドは範囲ー>範囲を求めるメソッドです。


VLOOKUPは関数で、関数は、値を求めるものです。それも行数とかを
求めるのでなく、セルの中の値を求めます。
だから質問は根本的に誤解があります。
どうしても質問のような必要があったら
Sub test01()
x = WorksheetFunction.Match(Range("a3"), Range("h1:h5"), 0)
MsgBox x
End Sub
のように相対的な行数を求めて、すぐ下の行なら、+1して、Cells(x+1,”I”)のようにすればよい。
Matchは値はあたいでも、行数を返してくれるので、この場合には役立つのです。
    • good
    • 0
この回答へのお礼

imogasi さま早速のご回答ありがとうございます。

match関数の使い方よくわかりました。
無事解決いたしました
今後ともよろしくお願いします。

お礼日時:2005/10/11 23:25

>WorksheetFunction.VLookup( range("B1").Value, Range("A3:C10"), 3, 1)



WorksheetFunction.VLookup( range("B1").Value, Range("A3:C10"), 4, 1)
    • good
    • 0
この回答へのお礼

hana-hana3 様早速のご回答ありがとうございました。
今回はNO2さんの方法で解決しました。

今後ともよろしくお願いします。

お礼日時:2005/10/11 23:29

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