教えてください。下記のエラーがでます。
「実行エラー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
No.3ベストアンサー
- 回答日時:
こんにちは
>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などで受けるようにしておく必要があります。
No.7
- 回答日時:
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の値になります。
どの行で、「該当なし」になるのかを確認の上、その部分の検索範囲や検索値がどうなっているのかを調べてみれば、実際に何が起こっているのかがわかるのではと思います。
想像するところ、質問様の範囲指定等での勘違いではないかと思いますが・・・
(セル値に見えないスペースが付加されているなども考えられますけれど)
fujillinさん、アドバイス有難う御座いました。
Worksheets(s).Name = bの意味が分かっていませんでした。
また、ご指摘頂いた「該当なし」の処理を行うとできました。
ありがとうございました!
No.6
- 回答日時:
本当にすみません。
流れ的にマナーが悪いのですが
#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
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
有難う御座いました!
No.5
- 回答日時:
こんにちは
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
の勝手な想像です
参考程度で・・・
Qchan1962さん、たくさん考え頂き有難う御座いました。
For Each F In Worksheetsの使い方はやったことが無かったので勉強になりした。
頂きましたコードは、If Not Target Is Nothing Thenになりませんでした。
すみませんが検証しきれませんでした。m(__)m
No.4
- 回答日時:
こんにちは
ご質問については#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も取得検証が必要ですが実行後で良いので・・
No.2
- 回答日時:
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 で得られるのはセルの値だから使用する変数の型が違うと思いますけど。
それにセルの値を受けた後に何もしてないのでは?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
vlookup関数の引数を変数で指定することはできますか?
Excel(エクセル)
-
VLookupで参照する範囲を変数で渡したい
Access(アクセス)
-
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
-
4
エクセル VBA VLOOKUP
Excel(エクセル)
-
5
Excel VBA オートフィルターで選択された箇所のみVLOOLUPで操作したいです。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
VBAがブレークモードになっ...
-
エクセルエラー13型が一致しま...
-
ExcelVBA Range クラスの Page...
-
VBAでのエラー
-
【Excel VBA】マクロをボタンに...
-
EXCEL VBAマクロ中断でデバッグ...
-
AccessVBAでExcelを起動し、罫...
-
マクロについて教えてください...
-
「アプリケーション定義または...
-
EXCEL/VBAで、自分のPCだけエラ...
-
なぜこんな初歩的なVBAのIf文で...
-
プロシージャ名の取得
-
OLEDB.NETで接続できない
-
エクセルVBA、フリーフォームで...
-
「定数式が必要です。」って何...
-
VB6+SQL サーバー 2000 で 実行...
-
Excelで下記のようにマクロを作...
-
DataGridView からの値取得に関...
-
なぜエラーになるのでしょうか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAがブレークモードになっ...
-
実行時エラー3001「引数が間違...
-
VBS実行時エラー オブジェクト...
-
【Excel VBA】マクロをボタンに...
-
マクロについて教えてください...
-
ExcelVBA Range クラスの Page...
-
VBSで変数の宣言はできないので...
-
VBAでのエラー
-
実行時エラー -'-2147417848
-
EXCEL VBAマクロ中断でデバッグ...
-
なぜエラーになるのでしょうか...
-
ADODB.Streamを使用してUTF-8を...
-
VBAのコードがエラーになっ...
-
Outlook.ApplicationをCreateOb...
-
VB6+SQL サーバー 2000 で 実行...
-
ExcelVBAで、ユーザー定義型は...
-
実行時エラー48発生時のDLL特定...
おすすめ情報
fujillinさん、返答ありがとうございます。
検索値が必ず存在するものと保証できるのでしょうか?
検索値は1から始まる数値ですが、保証はできないです。
無い場合もあります。
Variantですね。有難う御座います。やってみます。
Qchan1962さん、返答有難う御座います。
Findも取得検証が必要ですが実行後で良いので・・
そうですね。Findも良いかもしれません。試してみます。
最大は別シートにありますので合っています。
ループで繰り返される為
t = WorksheetFunction.Max(endrow, 3)
Set Target = Sheets("②価格集計").Range("U" & t)
このコードは分かりやすく有難う御座います。
With Worksheets(b) や set sht=Worksheets(b)
もやってみます。
沢山アドバイス有難う御座います。
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)のナンバーを取得して変数にしています。
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 '★
★の箇所が間違っていましたので修正してできました。