プロが教えるわが家の防犯対策術!

教えてください。下記のエラーがでます。
「実行エラー1004 WorksheetFunction.VLookup クラスプロパティが取得できません」
やりたい事は「シート("②価格集計")」のU行に社名があり、社名のシートから
Vlookupで13列を取得したいのです。
社名はその時々で変更されシート名も変更されます。
宜しくお願いします。
Sub Sample2()
Dim i As Long, t As Long, Target As Range
Dim b As String
Dim endrow As Long, s As Long
Dim A As Object, F As Worksheet, E As Object, C As Long

endrow = Sheets("①SPOT売却明細貼付").Range("L" & Rows.Count).End(xlUp).Row - 4
b = Sheets("②価格集計").Range("U2").Value
For s = 1 To Worksheets.Count
If Worksheets(s).Name = b Then

For t = 3 To endrow
Set Target = Sheets("②価格集計").Range("U3:U" & t)
Next t

For i = 3 To endrow
Set A = Worksheets("②価格集計").Range("B" & i)
Set F = Worksheets(s)
Set E = F.Range("A:M") '範囲
C = 13 '列番
Target = WorksheetFunction.VLookup(A, E, C, False)
Next i
Exit For
End If
Next s
End Sub

質問者からの補足コメント

  • うれしい

    fujillinさん、返答ありがとうございます。
    検索値が必ず存在するものと保証できるのでしょうか?
    検索値は1から始まる数値ですが、保証はできないです。
    無い場合もあります。
    Variantですね。有難う御座います。やってみます。

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/05/30 12:26
  • Qchan1962さん、返答有難う御座います。
    Findも取得検証が必要ですが実行後で良いので・・

    そうですね。Findも良いかもしれません。試してみます。

    最大は別シートにありますので合っています。

    ループで繰り返される為
    t = WorksheetFunction.Max(endrow, 3)
    Set Target = Sheets("②価格集計").Range("U" & t)
    このコードは分かりやすく有難う御座います。

    With Worksheets(b) や  set sht=Worksheets(b)
    もやってみます。
    沢山アドバイス有難う御座います。

    No.4の回答に寄せられた補足コメントです。 補足日時:2022/05/30 12:35
  • つらい・・・

    fujillinさん、おはようございます。
    変数Targetの宣言はRangeをVariantに変更しましたが同じエラーがでました。
    また、検索値を完全一致させてみましたがエラーがでました。

    ワークシート名をsheet(1)をWorksheets("実際名")を入れるとエラーがでませんでした。
    Worksheet名の変数に問題があるようです。
    本来ならば、
    Set E = Worksheets("実際名").Range("A:M") '範囲
    C = 13 '列番
    Target = WorksheetFunction.VLookup(A, E, C, False) とやりたいのですが
    VLookUpではシート名の変数はエラーになるらしく、わざわざ、sheets(1)ナンバーを検索し
    sheets(1)のナンバーを取得して変数にしています。

      補足日時:2022/05/31 08:57
  • HAPPY

    If Worksheets("②価格集計").Range("C" & i).Value <> "" Then'★
    Set A = Worksheets("②価格集計").Range("B" & i)
    Set F = Worksheets(b)
    Set E = F.Range("A:M") '範囲
    C = 13 '列番
    Target = WorksheetFunction.VLookup(A, E, C, False)
    Worksheets("②価格集計").Range("U" & i).Value = Target '★
    ★の箇所が間違っていましたので修正してできました。

      補足日時:2022/05/31 14:01

A 回答 (7件)

こんにちは



>WorksheetFunction.VLookup クラスプロパティが取得できません
は、(多分)Vlookupで対象が見つからない場合(=通常の関数だとエラー値になる)に発生すると思われます。
第4引数が、Falseなので完全一致での検索になりますが、検索値が必ず存在するものと保証できるのでしょうか?
保証がない場合は、エラー処理を加えるか、事前にCountifなどで存在を確認して分岐するなどが必要になると思われます。


ご質問とは関係がありませんが・・
>For t = 3 To endrow
>Set Target = Sheets("②価格集計").Range("U3:U" & t)
>Next t
ご提示のコードでは、意味の無い処理となっています。

また、
>Target = WorksheetFunction.VLookup(A, E, C, False)
変数Targetの宣言はRangeになっていますので、Vlookupの値があったとしても、代入時にエラーが発生します。
返される値が不明ですが、Variantなどで受けるようにしておく必要があります。
この回答への補足あり
    • good
    • 0
この回答へのお礼

fujillinさんのNo.3このアドバイスが大変助かりましたので
ベストアンサーにさせて頂きました。

お礼日時:2022/05/31 14:13

No3です。



>Target = WorksheetFunction.VLookup(A, E, C, False) とやりたいのですが
>VLookUpではシート名の変数はエラーになるらしく
そのようなことはないと思います。
きちんと指定できていれば、Rangeオブジェクトはシート名も保持していますので。

そもそも、ご提示のコードでは、(すでにNo4様がご指摘済みですが)処理の対象となるシートは
>Worksheets(s).Name = b
に該当するシートのみです。(他のシートは処理がスキップされるので)
ご提示以外の部分で、変数の内容を変えてしまっていたり、意図とは異なる範囲を指定することになっていませんか?

Vlookupの結果を取得後どのように処理しているのかも不明ですけれど、例えば、
>Target = WorksheetFunction.VLookup(A, E, C, False)
の部分を
 If WorksheetFunction.CountIf(E.Columns(1), A) = 0 Then
  Target = "該当なし"
 Else
  Target = WorksheetFunction.VLookup(A, E, C, False)
 End If
などとしておくことで、検索でヒットしない場合は「該当なし」の文字列がTargetの値になります。

どの行で、「該当なし」になるのかを確認の上、その部分の検索範囲や検索値がどうなっているのかを調べてみれば、実際に何が起こっているのかがわかるのではと思います。
想像するところ、質問様の範囲指定等での勘違いではないかと思いますが・・・
(セル値に見えないスペースが付加されているなども考えられますけれど)
    • good
    • 1
この回答へのお礼

fujillinさん、アドバイス有難う御座いました。
Worksheets(s).Name = bの意味が分かっていませんでした。
また、ご指摘頂いた「該当なし」の処理を行うとできました。
ありがとうございました!

お礼日時:2022/05/31 14:03

本当にすみません。


流れ的にマナーが悪いのですが
#4の
>WorksheetFunction.VLookupは事前検証が必要なので
は正しくないので訂正します
正しくは、Variant型で受けIsErrorで検証できます
すみません。

For i = 3 To endrow
Set A = Worksheets("②価格集計").Range("B" & i)
Set F = Worksheets(b)
Set E = F.Range("A:M") '範囲
C = 13 '列番
Dim VL As Variant
VL = Application.VLookup(A, E, C, False)
If Not IsError(VL) Then
Debug.Print VL
End If
Next i
    • good
    • 1
この回答へのお礼

Qchan1962さん、有難う御座いました。
検証用のコードでデバッグさせて頂きました!
結局下記のコード出来ました。
Sub Sample2()
Dim i As Long, t As Long, Target As Variant
Dim b As String
Dim endrow As Long, S As Long
Dim A As Object, F As Worksheet, E As Object, C As Long
Dim cop As Variant

b = Sheets("②価格集計").Range("U2").Value
For S = 1 To Worksheets.Count
If Worksheets(S).Name = b Then
endrow = Worksheets(S).Range("A" & Rows.Count).End(xlUp).Row + 1
For i = 3 To endrow
If Worksheets("②価格集計").Range("C" & i).Value <> "" Then
Set A = Worksheets("②価格集計").Range("B" & i)
Set F = Worksheets(b)
Set E = F.Range("A:M") '範囲
C = 13 '列番
Target = WorksheetFunction.VLookup(A, E, C, False)
Worksheets("②価格集計").Range("U" & i).Value = Target '★
End If
Next i
End If
Next S
End Sub
有難う御座いました!

お礼日時:2022/05/31 14:07

こんにちは


VLookupについて、fujillin様ご指名用ですが

Findのサンプルをいらぬお節介で書いときます
Sub Sample()
' Dim i As Long, n As Long
Dim endrow As Long
Dim Target As Range, cop As Range
Dim A As Object, F As Worksheet, E As Object, C As Long

endrow = Sheets("①SPOT売却明細貼付").Range("L" & Rows.Count).End(xlUp).Row - 4
C = 13 '列番
' Sheets.Add After:=ActiveSheet
' i = 1: n = 1
' For Each cop In Sheets("②価格集計").Range("U2:U" & WorksheetFunction.Max(endrow, 2))
Set cop = Sheets("②価格集計").Range("U2") '複数会社名時不要
For Each F In Worksheets
If F.Name = cop.Text Then
' Cells(i, n) = cop.Text
With F
Set E = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
For Each A In Worksheets("②価格集計").Range("B3:B" & endrow)
Set Target = E.Find(What:=A.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Not Target Is Nothing Then
Debug.Print Target.Offset(, C - 1).Value 'セル出力時不要
' i = i + 1
' Cells(i, n) = Target.Offset(, C - 1).Value
End If
Next
End With
Exit For
End If
Next
' i = 1
' n = n + 1
' Next
End Sub
コメント部は新規シートを作り U2以降下にも会社名がある場合です
For t = 3 To endrow
Set Target = Sheets("②価格集計").Range("U3:U" & t)
Next t
の勝手な想像です

参考程度で・・・
    • good
    • 1
この回答へのお礼

Qchan1962さん、たくさん考え頂き有難う御座いました。
For Each F In Worksheetsの使い方はやったことが無かったので勉強になりした。
頂きましたコードは、If Not Target Is Nothing Thenになりませんでした。
すみませんが検証しきれませんでした。m(__)m

お礼日時:2022/05/31 14:09

こんにちは 


ご質問については#3様の通りかと思います。

回答ではありませんので参考程度で
掲示コードは他の処理を省かれたものと存じますが、気になりましたので

コードを読むと色々不具合が発生する可能性を感じます
endrow = についてその後使われるシートや列が違うようです
最終行№ が同じになる保証がないと問題が発生する可能性があります

もしかしたら、今回のケースもそれに含まれているかも知れません。
For i = 3 To endrow
Set A = Worksheets("②価格集計").Range("B" & i)

最大
Set A = Worksheets("②価格集計").Range("B" & endrow)
Aを取得したい範囲は合っていますか?

これも既にご指摘がありますが、
Target As Rangeなので setが必要です

下記は目的不明ですが
For t = 3 To endrow
Set Target = Sheets("②価格集計").Range("U3:U" & t)
Next t
ループで繰り返される為
t = WorksheetFunction.Max(endrow, 3)
Set Target = Sheets("②価格集計").Range("U" & t)
と同じ結果になります。

もう一点
b = Sheets("②価格集計").Range("U2").Value
For s = 1 To Worksheets.Count
このループ内に
If Worksheets(s).Name = b Then 以外の処理が無いようでしたら
直接シートを明示する事が出来ます(全てのシートを対象にしなくても大丈夫 なので For s は不要)
With Worksheets(b) や  set sht=Worksheets(b)

個人的にはWorksheetFunction.VLookupは事前検証が必要なので
Findメソッドを使う事が多いです。Findも取得検証が必要ですが実行後で良いので・・
この回答への補足あり
    • good
    • 0

For t = 3 To endrow


Set Target = Sheets("②価格集計").Range("U3:U" & t)
Next t

ここって1つの変数へのSETを繰り返す(上書き)だけで、変数:Target の値は一番最後のセル範囲になる。
なら

Set Target = Sheets("②価格集計").Range("U3:U" & endrow)

これでも同じでは?

Target = WorksheetFunction.VLookup(A, E, C, False)

これも変数:Target は Range型なので VLookup で得られるのはセルの値だから使用する変数の型が違うと思いますけど。
それにセルの値を受けた後に何もしてないのでは?
    • good
    • 0

対象のワークシートがActiveになってないのかな。


……と思ってみたりします。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています