
【質問】
以下のマクロのコードを早く動くようにしたいです
重さの理由は、2万行×3列×3シートへ関数が入っている事と思わます
また、ブックを開くのも時間がかかるため軽くしたいです
回答は抽象的な回答にてOKです
何かヒントがあれば宜しくお願いします
例
データが入った所だけ、関数をマクロで入れる
データが入っていない所の関数をマクロで削除してから、マクロをスタートする
【マクロの内容】
【手作業】
シート1から3へデータを貼付
関数にてABC列に表示
データはシート1から3まで20,000行まで貼り付けられますが
実際3つのシート20,000行まで使う事は月1回あるかないかです
ほぼ、シート1から3で、データ件数は3,000までです
【マクロ】
❶A1セルのオートフィルターをソート
※あ をのぞく かつ 空白行をのぞく
❷ソートされたデータを集約シートへ貼付
❶と❷を3回繰り返す
【コード】
Sub 配列split()
Dim シート名 As Variant
シート名 = Split("Sheet1,Sheet2,Sheet3", ",")
Dim i As Integer
Dim privatesheet As Worksheet
For i = 0 To 2
Set privatesheet = ThisWorkbook.Worksheets(シート名(i))
privatesheet.Range("A1:C20000").AutoFilter 1, "<>", xlAnd, "<>あ"
LastRow = Worksheets("集約").Cells(Rows.Count, "a").End(xlUp).Row
LastRow1 = privatesheet.Cells(Rows.Count, "d").End(xlUp).Row
privatesheet.Cells(2, 1).Resize(LastRow1, 3).Copy
Worksheets("集約").Cells(LastRow + 1, 1).PasteSpecial xlPasteValues
Next i
End Sub


- 画像を添付する (ファイルサイズ:10MB以内、ファイル形式:JPG/GIF/PNG)
- 今の自分の気分スタンプを選ぼう!
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
こんにちは。
ブックを開く時点で時間がかかるのは外部リンクの自動更新が大量に発生しているためと予測します。
計算不要、あるいは数式やリンクである必要のないものは値に貼り付け直して計算量を減らす設計にした方が良いでしょう。
その上でマクロの実行速度が遅いというのであれば、シートの自動計算をとめて、処理終了後にまとめて再計算するようにします。
https://learn.microsoft.com/ja-jp/office/client- …
No.3
- 回答日時:
> やはり、セル関数をなくすしかないですよね
そうですね。
> formulaプロパティで、つど、必要な関数だけ、入れる等しかないですかね
> 最初から、2万行×3シート分用意するのではなくてですね
「今は2万行分用意してあるが、実際に使うのは100行程度なので、そこだけセル関数を入れる」というのはありです。というか、「何故、使わないのに2万行分もセル関数入れた??」と問い詰めたいところです。
ただ、「最初は100行程度だけけど、どんどん増える一方でそのうち2万行近くなる」なら、増えるまでの間の一時しのぎの対策なので、根本的な対策としては私がNo1の回答に書いたとおり、「セル関数を一切使わないで、全部VBAだけで書く」しかないでしょうね。
ファイルを開くのに時間が掛かるのは我慢するが、VBAの処理時間だけでも速くしたいのであれば、これもNo1に「どうしても止められない場合は」と書いた対策で多少は速くなるかも知れません。書いた通り未確認なので、あまり変わらないかも。
No.2
- 回答日時:
こんばんは
原因が特定できていないようなので、対処法もわかりませんけれど・・
仮に、関数が理由だとしてもご提示程度の簡単な関数であれば、「ブックを開くのも時間がかかる」とも思えないのですが、どこかで面倒な関数式が多数利用されていたりしませんか?
実際の内容が、ご提示の様な関数であってそれが原因なら、マクロで直接D:F列を参照するようにすれば関数は不要にも思いますけれど・・?
(実際の内容が不明なのでわかりませんけれど)
また、処理にどの程度の時間がかかっていて「遅い」と判断しているのかも不明ですし、全体の情報が漠としているので、はっきりとはしませんが、一応「効果があるかもしれない」方法での処理を以下に例示しておきます。
※ 各シートとも1行目はタイトル行と仮定しました。
※ 試してみて、差がなければ捨ててください。
Sub testSample()
Dim rg As Range
Dim i As Long
Dim v
With Worksheets("集約")
Set rg = .Cells(2, 1)
For Each v In Array("Sheet1", "Sheet2", "Sheet3")
rg.Resize(19999, 3).Value = Worksheets(v).Range("A2:C20000").Value
Set rg = .Cells(Rows.Count, 1).End(xlUp).Offset(1)
Next v
rg.Resize(20000, 3).ClearContent
If rg.Row > 2 Then
v = .Cells(1, 1).Resize(rg.Row - 1).Value
For i = 2 To UBound(v)
If v(i, 1) = "" Or v(i, 1) = "あ" Then Set rg = Union(rg, .Cells(i, 1))
Next i
rg.EntireRow.Delete
End If
End With
End Sub
No.1
- 回答日時:
> 重さの理由は、2万行×3列×3シートへ関数が入っている事と思わます
各セルには、数値や文字列じゃなくてセル関数が入っているということでしょうか?もしそうであれば、止めた方が良いです。セルには数値とか文字列だけ入れて、後は全部VBAでやる。
> また、ブックを開くのも時間がかかるため軽くしたいです
数字が書いてないので、妥当な遅さなのか、異常な遅さなのか判断付かずです。上記のようにセル関数てんこ盛りなら遅いのはしょうがないでしょうね。
VBAの内容ですが、
AutoFilter がそんなに時間が掛かるとは思えない。
PasteSpecial も、xlPasteValues なので、これ以上改善しようもない。
もし、セル関数てんこ盛りなら、
privatesheet.Cells(2, 1).Resize(LastRow1, 3).Copy
のcopyがセル関数やセル書式込みでコピーをメモリー上に作るから遅いのでしょう。「値貼り付け xlPasteValues」はあるけど「値コピー」はないと思います。
セル関数てんこ盛りをやめるのが一番ですが(ファイルを開くのもずっと速くなるし)、どうしても止められない場合は、
Worksheets("集約").Range(範囲指定).Value = privatesheet.Range(範囲指定).Value
だと、値だけが処理対象になるので、「セル情報を全部コピーして値だけペースト」よりは速くなる気がします(未確認)。
お返事ありがとうございます
セルに普通の長い関数が入ってます
関数の種類が多すぎて、書けないので
簡単関数にて表現しました
やはり、セル関数をなくすしかないですよね
formulaプロパティで、つど、必要な
関数だけ、入れる等しかないですかね
最初から、2万行×3シート分用意
するのではなくてですね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【マクロ】1つのマクロの中に、ブック指定とシート指定が混在しても良いのですか? 2 2024/05/16 07:13
- Excel(エクセル) 3つのマクロを連続実行の中で、1つ目のマクロ要件を満たさなかったら、マクロ2・3を実行しない為には 1 2023/10/15 13:42
- Visual Basic(VBA) クリップボードに貼付している文字列が、マクロで別ブックへ転記すると、消えてしまう 1 2023/10/15 13:36
- Excel(エクセル) 【マクロ】VLOOKUPにて参照元にデータが無い場合【該当なし】と表示したい 3 2024/06/08 16:45
- Excel(エクセル) 【マクロ】その時、その時で変わる範囲を、フォルダの違う別ブックへ転記する為には ※参考画像あり 3 2024/05/11 10:33
- Excel(エクセル) 【マクロ】毎回、ファイル名が変わるファイルへの 文字列の転記 2 2024/05/02 14:17
- Excel(エクセル) (マクロ)vlookupの元データを同じブックのシートではなく、別のブックに設定したい 1 2024/06/02 10:03
- Visual Basic(VBA) A2~I4179列にあるリストを支社名ごとにシートに分けたいです。 各シート名はA列にある支社名とし 3 2023/08/29 16:46
- Excel(エクセル) 【マクロ】book1からbook2への適切な転記が出来ない件 2 2023/11/08 17:23
- Visual Basic(VBA) Excel VBA 文字列のセルを反映させたいです 2 2024/02/24 00:06
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルのリストについて
Excel(エクセル)
-
【マクロ】変数に入れるコードを少しでも短くする為には?
Excel(エクセル)
-
【マクロ】元データと同じお客様番号を別データから選択。その後別データに100を入力&色をつけるには?
Excel(エクセル)
-
-
4
考えた式の戻り値が期待通りにならない
Excel(エクセル)
-
5
エクスプローラーで見ることはできますか
Excel(エクセル)
-
6
算術演算子「¥」の意味について
Visual Basic(VBA)
-
7
VBAの「To」という語句について
Visual Basic(VBA)
-
8
VBAでFOR NEXT分を Application.OnTimeを使って
Visual Basic(VBA)
-
9
Vba Declare Functionを使う環境依存文字が化ける
Visual Basic(VBA)
-
10
特定のセルだけ結果がおかしいです。 関数はオートフィルでコピーしており、細かく見てもどこもおかしくあ
Excel(エクセル)
-
11
vba テキストボックスとリフトボックスについて
Excel(エクセル)
-
12
9月17日でサービス終了らしいのですが、今までのようなエクセルの質問や相談はどこですればいい?
Excel(エクセル)
-
13
【関数】同じ関数なのに、エラーが出るエクセルと出ないエクセルある?
Excel(エクセル)
-
14
【マクロ】【配列】3つのシートに、同じ作業をしたい
Excel(エクセル)
-
15
エクセルの関数について
Excel(エクセル)
-
16
【マクロ】シートの変数へ入れるコードがエラーとなるのはなぜでしょうか?
Visual Basic(VBA)
-
17
【マクロ】列を折りたたみ非表示したセルの内、可視セルをコピーするとがエラーとなる
Excel(エクセル)
-
18
【マクロ】数式を入力したい。カウントIFの範囲がつど変わる場合の数式の入力方法について
Excel(エクセル)
-
19
(マクロ)値を返す時は subでもfunctionでもどちらでも良いのでしょうか?
Excel(エクセル)
-
20
【マクロ】複数の日付データをYYYY/MM/DDに読替えて、別ブックへ転記したい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】【相談】Excelブック...
-
エクセルのVBAで集計をしたい
-
コマンドボタンがデザインモー...
-
【 Excel】シートの見出しに自...
-
マクロを複数シートに実行する...
-
EXCELのエラー
-
EXCELでマクロを使わずに図形の...
-
VBA アクティブなセルのシート...
-
マクロを特定の複数シートで実...
-
EXCELの起動時に常に同じ...
-
全てのシートから特定文字を含...
-
エクセルのチェックボックス
-
メッセージボックスでシート名...
-
エクセル ヘッダー(フッター)...
-
ExcelVBAでリボンを非表示にし...
-
【Excel】複数あるシート上の住...
-
Excelのマクロの呼び出し元を知...
-
EXCELでワークシートを開いたら...
-
エクセルで各シートに1~12月を...
-
エクセル CALL ステートメント
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドボタンがデザインモー...
-
エクセルのVBAで集計をしたい
-
エクセルを開いたとき常に同じ...
-
マクロを複数シートに実行する...
-
【 Excel】シートの見出しに自...
-
Excelのマクロの呼び出し元を知...
-
EXCELでマクロを使わずに図形の...
-
マクロ 各シートの決められた位...
-
エクセルでシートの並び替えで...
-
EXCELのエラー
-
EXCELでワークシートを開いたら...
-
メッセージボックスでシート名...
-
マクロを特定の複数シートで実...
-
VBA シート名を先月の名前に...
-
マクロで複数シートに条件付き...
-
エクセルで、マクロボタンの表...
-
VBAで条件によってシート見出し...
-
【Excel】複数あるシート上の住...
-
エクセルVBAでcmbBoxのプロパテ...
-
エクセルのチェックボックス
おすすめ情報