• 締切済み

Excelマクロの大量行の処理速度を上げたい

米沢 栄蔵(@YON56)の回答

回答No.3

経験上から書きます。 マクロ高速化の要件 (1)ファイル操作を最小限にとどめること。  (ファイルOpen/Save Copy&Paste は時間が懸かる。   Copy&Pasteよりは、データ取得&書込が速い。) (2)Openするファイル数を最小限にとどめること。  (不要ファイルをCloseする。) (3)取得するデータ及び書込データをしっかり仕分けし、その保存ツールとして配列を利用する。  (つまり、書込データを作り一気に書込--取得したデータをその都度書込手法を改める。) (4)マクロ記述行が増えてもいいから同じ計算をさせない。  (マクロはカッコよく記述するだが能ではない。) (5)Application.DisplayAlerts = False Application.ScreenUpdating = Falseを使う。  (マクロ終了時にはTrueに戻す。) (6)Openするファイルの関数式を最小限にする。  (関数式はOpenする際、全て再計算される。例え、=A1+B1であっても大量に存在すれば多大な時間が懸かる。)

orange_00
質問者

お礼

YON56 さん お礼が大変遅くなりましてすみませんでした。 早々とお返事を頂きましてありがとうございます。 ご指摘して頂いた事を、もう少し勉強して 役立てたいと思います。 ありがとうございました。

関連するQ&A

  • エクセルのマクロで教えてください

    いつもお世話になっています。 先日、こちらのサイトでマクロをコピーさせて頂いて使っていました。 以下のようなマクロです ub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("統合表") j = 2 '統合表のデータ書きこみ開始行 For Each sh2 In ActiveWorkbook.Worksheets If sh2.Name = "統合表" Then Exit For '統合表は統合対象外 d = sh2.Range("A65536").End(xlUp).Row '各シートの最終行を知る ' MsgBox d For i = 63 To d '各シートの開始行2から最終行まで統合表に移す sh1.Cells(j, "C") = sh2.Cells(i, "C") sh1.Cells(j, "Q") = sh2.Cells(i, "Q") sh1.Cells(j, "T") = sh2.Cells(i, "T") sh1.Cells(j, "AM") = sh2.Cells(i, "AM") sh1.Cells(j, "AR") = sh2.Cells(i, "AR") sh1.Cells(j, "AU") = sh2.Cells(i, "AU") sh1.Cells(j, "BB") = sh2.Cells(i, "BB") sh1.Cells(j, "BI") = sh2.Cells(i, "BI") '列数だけこの後にコードを増やすこと j = j + 1 '統合表の直下行をポイント Next i Next End Sub このマクロでは2行目から以降を呼んでくることになっていますが、これを2行目から60行目までだけ呼んでくるようにしたいのです。 どうしたら良いか教えていただけないでしょうか? つたない文章ですみません。 よろしくお願いします。

  • マクロ 値の転記 再度

    マクロ 値の転記 再度 昨日はkyboさんに解答を頂き大変助かりました。 ありがとうございました。 教えて頂いたコードを別のマクロでも活用しよう思ったのですが どのように改変していけばいいのかまた悩んでいます。 度々で申し訳ありませんが、どなたか宜しくお願い致します。 やりたいこと 転記元のBに0以外の数字が入っている場合、転記先のA列に 同じ値を常に5回転記させたい。 "あ"を5回転記→1行あける→"う"を5回転記→(続く・・・) ★Sheet1 転記先(7行目から転記したい)   A ------------------- 7 あ 8 あ 9 あ 10 あ 11 あ -------------------- 12 空行 -------------------- 13 う 14 う 15 う 16 う 17 う -------------------- 18 空行 -------------------- 19 以下 5つの纏まりの枠が300行位まで続く ★Sheet2 転記元(5行目からデータがある)   A    B -------------------- 5 あ 6 あ 7 あ計  100 -------------------- 8 空行 -------------------- 9 い 10 い 11 い 12 い計  0 -------------------- 13 空行 -------------------- 14 う 15 う 16 う 17 う計  500 -------------------- 18 空行 19 (以下、続く) Sub テスト() Dim i As Long '転記元のデータ開始行は5行目 For i = 5 To 300  '転記元のB列が0以外  If Worksheets("転記元").Cells(i, "B") <> 0 Then    Worksheets("転記先").Cells((i - 1) * 5 + 1, "A").Resize(5) _ = Worksheets("転記元").Cells(i, "A")  End If Next i End Sub

  • エクセル このマクロはどこが間違っているのでしょうか。

    いつもお世話になります。 エクセルで、別ファイルにある表の、同じ商品コードのデータをつなげようしています。 <開いている表;タイトルを除くと12行目から開始> 列V  ~  列AC 商品コード テキストデータ <別ファイルの表;タイトルを除くと20行目から開始> 列B  ~  列T 商品コード (空白)←このセルに、列ACのデータを入れたい 下記のマクロを作成し、実行してみたのですが、結果は、sh1のセル"T20"(=最初の行)にのみ値が入り、後は空白のままでした。 お手数をおかけしますが、修正箇所と、何が原因で、2行目以降に働かないのかを教えていただけますでしょうか。 Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Workbooks("Book1.xls").Worksheets("sheet1") Set sh2 = Workbooks(ThisWorkbook.Name).Worksheets("sheet2") l = 20 For m = 12 To 2012 Step 1 If sh2.Cells(m, "V") = sh1.Cells(l, "B") Then sh1.Cells(l, "T") = sh2.Cells(m, "AC") l = l + 1 End If Next m

  • Excel VBA元データから別シートへ振り分け

    元データ(DB)をA列の値で振り分け 別シート(印刷)に転記していく方法について教えてください。 以下のコードで転記は行えましたが1つの値で1つのシートを作成になってしまいます。 どこをどのように変更すればA列の値(一種類に1つのシートにまとめたい)に 1つのシートに転記となるかご教示お願いします。 Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("DB") Set sh2 = Worksheets("印刷") d = sh1.Range("A65536").End(xlUp).Row For i = 2 To d sh2.Cells(6, "B") = sh1.Cells(i, "A") sh2.Cells(10, "B") = sh1.Cells(i, "B") sh2.Cells(10, "C") = sh1.Cells(i, "C") sh2.Cells(10, "D") = sh1.Cells(i, "D") sh2.Cells(10, "E") = sh1.Cells(i, "E") sh2.Cells(10, "F") = sh1.Cells(i, "F") sh2.Cells(10, "G") = sh1.Cells(i, "G") sh2.Cells(10, "H") = sh1.Cells(i, "H") sh2.Cells(10, "J") = sh1.Cells(i, "I") 'sh2.Range("a1:J34").PrintOut Next i End Sub よろしくお願いいたします。

  • エクセル マクロ 繰り返し処理の制御方法について

    お世話になります。エクセル初心者です。 登録用のシートから(データ数は、5000行ほど)、印刷用のシートへの転記を考えています。  下記のコードはテスト用の簡易なものですが、試行錯誤でここまではたどりついたのですが。  A列には大分類用の番号を入れてあるので、A列のセルの値が変わるまで、同じ処理を繰り返したいのですが、そのためにはどうしたらよいでしょうか。下記のコードの i と j の変数部分を連動させたい(A列の同じ値の数だけ、5行おきの転記をしたい)のですが。  Do until 構文も試してみたのですが(下記のコードでは、テストなので、「=2」のように固定にして(a)の部分に挿入してみました。)、エラーメッセージに従い、Loop の位置を(b)から(c)に変えてみたところ、無限ループに陥り、対処に困っています。  よろしくお願いします。 Sub test3() Dim i As Long Dim j As Long i = 1 '転記元の行 'Do until range("A"&i)=2 -----------------------(a) For j = 1 To 200 Step 5 '転記先の行 Range("J" & j) = Range("B" & i) Range("k" & j) = Range("C" & i) Range("L" & j) = Range("D" & i) Range("J" & j + 1) = Range("E" & i) Range("J" & j + 2) = Range("F" & i) Range("J" & j + 3) = Range("G" & i) i = i + 1 'Loop-------------------------------------------'(b) Next j 'Loop-------------------------------------------'(c) End Sub

  • Excelのマクロを使ってのオートフィル

    Excelのマクロを使ってのオートフィルについて教えて下さい。 類似の質問があったのですが、決まったセルからのものが多くわかりませんでした。 マクロはまだ始めたばかりです。 やりたいことはExcelの2つのシートに別のcsvファイルの数字を入れることです。 ExcelのSheet1のD1セルに日付を表す数字が入っています。 Sheet2と3には2行目に月の日付がずらりと並んでいます。 1列目には記録番号が入っています。 それぞれのシートにSheet1のD1セルと同じ日付の列を見つけて、 その下の行から1列目の記録番号を元に検索したcsvファイルのデータを引っ張ってきたいのです。   Sheets("Sheet1").Select Cells(3, (Sheets("Sheet2").Range("D1")).Select と最初に入れるセルを探しても違う列に飛んでしまったりします。 又、下のセルまで数式もコピーできずに止まったままです。 VBAまでは手が出せずに悩んでいます。どうか教えて下さい。よろしくお願いします。

  • Excel マクロ 値の転記

    Excel マクロ 値の転記 Sheet2をSheet1に転記したいのですが、A列だけは3回同じ値を転記 するのには、※をどのように変えたらいいのでしょうか? 宜しくお願い致します。 〔Sheet1〕転記先 A  B あ  10 あ  20 あ  30 い  40 い  50 〔Sheet2〕転記元 A  B あ  10 い  20 う  30 え  40 お  50 Sub テスト() Dim i As Long For i = 1 To 30    '↓※ココをどう書いて良いのかが分かりません Worksheets("Sheet1").Cells(i, "A") = Worksheets("Sheet2").Cells(i, "A") Worksheets("Sheet1").Cells(i, "B") = Worksheets("Sheet2").Cells(i, "B") Next i End Sub

  • VBA:同じ文字列データの比較がうまくいかない例

    VBA初心者です。シート"M"からA列の契約番号の複数必要データを変数入力し、別シート"A"に場所を探した出したうえで転記するプログラムが動きません。改良点が分からず困っております。どなたかご教示いただけると大変助かります。 (具体的な内容) シート"M"は元のデータが入っているシートです。このシートのA列に入っている契約番号の行の列にある複数コラムのデータを、同ブック内にあるシート”A”にある表に、契約番号を検索キーにし検索し場所を探し出し後、転記をするプログラムを組もうとしましたが以下の状況が発生しうまく動きませんでした。 私の以下のプログラムでは、シート"M"で必要な情報を変数var1, var2,var3,var4に代入した後、シート”A”に移り、検索キーとなるシート"A"内の契約番号を If r.Value = var1 という数式の内容で探し出そうとしています。 この過程をWatchウィンドウで確認したところ同じ文字列が入っているにもかかわらず、同一とみなされずデータの転記をせずに通り過ぎてしまいました。 何が悪いのでしょうか。いろいろと手を変え品を変え試しましたがうまく動かず困っています。 ご教示いただけますと大変助かります。 どうかよろしくお願いいたします。 -------------------------------------- Sub データ転記プログラムテスト() '変数宣言 Dim sh1, sh2 Set sh1 = Worksheets("M") Set sh2 = Worksheets("A") Dim 先頭行 As Long Dim 末尾行 As Long Dim 行番号 As Long Dim var1 As String Dim r As Range sh1.Select 'データの一行目から1列目、3列目のデータを変数var1, var2に取り込む 先頭行 = 2 末尾行 = Range("A1").CurrentRegion.Rows.Count For 行番号 = 先頭行 To 末尾行 Step 1 var1 = Cells(行番号, 1) var2 = Cells(行番号, 9) 'var3 = Cells(行番号, 10) 'var4 = Cells(行番号, 11) sh2.Select On Error Resume Next '---Sheet2で該当行を探す For Each r In Range("A6:A216") If r.Value = var1 Then '←ここでr.Value とvar1が同じデータが入っているのに違うとみなされます。どのように対処すればよいでしょうか。(Watch Windowで同じ値が入っていることを確認済みです。) r.Font.Color = vbBlue sh2.Cells(r, "J") = var2 sh2.Range("J" & r).Font.Color = RGB(0, 112, 192) sh2.Cells(r, "K") = var3 sh2.Range("K" & r).Font.Color = RGB(0, 112, 192) sh2.Cells(r, "L") = var4 sh2.Range("L" & r).Font.Color = RGB(0, 112, 192) 'ActiveCell.Select 'Selection.Font.ColorIndex = 5 Else End If Next r If 行番号 = 末尾行 Then MsgBox ("データ転記が終了しました") End If Next 行番号 End Sub

  • 行抽出マクロについて教えてください。

    エクセルで sheet1このように入力されております。 A列には製造番号 B列には日付 C列単価 D列記号がすでに入力済みです。 _____________________________________ 行/列  A    B    C    D 1   123456   4/5   1020   K 2  789456  5/2   500   D 3  789789   6/2   9000   F 4  456789   6/2   5000   S ------------------------------------- sheet2には製造番号が500行ランダムに入力済みです。 _____________________________________ 行/列  d    E    F    G 1   456789 2  789456  3  789789 4  456789 5    : 6   : ------------------------------------- ボタンをおしたら一致した製造番号のEFG列にsheet1の日付・単価・記号を自動的に入力したい。どなたかご教授お願いいたします。

  • 行抽出マクロについて教えてください。

    エクセルで sheet1このように入力されております。 A列には製造番号 B列には日付 C列単価 D列記号がすでに入力済みです。 _____________________________________ 行/列  A    B    C    D 1   123456   4/5   1020   K 2  789456  5/2   500   D 3  789789   6/2   9000   F 4  456789   6/2   5000   S ------------------------------------- sheet2には製造番号が500行ランダムに入力済みです。 _____________________________________ 行/列  d    E    F    G 2   456789 3  789456  4  789789 5  456789 6    : 7   : ------------------------------------- ボタンをおしたら一致した製造番号のEFG列にsheet1の日付・単価・記号を自動的に入力したい。どなたかご教授お願いいたします。