• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロでVLookupが出来ません。)

マクロでVLookupが出来ない?修正方法を教えてください

このQ&Aのポイント
  • A列からE列までデータがあるシート1のA,B,C列の値が全て一致するシート2の行削除をしたいですが、検索値がA列のみの値です。どこを修正すればいいのでしょうか?
  • 現在のマクロではVLookupがうまく機能していないようです。A列からE列までデータがあるシート1のA,B,C列の値が全て一致するシート2の行削除をしたいのですが、検索値がA列のみの値となっています。修正方法を教えてください。
  • マクロでVLookupができず、検索値がA列のみの値となっています。A列からE列までデータがあるシート1のA,B,C列の値が全て一致するシート2の行削除をしたいのですが、どこを修正すればいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

回答2、myRangeです。 質問の回答は、回答2ですが、今度はロジックについて。。 質問の処理をG列を使わないないで、かつ、Vlookupを使ってやるとすると。。。 '------------------------------------------- Sub test()  Dim Line As Long  Dim LastRow As Long  Dim myRange As Range  Dim Flag   With Sheets("8月")  Set myRange = .Range("F2:F" & .Cells(Rows.Count, "A").End(xlUp).Row)  .Range("F2").FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]"  .Range("F2").AutoFill Destination:=myRange End With   Sheets("9月").Select  LastRow = Cells(Rows.Count, "A").End(xlUp).Row  Range("F2").FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]"  Range("F2").AutoFill Destination:=Range("F2:F" & LastRow) On Error Resume Next For Line = LastRow To 2 Step -1  Flag = WorksheetFunction.VLookup(Cells(Line, 6).Value, myRange, 1, 0)  If Err.Number = 0 Then    Rows(Line).Delete xlUp  Else    Err.Clear  End If Next Line   End Sub '---------------------------------------------- 以上です。  

gx9wx
質問者

お礼

思ったとおりできました。 エクセルで関数式を入れる場合、 VLOOKUPを選択すると (テーブルの左端列を検索し指定した列と同じ行にある値を  返します。  テーブルは昇順で並べ替えておく必要があります。) とメッセージがでますが、 このマクロで行う場合も、 テーブルは昇順で並べ替えておく必要があるのでしょうか?

その他の回答 (4)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

またまた、myRangeです。  >テーブルは昇順で並べ替えておく必要があるのでしょうか? それについてはヘルプにちゃんと書いてあります。 以下ヘルプ抜粋。 ------------------------------------------------- VLOOKUP(検索値, 範囲, 列番号, ●検索の型●) ●検索の型● TRUE(1)を指定するか省略すると検索値と完全に一致する値、またはその近似値が返されます FALSE(0) を指定すると、検索値と完全に一致する値だけが検索されます (重要) 検索の型に TRUE を指定するか省略する場合は、 範囲の左端の列にある値を、昇順に並べ替えておく▼必要あり▼ 検索の型に FALSE を指定する場合は 範囲の左端の列にある値を並べ替える▼必要はない▼ ---------------------------------------------------------- で、結論。 今回は、0(FALSEと同値)を指定しているので、並べる必要はない。 機会あるごとにヘルプを眺めることをお勧めします。 以上です。

gx9wx
質問者

お礼

シート1に8,000行 シート2に8,500行のデータで試しました。 手操作でセルに式を入れてVLOOKUPで対象データを検出して あいてる列に印を入力してその印でソートして 対象行を全部手削除した内容と完全一致しました。 ありがとうございました。これで手作業が不要です。 >機会あるごとにヘルプを眺めることをお勧めします。 了解しました。ありがとうございます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.1です。 1行目が項目行だということなので、コードを↓のように訂正してみてください。 (前回のコード内で FOR~NEXT部分の 「1」を「2」にすれば大丈夫だと思います。) 尚、B列とC列が数値(品番?)みたいなので、前回の方法ですと Sheet1の A列・B列・C列をつなげて一つにしたものでSheet2にSheet1を同じものがある行を削除するようにしていました。 これだとB・C列の桁数が違って、B・C列をつなげた場合、同じ結果になる場合があるかもしれません。 それを回避するためにA列はA列・B列はB列・C列はC列一つ一つが一致した場合にSheet2の行を削除するコードにしてみました。 Sub test() Dim ws1, ws2 As Worksheet Dim i, j As Long Set ws1 = Worksheets("sheet1") '←Sheet名は適宜変更してください。 Set ws2 = Worksheets("sheet2") '←こちらのSheet名も適宜変更 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For j = ws2.Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If ws1.Cells(i, 1) = ws2.Cells(j, 1) And ws1.Cells(i, 2) = ws2.Cells(j, 2) And _ ws1.Cells(i, 3) = ws2.Cells(j, 3) Then ws2.Rows(j).Delete (xlUp) End If Next j Next i End Sub

gx9wx
質問者

お礼

シート1に8,000行 シート2に8,500行のデータで試しました。 手操作でセルに式を入れてVLOOKUPで対象データを検出して あいてる列に印を入力してその印でソートして 対象行を全部手削除した内容と一致しました。 ありがとうございました。 これで手作業が不要です。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

質問のタイトルに、VLOOKUPとあるので VLOOKUPのみについていうと、構文にミスあり。 VLOOKUPは、指定範囲の1列目が検索対象になるので 指定範囲が「A2:F10000」だと、A列が検索されます。 質問ではF列を検索するわけですから、VLOOKUPの指定範囲は、 >Worksheets("8月").Range("●A2●:F10000") ではなくて、次のように、”F列”の1列のみにします。  Worksheets("8月").Range("▼F2▼:F10000")   ---------------------------------------------------------- 今回の質問とはかんけいないですが、複数行に分けるときは 分かりやすいところで改行した方が。。。   Cells(Line, 7).Value = _  Application.WorksheetFunction.VLookup( _  Cells(Line, 6).Value, Worksheets("8月").Range("F2:F10000"), 1, 0) -------------------------------------------------- 以上です。  

gx9wx
質問者

お礼

エクセルのセルに式を入れる場合で VLOOKUPを選択すると テーブルの左端列を検索し、指定した列と同じ行にある値を返します。 テーブルは昇順で並べ替えておく必要があります。 とメッセージがでました。 忘れてました。 マクロ初心者ですがRange(  )がよくでてくるので これでいいと思ってしまいました。 ありがとうございました。 >複数行に分けるときは すいません。ここで質問すると、意図しない部分で改行される為 それの対策で文を短くする為に適当にこうしました。 実際は1行です。 申し訳有りません。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! お示しのコードを詳しく確認していません。 質問文の最初の数行を勝手に解釈しての投稿です。 Vlookupではありませんし、的外れだったら無視してください。 結局Sheet1のA~C列とSheet2のA~C列が一致すればSheet2のその行を削除する!という感じです。 Sub test() Dim ws1, ws2 As Worksheet Dim i, j As Long Set ws1 = Worksheets("sheet1") '←Sheet名は適宜変更してください。 Set ws2 = Worksheets("sheet2") '←こちらのSheet名も適宜変更 For i = 1 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For j = ws2.Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 If ws1.Cells(i, 1) & ws1.Cells(i, 2) & ws1.Cells(i, 3) = _ ws2.Cells(j, 1) & ws2.Cells(j, 2) & ws2.Cells(j, 3) Then ws2.Rows(j).Delete (xlUp) End If Next j Next i End Sub

gx9wx
質問者

お礼

説明不足で申し訳ありません。 思ったように動作しました。 ただシート1、シート2共に 1行目には項目が入っています。 よって1行目は削除はまずいのですが、 1行目も削除されてしまいました。 申し訳ありません。

gx9wx
質問者

補足

ありがとうございます。 2000文字に達して詳細を書けませんでした。 シート1  A   B   C D E 1 みかん 2222 6666 111 10001 2 りんご 2222 6666 112 10008 3 ぶどう 2222 6666 111 10013  4 バナナ 1111 8888 112 10038 5 パイン 1111 8888 111 10054 6 いちご 3333 6666 113 10034 7 みかん 2222 7777 114 10027 8 すいか 4444 6666 112 10065 9 ぶどう 5555 6666 114 10063 シート2 シート1に対して重複したいない行が3行増加。 その3行の増加だけ抽出したい。   A   B   C D E 1 みかん 2222 6666 111 10001 2 りんご 2222 6666 112 10008 3 みかん 2222 9999 111 10001 4 ぶどう 2222 6666 111 10013  5 バナナ 1111 8888 112 10038 6 パイン 1111 8888 111 10054 7 キウイ 1111 8888 112 10098 8 トマト 1111 7777 118 10100 9 いちご 3333 6666 333 10034 10 みかん 2222 7777 114 10027 11 すいか 4444 6666 222 10065 12 ぶどう 5555 6666 114 10063 みかんが3行ありますがA,B,C列がシート1と一致するのは 1行目と10行目だけなので3行目は残ります。 9行目のいちごと11行目のすいかはシート1に対して D列の値が相違しますがA,B,C列は同じ値なので重複データとみなします。 ↓行削除後   A   B   C D E 3 みかん 2222 9999 111 10001 7 キウイ 1111 8888 112 10098 8 トマト 1111 7777 118 10100

関連するQ&A

専門家に質問してみよう