質問: 二つの条件が合致するセル入力の処理速度を早くしたい(vba) https://oshiete.goo.ne.jp/qa/10791019.html 上記で質問させて頂いたものです。 御教示頂きました内容で意図する動作が出来ていますが、データ数が多い(10000件ぐらい)と スクリーンの更新等をoffにしていても5分以上処理に時間が掛かってしまいます。 上記ご教示頂きました構文より処理速度を上げるような構文があればご教示お願い致します。 尚、時々反映されないデータがある原因が分かりましたので補足で下記します。 日付の個所でセルの表示幅が足りない時に「###」となりますが、その状態だと条件が一致した とみなさない事が原因でした。(find) セル幅を調整して日付が表示された後だと処理される事が確認出来ました。
回答: no.1・3です。 >それが例えば12行目が日付で13行目以降がデータになっていた場合) というコトなので、前回のコードに少し手を加えてみました。 「★」の行が変わっているところです。 (「反映data」シートのai13セル以降は消去せず、そのまま残しています。) sub sample3() dim i as long, j as long, k as long, l as long dim lastrow1 as long, lastrow2 as long, lastcol1 as long, lastcol2 as long dim ws as worksheet dim myr1, myr2 set ws = worksheets("元data") lastrow2 = ws.cells(rows.count, "a").end(xlup).row lastcol2 = ws.cells(1, columns.count).end(xltoleft).column myr2 = range(ws.cells(1, "a"), ws.cells(lastrow2, lastcol2)) with worksheets("反映data") lastrow1 = .cells(rows.count, "c").end(xlup).row lastcol1 = .cells(12, columns.count).end(xltoleft).column '//★// '//「反映data」シートのa列12行目~最終行・最終列を配列「myr1」に!//★ myr1 = range(.cells(12, "a"), .cells(lastrow1, lastcol1)) '//★// for i = 2 to ubound(myr1, 1) '//「反映data」シートの13行目~最終行まで//★ for k = 2 to ubound(myr2, 1) '//「元data」シートの2行目~最終行まで// if myr2(k, 1) = myr1(i, 3) then '//「元データ」シートk行目が「反映」シートのi行目と等しければ・・・// for j = 35 to lastcol1 '//「反映data」シートのai列~最終列まで// for l = 4 to lastcol2 '//「元data」シートのd列~最終列まで// if myr2(1, l) = myr1(1, j) then '//両配列の日付が等しければ・・・// if myr2(k, l) <> "" then '//「元data」シートのk行目・l列目が空白以外の場合は・・・// myr1(i, j) = myr2(k, l) '//配列「myr1」のi行・j列目に配列「myr2」のk行・l列目を代入// end if end if next l next j end if next k next i '//「反映data」シートのa12セル~最終行・最終列に一気にmyr1の値を吐き出す//★ range(.cells(12, "a"), .cells(lastrow1, lastcol1)) = myr1 '★ end with msgbox "完了" end sub ※ ワークシート上でループさせるより、対象範囲を一旦配列に格納しその中でループさせる方が 各段に速いので、それぞれのシートの範囲を配列に格納しています。 myr2 → 「元data」シートのa1~a列最終行、1行目最終列まで myr1 → 「反映data」シートのa12~c列最終行、12行目最終列まで すなわち両配列の1行目は「日付」の行になり、 >for i = 2 to ubound(myr1, 1) で配列の2行目以降~最終行まで、というコトになります。 今回の場合、配列「myr1」の2行目は「反映data」シートの13行目に当たります。 こんな感じで理解いただけたでしょうかね?m(_ _)m