- ベストアンサー
Excel2010VBAでの検索の高速化
- Excel2010VBAでシート1のデータから変数「日時」、「データ1」、「データ2」、「データ3」、「データ4」、「データ5」に格納し、変数「日時」とシート2の「日時」の行に一致するセルに変数「データ1」、「データ2」、「データ3」、「データ4」、「データ5」を入力するプログラムです。
- 検索を高速化する方法はありますか?セルに関数は使用していません。
- 質問文章の内容はExcel2010VBAでの検索の高速化方法についてです。ExcelのVBAを使用して、シート1のデータから変数に格納し、シート2のデータと比較して対応する行にデータを入力するプログラムです。検索を高速化する方法についてのアドバイスを頂きたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
'シート1のデータの変数「日時(a)」は文字列であると仮定 'また、日時(a)は同じ物がないものとする Sub xxx3() Dim myDic As Object Dim S1_v, S2_v Dim i As Long, n As Long, j As Long 'With Workbooks("ブック.xlsm").Worksheets("シート1") With Sheets("Sheet1") j = .Range("E" & Rows.Count).End(xlUp).Row S1_v = .Range("E1").Resize(j, 6).Value '対象範囲を配列に End With 'With Workbooks("ブック.xlsm").Worksheets("シート2") With Sheets("Sheet2") j = .Range("E" & Rows.Count).End(xlUp).Row S2_v = .Range("E1").Resize(j, 6).Value '対象範囲を配列に End With Set myDic = CreateObject("Scripting.Dictionary") For i = 2 To UBound(S1_v) myDic.Add S1_v(i, 1), i 'keyに追加、itemにi Next i For i = 2 To UBound(S2_v) If myDic.exists(S2_v(i, 1)) Then j = myDic.Item(S2_v(i, 1)) S2_v(i, 2) = S1_v(j, 2) S2_v(i, 3) = S1_v(j, 3) S2_v(i, 4) = S1_v(j, 4) S2_v(i, 5) = S1_v(j, 5) S2_v(i, 6) = S1_v(j, 6) Else 'マッチしなかったときの処理 End If Next 'With Workbooks("ブック.xlsm").Worksheets("シート2") With Sheets("Sheet2") j = .Range("E" & Rows.Count).End(xlUp).Row .Range("E1").Resize(j, 6).Value = S2_v End With Set myDic = Nothing Erase S1_v, S2_v End Sub
その他の回答 (1)
- CC_T
- ベストアンサー率47% (1038/2202)
検索の判定を見るに、データ1の日時について同日時で重複する行はないのですね? データ2も同じく重複はない? であれば、両データとも日時順に並べれば過去分は検索する必要もなく、 後に行くほど処理時間が短縮されるでしょう。 配列に読み込む必要すらない。 もしデータの日時はバラバラのままで残したいのであれば、別シートにコピーすればいいし。 1)両シートとも日時順にデータを並べる 2)データ2の処理行で日時を取得する 3)データ1の日時セルを上から下に見て、2で取得した日時と比較する 2で取得した日時と一致すれば、データをシート2の各セルに記入する 4)データ記入終了、あるいはデータ1の日時が2で取得した日時を超えた場合は データ2の処理行を次行にし、3で検索中断したデータ1の処理行から比較を再開する。
お礼
回答ありがとうございます。 日時を検索しており、その点で重複している部分は一切ありません。 <両データとも日時順に並べれば過去分は検索する必要もなく、 後に行くほど処理時間が短縮されるでしょう。 最初から日時順には並べられているのですが抜けている部分があって、それを抜けている部分はそのまま空白で、その日時のデータがある場合はそこにデータを入力するというプログラムです。 でも、日時順に並べるというのが高速化するポイントのようですね。 ありがとうございました。
お礼
回答ありがとうございます。 すいませんが、このプログラムを見てもよく分からないのですが・・・。
補足
プログラムの内容はよく分からないのですが、そのままコピーさせてもらいました。 自分が作ったプログラムとは比べものにならないほど非常に高速で処理できました。 ありがとうございました。