• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロVLOOKUPの高速化)

マクロVLOOKUPの高速化

end-uの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

VLookup自体が重いので、劇的に改善しようと思えば dictionaryオブジェクトを使ったりする事になります。 Sub 区分検索02()を少しでも改善するなら Sub test1()   Dim r As Range   Dim ri As Range   Dim t As Single   t = Timer   Application.ScreenUpdating = False   Application.Calculation = xlCalculationManual      With Sheets("シート1")     Set r = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Offset(, 2)   End With   r.ClearContents   On Error Resume Next   For Each ri In r     ri.Value = WorksheetFunction.VLookup(ri.Offset(, -2), Worksheets("区分マスター").Range("A1:E60000"), 5, 0)   Next   On Error GoTo 0   r.Replace "", "無", xlWhole      Application.Calculation = xlCalculationAutomatic   Application.ScreenUpdating = True   Debug.Print Timer - t End Sub また、ApplicationレベルでVLookupを使って配列に対して処理をすると 環境によっては速く処理できます。 #Excel2000では配列制限があるためこのままでは使えないです。 Sub test2()   Dim v   Dim t As Single   t = Timer   With Sheets("シート1")     With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))       v = Application.VLookup(.Value, Worksheets("区分マスター").Range("A1:E60000").Value, 5, 0)       With .Offset(, 2)         .ClearContents         .Value = v         .Replace "#N/A", "無", xlWhole       End With     End With   End With   Debug.Print Timer - t End Sub

gx9wx
質問者

お礼

ありがとうございます。 かなり早くなりました。 行数を倍にしても大丈夫です。 1.ここで教えていただいた表示と式停止の場合   13,500行=1:49   27,000行=3:35 2.質問後自作のLOOP文(記述は最後尾に)   13,500行=1:00   27,000行=1:58 3.今回教えていただいたSub test1()   13,500行=0:58   27,000行=1:54  4.今回教えていただいたSub test2()   13,500行=0:49   27,000行=1:36  質問では式を貼付して出た値を値貼付していた ↓ 質問後自分で考えたloop文 Sub 区分検索02() '2010 年11月18日 'シート1のA列を検索値として 'シート区分マスターのA列を検索しヒットしたら 'シート区分マスターの該当行のE列をシート1のC列に転記 'データはそれぞれのシートともに2列目からである 'ヒットしない場合はシート1のC列は空白にする '検索値があるシート選択する Sheets("シート1").Select 'そのシートの検索開始の行数を選択。2行目から開始。 Line = 2 'そのシートの検索値の列を指定1=A列。 'その値がなくなったら検索を終了させる。 Do Until Cells(Line, 1).Value = "" 'エラーとなっても次に進む On Error Resume Next '検索結果を転記する列を指定。Line3=C列 '検索するシートと列(1=A列)とヒットした場合のその行の返す値の列(5=E列)指定 Cells(Line, 3).Value = Application.WorksheetFunction.VLookup(Cells(Line, 1).Value, Worksheets("区分マスター").Range("A1:E60000"), 5, 0) 'VLOOKUP関数が終了又はエラーが発生したら止まる On Error GoTo 0 '検索されなかったときの処理。 If Cells(Line, 3).Value = "" Then Cells(Line, 3).Value = "無" End If '2行目から開始なので次の行の値を検索値とする Line = Line + 1 '検索する値がなくなるまで繰返す Loop End Sub

gx9wx
質問者

補足

2010年11月19日 12:00 申し訳ありません。 回答A-NO.4の補足で間違いです。 >VLOOKUPで行った時と >この記述で行った時で >返ってきた値が相違する行が2,000行ほどあります。 >原因が分かりません。 >多分と思われるのが >シート1の検索値(シート1のA列)に重複レコードがうじゃうじゃランダムに存在するという事くらいですが >重複していない1行のみしかいない行であっても >返ってきた値が相違しています。 >投稿日時 - 2010-11-19 11:51:18 重複レコードはありませんでした。 ですが VLOOKUPで行った時と この記述で行った時で 返ってきた値が相違する行が2,000行ほどあります。 申し訳ありません。

関連するQ&A

  • マクロでVLookupが出来ません。

    マクロでVLookupが出来ません。 A列からE列までデータがあるシート1のA,B,C列の値が全て一致する シート2の行削除をしたいです。 2000行中500行残るはずのダミーで実験してますが全行削除されてしまいます。 Do Until Cells(Line, 6).Value →6の部分を1 VLookup(Cells(Line, 6) →6の部分を1にすれば 500行残ります。ですがこれでは検索値がA列のみの値です。 またそれぞれ1→2、1→3、1→4にしても同じく全行消えこんがらがってます。 シート1のA列のみ検索しているような動きです。どこを修正すればいいのでしょうか? Sub 行削除() 'シート1→8月シート2→9月 Sheets("8月").Select Range("F2").Select ActiveCell.FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]" Selection.AutoFill Destination:=Range("F2:F10000") Sheets("9月").Select Range("F2").Select ActiveCell.FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]" Selection.AutoFill Destination:=Range("F2:F10000") '検索する対象値があるシート選択 Sheets("9月").Select 'そのシートの検索開始の行数を選択2行目。 Line = 2 'そのシートの検索値の列指定6=F列。セルF2の値が検索したい値。 'その値がなくなったら検索を終了させる.Value = ""を追加。 Do Until Cells(Line, 6).Value = "" 'エラーとなっても次に進む On Error Resume Next '検索結果を記入する列を指定。Line7=G列(※1) '検索する値があるシートとその列を指定 'VLookup(Cells(Line, 6)の部分。6=F列 '検索されるシートと検索範囲を指定 'Worksheets("9月").Range("A2:F10000")→セルA2からセルF10000まで '検索されたらその行のどの列の値を結果とするのか指定 1=A列 '検索方法指定0=FALSE完全一致。 Cells(Line, 7).Value = Application.WorksheetFunction.VLookup(Cells(Line, 6)_ .Value, Worksheets("8月").Range("A2:F10000"), 1, 0) 'VLOOKUP関数が終了又はエラーが発生したら止まる On Error GoTo 0 '検索されなかったときの処理 '上記(※1)の部分Line7=G列に値がない If Cells(Line, 7).Value = "" Then 'Line7=M列に無と表示 Cells(Line, 7).Value = "無" End If '2行目から開始なので次の行の値を検索値とする Line = Line + 1 '検索する値がなくなるまで繰返す Loop '1行目が削除されるのを防止セルG1に無とセット Sheets("9月").Select Range("G1").Select ActiveCell.FormulaR1C1 = "無" 'データの最終行の行番号を保持する変数 Dim RwMax As Long '現在処理中の行番号を保持する変数 Dim Rw As Long '対象となるシートを選択。 Worksheets("9月").Select 'データの最終行の行番号を取得。 'Count, 7=G列 においてデータが入っている一番下のセルの行番号 RwMax = Cells(Rows.Count, 7).End(xlUp).Row '最終行から1行目まで繰返し処理。 '行の削除の為下から上へと処理。 For Rw = RwMax To 1 Step -1 '値が無ならそのまま If Cells(Rw, 7).Value = "無" Then Cells(Rw, 7).Value = "無" '無でなかったら行削除 Else Rows(Rw).Delete End If Next Rw 'シート2のF,G列を列削除 Sheets("9月").Select Columns("F:G").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft End Sub

  • マクロdictionaryオブジェクト書き換え

    ここで教えていただいたマクロを   シート1のF列を検索値として   シート2のA列を検索しヒットしたら   シート2の該当行のD列をシート1のAE列に転記。   データの2列目から行う。ヒットしない場合は 無 と転記。 と変更したくて記述を書き換えたらシート1が壊れてしまいました。 正しい記述を教えてください。 ↓教えていただいた書き換え前の正常動作する記述↓ Sub 検索() 'dictionaryオブジェクトを使用 'シート1のA列を検索値として 'シート2のA列を検索しヒットしたら 'シート2の該当行のE列をシート1のC列に転記 'データの2行目から行う。ヒットしない場合は無しと転記 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("Sheet2") '返す値を指定E列 With .Range("E2", .Cells(.Rows.Count, 1).End(xlUp)) '検索する列指定 (1)=A列 v = .Columns(1).Value '返す値のある列指定 (5)=E列 w = .Columns(5).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("Sheet1") '検索値のある列指定 A列 With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next '転記する列を指定 Offset(, 2)=検索値のA列より右2つ→C列 With .Offset(, 2) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub ---- ↓書き換えておかしな動きになった物 ●の部分を変更しました↓ Sub 検索02() 'dictionaryオブジェクトを使用 'シート1のF列を検索値として 'シート2のA列を検索しヒットしたら 'シート2の該当行のD列をシート1のAE列に転記 'データの2行目から行う。ヒットしない場合は無しと転記 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("Sheet2") '返す値を指定D列● With .Range("D2", .Cells(.Rows.Count, 1).End(xlUp)) '検索する列指定 (1)=A列 v = .Columns(1).Value '返す値のある列指定 (4)=D列● w = .Columns(4).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("Sheet1") '検索値のある列指定 F列● With .Range("F2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next '転記する列を指定  'Offset(, 25)=検索値のA列より右25個→AE列● With .Offset(, 25) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • 条件にて行削除をするをマクロで高速化したい

    シート(最初)のA,B,C列を連結した値と シート(残)のA,B,C列を連結した値を照合させ 同じ値の場合は シート(残)の該当行を削除です。 シート(最初)は6,182行 シート(残)は7,561行です。 VLookupを使って処理時間5分です。 VLookupを使わない記述で25分です。 20,000行位のデータを処理したいのですが時間が不安です。 別スレで 「VLookupで処理3分をdictionaryオブジェクトで1秒以内にする方法」を 教えていただきましたが、流用ができません。 シート(残)内にもシート(最初)内にも重複行はありません。 私の記述は「F列を検索用に使用」となっていて F列にデータがある場合、都度記述を書換えないと 使えないので、そこも対応したいです。 照合させる値はA,B,Cの連結値というのは変わらないのですが データがある範囲は都度変化する為です。 ・A~E列とかA~H列とか ・シート残はA~E列、シート最初はA~G列とか 記述そのものを教えてください。よろしくお願いします。 Sub 自動重複削除F列使用() 'シート(最初)のA,B,C列とシート(残)のA,B,C列が一致した行は 'シート残の行を削除 'F列を検索値として使用。 Dim Line As Long Dim LastRow As Long Dim myRange As Range Dim Flag 'シート「最初」のF1に、A,B,C列を結合した値を転記 With Sheets("最初") Set myRange = .Range("F2:F" & .Cells(Rows.Count, "A").End(xlUp).Row) .Range("F2").FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]" 'シート「最初」のF2からデータのあるところまで 'F1の規則でデータ貼付 .Range("F2").AutoFill Destination:=myRange End With 'シート「残」のF1に、A,B,C列を結合した値を転記 Sheets("残").Select LastRow = Cells(Rows.Count, "A").End(xlUp).Row Range("F2").FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]" 'シート「最初」のF2からデータのあるところまで 'F1の規則でデータ貼付 Range("F2").AutoFill Destination:=Range("F2:F" & LastRow) On Error Resume Next '双方のシートのF列を照合させ、ヒットした行は 'シート「残」から行削除をする 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 '検索に使用したF列を削除 Sheets("残").Select Columns("F:F").Select Selection.Delete Shift:=xlToLeft Sheets("最初").Select Columns("F:F").Select Selection.Delete Shift:=xlToLeft Sheets("残").Select Range("A1").Select End Sub ●別方法 Sub 自動重複行削除F列未使用超遅() 'VLOOKUP無 'シート(最初)のA,B,C列とシート(残)の 'A,B,C列が一致した行はシート(残)の行を削除 Dim ws1, ws2 As Worksheet Dim i, j As Long Set ws1 = Worksheets("最初") Set ws2 = Worksheets("残") 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

  • VLOOKUPをマクロで

    マクロ初心者です。すみませんが教えてください。 左下にデータを右側に印刷したいフォームが置いてあります。 (フォームは伝票でA4の用紙で3枚印刷できるようになっています) A2、A3、A4に下のデータの先頭列をコピーするとそれぞれの行に値を返すと共に伝票の所定の場所にも値を返すようになっています。 以前、ある方に作っていただいたマクロを基にしてるのですが、 その際は3行(A2、A3、A4)ではなく1行(A2)だけでした。 3行づつ繰り返し値を返し、印刷できるようにするにはどこを直せばいいのでしょうか? 説明が下手ですみませんが、宜しくお願いします。 R = MsgBox("伝票を出力しますか?", 35) Select Case R Case 6 Moji = InputBox("ホントに?") myadd = 0 Range("a8").Select While ActiveCell.Value <> "" Selection.Copy myadd = myadd + 1 Range("a2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Range("a11").Select ActiveCell.Offset(myadd, 0).Activate ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate _ :=True Wend Case 7 MsgBox ("やめるの?") Case 2 R = MsgBox("押しただけ?") End Select Range("a1").Select End Sub

  • マクロ:別ブックのデータの値を転記

    ExcelでVlook関数を使ってデータを検索していたのですが、マスタの件数(15,000件)と数式が多くなってしまいブックの容量が大きくなってしまって動きづらくなってしまったので、マスタと検索のブックに分け、マクロを使おうと思ってます。 簡単にいうと、 【マスタブック】   A列  B列 1  1   あ 2  2   い 【検索ブック】   A列  B列 1  2   い 2 検索ブックA列1行目に、「2」を入力してマクロを実行すると「い」が表示されるようにしたいのです。   開いておくのは検索ブックはのみです。 Sub 転記() Dim マスタ As Workbook Dim 検索 As Workbook Dim 行, 数字 As Long Dim Bname As String Bname = ActiveWorkbook.Name Workbooks.Open Filename:="C:\Documents and Settings\mi200274\デスクトップ\\マスタ.xls" Workbooks("マスタ.xls").Activate Set マスタ = Workbooks("マスタxls") Set 検索 = ThisWorkbook Set ws1 = マスタ.Worksheets("Sheet1") Set ws2 = 検索.Worksheets("Sheet1") On Error Resume Next 行 = 1 Do Until ws2.Range("A" & 行).Value = "" 数字 = ws2.Range("A" & 行).Value 対象 = ws1.Range("A:A").Find(数字, lookat:=xlWhole).Row ws2.Range("B" & 行).Value = ws1.Range("B" & 対象).Value 行 = 行 + 1 Loop ActiveWorkbook.Close Workbooks(Bname).Activate End Sub 以上のマクロを知人に教わりながら作ってみたのですが、マスタを一度開かないと検索はできないのでしょうか? 重たいデータなのでできれば開かずに検索して値を転記したいので、そのようなコマンド等ご存知の方教えてください。 ちなみにマクロは「新しいマクロの記録」から作る程度の初心者です。よろしくお願いします。

  • 6列を配列に取込し1列を検索値、2列を書出ししたい

    シート(抜取マスタ)のA列と シート(マスタ全部)のA列をぶつけてヒットしたら シート(マスタ全部)の該当行のE列を抜取マスタのF列に転記 するマクロを ヒットしたら シート(マスタ全部)の該当行のE,F列を抜取マスタのF,G列に転記 とか シート(マスタ全部)の該当行のD,F列を抜取マスタのF,G列に転記 シート(マスタ全部)の該当行のE,F列を抜取マスタのF,H列に転記 に改造したいです。 ●部分を修正しなければと思っていますが 思ったように動きません。教えてください。 よろしくお願いします。 Sub 検索貼付() 'シート(抜取マスタ)のA列と 'シート(マスタ全部)のA列をぶつけてヒットしたら 'シート(マスタ全部)の該当行のE,F列を抜取マスタのF,G列に転記 'データは2列目から開始 'ヒットしない場合は 無し と記入 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("マスタ全部") 'シート(マスタ全部)のデータを配列に取込 '(F2の部分とCount, 1の部分 →A~F列となる) With .Range("F2", .Cells(.Rows.Count, 1).End(xlUp)) 'Vに代入する事となる、検索する列の指定.Columns(1)=A列 v = .Columns(1).Value 'Wに代入する事となる、書出す値のある列の指定 (5)=E列 ●w = .Columns(5).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("抜取マスタ") '検索値のある列指定(A2の部分とCount, 1の部分→A列~A列) With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else 'ヒットしない場合 v(i, 1) = "無" End If Next '書き出しする列を指定(Offset(, 5)=検索値のA列より右5つ→F列) ●With .Offset(, 5) .ClearContents .NumberFormat = "@" .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • Vlookupマクロにつきまして

    初心者で、 エクセルのマクロにて、下記の処理を行おうとしているのですが、 上手く行きません。 どなたかお助けください! B3=Vlookup(A3,Sheet2!A:F,3,False) B4 A4 B5 A5 とA列に値がある限りカウントアップしていきます。 以下の通り考えてみたのですが、動きません。 Sub vlookup() Dim i As Long For i = 3 To Cells(Rows.Count, "A").End(xlUp).Row Cells(i, "B") = Application.WorksheetFunction.VLookup(Range(Cells(i, "A")), Worksheets("Sheet2").Range("A:F"), 3, False) Next End Sub すみません、宜しくお願いします。

  • 条件のあったシートへデータを転記するマクロ

    よろしくお願いします。 ブック内にシート名でマスターシートと在庫日報入力シートの2つがあります。在庫日報シートのA1に日付、A列3行目以降に商品コード、B列3行目以降に各商品名、F列3行目以降に各商品の在庫数量が入っており、毎日更新されます。マスターシートには縦A列3行目以降に日付が入っており、また横1行目(A1,B1,C1....)に各商品名が百以上記載されています。今まで、以下のマクロで在庫日報入力シートの在庫数量をマスターシートの対応するセルに転記していました。(縦の日付を検索し、横の商品名を検索し対応する場所に在庫数量を転記) Private Sub CommandButton1_Click() Application.DisplayStatusBar = True Dim LastR, idxR As Long, trgR, trgC If MsgBox("日付は正しいですか", vbQuestion + vbOKCancel) = vbOK Then With Worksheets("在庫日報入力") LastR = .Range("A65536").End(xlUp).Row trgR = Application.Match(.Cells(1, 1), Worksheets("マスター").Range("A:A"), 0) For idxR = LastR To 3 Step -1 trgC = Application.Match(.Cells(idxR, 1), Worksheets("マスター").Range("1:1"), 0) If IsNumeric(trgR) And IsNumeric(trgC) Then Worksheets("マスター").Cells(trgR, trgC + 1) = .Cells(idxR, 6) Else .Cells(idxR, 1).Interior.ColorIndex = 3 End If Application.StatusBar = "マスターシートに転記中・・・進行状況 " & idxR & "" Next idxR End With Application.StatusBar = False MsgBox "終了しました。(処理件数=" & LastR- 3 & "件)", vbOKOnly: Exit Sub End If End Sub 今までこれで良かったのですが、今度、マスターシートを削除して、各商品名毎にシートを作成します。そのため、それぞれの商品名シートに在庫日報シートのデータを転記するように変えたいのです。商品名シートはそれぞれA列3行目以降に日付が、となりのB列に在庫数が入るようになっています。 在庫日報シートの各商品に対応した商品名シートを見つけて、そのA列から在庫日報と同じ日付を見つけて、その行のB列に在庫日報シートの在庫数量を転記する。というものです。商品名シートは百以上あり名前は文字列です。 今までのマクロは教えてgooで教えていただきながら作りました。すいませんが、またご教授をお願いします。

  • マクロdictionaryオブジェクト書換(続)

    以下のマクロがあります。 BOOK1で(Sub CSV取得)を動作させると 選択したCSVファイルがBOOK2にインポートされて編集作業が行われる。 Sub CSV取得() '選択したCSVファイルをインポートし 'シート名を集計にする。CSVファイルは閉じる。  Call編集集計 End Sub --- Sub 編集集計() 'BOOK2のシート集計の編集作業を行う (途中記述省略) Call 番号変更 (途中記述省略) End Sub --- Sub 番号変更() '実験中。極遅。対策必要。 'BOOK2のシート集計のI列を検索値として 'BOOK1のシート新番号のA列を検索し 'ヒットしたらBOOK1のシート新番号の該当行のE列を 'BOOK2のシート集計のH列に転記する 'ヒットしない場合は 無 と転記する '↑極遅の他にこれ(ヒットしない場合の処理)も '正常動作しないので変更必要 Dim myBk As String myBk = ThisWorkbook.Name With Sheets("集計") .Columns("H:H").NumberFormatLocal = "G/標準" .Range("H1").Formula = _ "=IF(ISNA(VLOOKUP(I1,[" & myBk & "]新番号!$A:$E,5,FALSE)),I1,VLOOKUP(I1,[" & myBk & "]新番号!$A:$E,5,FALSE))" .Range("H1").Copy .Range("H1:H" & .Range("I" & .Rows.Count).End(xlUp).Row) .Columns("H:H").Copy .Range("H1").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End With End Sub ----- とりあえずヒットしない場合以外は思ったとうり動いていますが、 ・データが各シート20,000行を超える為3分~5分程度かかる。 ・BOOK2のシート集計のI列とBOOK1のシート新番号のA列での  検索ではデータの性質上、重複データがある事になってしまい  返す値が違う場合が存在してしまいます。 よって高速な処理の以下↓の記述を応用し かつ検索値も3つのセルの連結した値に変更に挑戦しギブアップです。 記述を教えてください。お願いします。 ●やりたい事 BOOK2のシート集計のI,K,L列の順で連結した値を検索値として BOOK1のシート新番号のA,B,C列の順で連結した値を検索し ヒットしたらBOOK1のシート新番号の該当行のE列(セル書式標準半角英数字3ケタ)を BOOK2のシート集計のH列に転記する。 ヒットしない場合は 無 と転記する。 BOOK2のシート集計はA列からO列でデータは1行目から。 BOKK1のシート新番号はA列からE列でデータは2行目から。 VLOOKUPは遅いので以下の記述を応用したい。 ↓↓(応用の為の記載なので今回の希望処理の記述にはなっていません。) ---- Sub 検索02() 'VLOOKUPではなくdictionaryオブジェクトを使用 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("シート1") With .Range("D2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Columns(1).Value w = .Columns(4).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("シート2") With .Range("F2", .Cells(.Rows.Count, 6).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next With .Offset(, 25) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • マクロでvlookup 

    マクロでvlookupを使用したいのですが、 動かした結果が #N/A になります。 どこが間違っているのでしょうか? マクロはこれ Sub macro1() Worksheets("訪問予定").Select Cells(3, 2).Value = Application.VLookup(Cells(1, 2).Value, Worksheets("担当").Range("A1:C5"), 2) End Sub 日本語で次のように私は認識してます。 「サブマクロ 訪問予定シートを選択 3行2列目の値は担当シートの日付と一致する行の2列目の値 エンドサブ」 やりたいことは 担当シートをもとに 訪問予定シートの担当蘭を埋めることです。 上記のマクロでは ループさせてないので 一か所しか埋められませんが ループを使ってひと月の担当予定を埋める方法を考えてます。