[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『WorksheetFunctionで VLookupできない』(花)
Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sheet1のB2セルに=VLOOKUP(A2,Sheet2!B:D,3,FALSE)、B3セルに=VLOOKUP(A3,Sheet2!B:D,3,FALSE)と下にVLOOKUP関数が並び、Sheet2のメアド一覧を参照しています。VBA化で下記コードでエラー「WorksheetFunctionクラスのVlookupプロパティを取得できません。」となり、デバック
「 Sht1.Cells(i, 2) = Application.WorksheetFunction. _
VLookup(Target, MyArea, 3, False)」で止まっています。初心者のため理解できないので解決策を教えていただけませんでしょうか。お願いします。 Sub Vlookup関数で値取得() Dim i As Long Dim Target As String Dim Sht1 As Worksheet Dim Sht2 As Worksheet Dim MyArea As Range 'シートを変数格納 Set Sht1 = Sheets("Sheet1") Set Sht2 = Sheets("Sheet2") '列を参照範囲に格納 Set MyArea = Sht2.Range("B:D") '2〜600行目をループ For i = 2 To 600 '「名前」を取得 Target = Sht2.Cells(i, 2).Value With ActiveSheet Sht1.Cells(i, 2) = Application.WorksheetFunction. _ VLookup(Target, MyArea, 3, False) End With Next i End Sub
< 使用 Excel:Office365、使用 OS:Windows10 >
>Target = Sht2.Cells(i, 2).Value これだとSheet1のA列の値ではなくSheet2のB列の値を検索値にしようとしているが。 Target = Sht1.Cells(i, 1).Value では?
あと >With ActiveSheet >End With は不要では? (ねむねむ) 2022/10/19(水) 09:36:27
'シートを変数格納 Set Sht1 = Sheets("Sheet1") Set Sht2 = Sheets("Sheet2") '列を参照範囲に格納 Set MyArea = Sht2.Range("B:D") '2〜600行目をループ For i = 2 To 600 '「名前」を取得 Target = Sht1.Cells(i, 1).Value Sht1.Cells(i, 2) = Application.WorksheetFunction. _ VLookup(Target, MyArea, 3, False) Next i End Sub (花) 2022/10/19(水) 10:31:30
Sheet1のコードは確かにSheet2に存在するのだろうか? 存在しないコードがあってエラーになっているのではないだろうか? (ねむねむ) 2022/10/19(水) 10:57:35
もしコードが数値の場合、 >Dim Target As String を Dim Target As Variant で試してみてくれ。
これはVLOOKUP関数では数値と文字列の数字とは別とみなすため。 (ねむねむ) 2022/10/19(水) 11:08:02
だから、Targeの値が無いんですよ。
WorksheetFunction
を消してください。
エラー値が書き込まれるはず。
(編集) 2022/10/19(水) 11:12:41
(花) 2022/10/19(水) 11:40:32
(γ) 2022/10/19(水) 11:49:07
■1
提示のコードを整理するとこうなりますよね。
Sub Vlookup関数で値取得_整理() Dim i As Long
For i = 2 To 600 Step 1 Sheets("Sheet1").Cells(i, "B").Value = _ Application.WorksheetFunction.VLookup( _ Sheets("Sheet1").Cells(i, "A").Value, _ Sheets("Sheet2").Range("B:D"), _ 3, _ False) Next i End Sub
まずはステップ実行して、皆さんが言うように何行目の検索値でエラーになるのか調べて見てはどうでしょうか?
■2
考え方によりますが、単純に
(1)数式を書き込む (2)値に変換する
というように考えれば↓のようにもできますよね。
Sub 別案() With Sheets("Sheet1").Range("B2:B600") .Formula = "=VLOOKUP(A2,Sheet2!B:D,3,FALSE)" .Value = .Value End With End Sub
アレコレ悩むよりこちらの方がスマートだったりしませんか?
(もこな2) 2022/10/19(水) 14:13:11
Sht1.Cells(i, 2) = Application.WorksheetFunction. _ VLookup(Target, MyArea, 3, False) Tagetやめて Sht1.Cells(i, 2) = Application.WorksheetFunction. _ VLookup(Sht2.Cells(i, 2), MyArea, 3, False)
もしくは Dim Target As Variant で Target = Sht2.Cells(i, 2).Value2 (編集) 2022/10/19(水) 15:34:27
For i = 1 To Cells(Rows.Count,1 ).End(xlUp).Row
With Sheets("Sheet1").Range("B2:B600") .Formula = "=VLOOKUP(A2,Sheet2!B:D,3,FALSE)" .Value = .Value End With End Sub
(花) 2022/10/19(水) 16:28:37
皆さんあれこれ言っていますけど シート上ではエラーがあるとエラー名が表示されて教えてくれますよね。 マクロから見れば「そんなの存在しない」ということでエラー表示が出るんですよ。 エラーが出るような式はマクロに対してその対策をしておくことが重要です。
対策として一例ですが Target = Sht2.Cells(i, 2).Value If Sht2.Cells(i, 2) = "" Then Exit For ←これ追加(途中に空白がるとそこで終わり。) With ActiveSheet として For から抜ける。 試してみてください。
(?) 2022/10/19(水) 16:59:00
これに対して、あると申しておりますので。
あるのに見つからないと言う事で
多分日付。
ですから、検査値を変数に入れないで、直接セルを参照するか
.value2
でシリアル値で探すと提案したんですが。
質問者は回答をほとんど読んでない上に試してみようとか理解しようとかしてないみたいですが。
(編集) 2022/10/19(水) 20:30:50
(編集) 2022/10/19(水) 15:34:27 での回答を試してみました。 質問者が言っているエラーが表示されますよ。 「質問者は回答をほとんど読んでない上に試してみようとか理解しようとかしてないみたいですが。」 というより前に実際に試行してみたんですか。 (?) 2022/10/19(水) 20:51:16
(編集) 2022/10/19(水) 11:12:41
(編集) 2022/10/19(水) 15:34:27 は、検査値があると言うので日付ではないか?との対応策。 こっちはあると言うが前提。 (編集) 2022/10/19(水) 21:08:34
エラー値が欲しかったら最初に
WorksheetFunction
を消してください。
とかいたがカス雄君。
荒れるのでここで退散カス相手にしてられんは。
(編集) 2022/10/19(水) 21:25:24
Target = Sht2.Cells(i, 2).Value
の中身がどういうタイプの値なのかでエラーになるならないが変わるので、
MsgBox TypeName(Target)
とTarget入力の次に入れておいて出た結果が"Date"なら編集さんがいう日付に当たり、
.Valueの部分を.Value2に変えればVlookUp関数のエラーは出ません。
もし他のタイプならそれを書いてもらえれば、解決へ近づくかと思います。
(補足) 2022/10/20(木) 11:58:00
| コードの具体例を挙げて下さい。 | 数字だけのものですか?数字以外の文字列もあるんですか? という質問を無視する理由を教えてください。原因を知りたいのではなかったのですか。 コードを検索値とした照合の不一致の話なんでしょう? 日付とかどうしてそういう方向に行くのかも理解できなかったですね。 (γ) 2022/10/20(木) 12:59:31
■1
「2022/10/19(水) 10:31:30」に提示されたコードのインデントだけ修正するとこうなります。
Sub Vlookup関数で値取得() Dim i As Long Dim Target As String Dim Sht1 As Worksheet Dim Sht2 As Worksheet Dim MyArea As Range
Set Sht1 = Sheets("Sheet1") Set Sht2 = Sheets("Sheet2") Set MyArea = Sht2.Range("B:D")
For i = 2 To 600 '「名前」を取得 Target = Sht1.Cells(i, 1).Value
Sht1.Cells(i, 2) = Application.WorksheetFunction.VLookup(Target, MyArea, 3, False) Next i End Sub
そして、「Sht1」「Sht1」「MyArea」も邪魔くさいので展開するとこうなります。
Sub Vlookup関数で値取得() Dim i As Long Dim Target As String
For i = 2 To 600 '「名前」を取得 Target = Sheets("Sheet1").Cells(i, 1).Value
Sheets("Sheet1").Cells(i, 2) = Application.WorksheetFunction.VLookup(Target, Sheets("Sheet2").Range("B:D"), 3, False) Next i End Sub
で、今回の「WorksheetFunctionクラスのVlookupプロパティを取得できません。」というエラーは、皆さんが指摘されているようにVLookup関数の結果がエラーになっていると思いますので↓のように発言した次第です。
>>何行目の検索値でエラーになるのか調べて見てはどうでしょうか?
なお、エラーの原因は
>Sheet1のA列にコードB列にメアド >'「名前」を取得 >追加の質問ですが、With Sheets("Sheet1").Range("B2:B600")のB600を変数にする方法
などといってるところから推測すると、A列が日付型であるとか数値を文字列にしたことにより見つからなくなったというよりは、単純に「""」を検索値にしたのでVLookup関数がこけただけですね。たぶん。
なので、(?)さんがコメントされてるようにループを抜けるまではいかなくても、""ならばその行は処理しないとかすればよかったのだろうなとおもいます。
■2
>With Sheets("Sheet1").Range("B2:B600")のB600を変数にする方法
落ち着いて考えればわかると思いますが。変化しうる部分は「B600」ではなく「600」の部分でしょう。
そして、最終行を調べる方法はご存じのようですから、固定部分と合体させてセル範囲を示す文字列を完成させるだけでよいだけでしょう。
Sub 別案() Dim 最終行i As Long
With Sheets("Sheet1") 最終行 = .Cells(.Rows.Count, 1).End(xlUp).Row If 最終行 >= 2 Then .Range("B2:B" & 最終行).Formula = "=VLOOKUP(A2,Sheet2!B:D,3,FALSE)" .Range("B2:B" & 最終行).Value = .Range("B2:B" & 最終行).Value End If End With End Sub
(もこな2) 2022/10/20(木) 20:46:51
(もこな2) 2022/10/20(木) 23:07:54
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.