
【質問】
以下のマクロのコードを早く動くようにしたいです
重さの理由は、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

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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【マクロ】変数に入れるコードを少しでも短くする為には?
Excel(エクセル)
-
エクセルの関数について
Excel(エクセル)
-
エクセルのリストについて
Excel(エクセル)
-
-
4
【関数】同じ関数なのに、エラーが出るエクセルと出ないエクセルある?
Excel(エクセル)
-
5
エクセルからメールを作れるか教えてください。
その他(Microsoft Office)
-
6
【マクロ】数式を入力したい。カウントIFの範囲がつど変わる場合の数式の入力方法について
Excel(エクセル)
-
7
【マクロ】元データと同じお客様番号を別データから選択。その後別データに100を入力&色をつけるには?
Excel(エクセル)
-
8
エクセルシートの見出しの文字を大きくしたい
Excel(エクセル)
-
9
エクスプローラーで見ることはできますか
Excel(エクセル)
-
10
vba テキストボックスとリフトボックスについて
Excel(エクセル)
-
11
9月17日でサービス終了らしいのですが、今までのようなエクセルの質問や相談はどこですればいい?
Excel(エクセル)
-
12
特定のセルだけ結果がおかしいです。 関数はオートフィルでコピーしており、細かく見てもどこもおかしくあ
Excel(エクセル)
-
13
【マクロ】列を折りたたみ非表示したセルの内、可視セルをコピーするとがエラーとなる
Excel(エクセル)
-
14
【マクロ】【配列】3つのシートに、同じ作業をしたい
Excel(エクセル)
-
15
Amazonでマイクロソフトオフィス2019 MicrosoftOffice2019が10000円弱
Excel(エクセル)
-
16
【マクロ】左のブックと右のブックにて、同じデータに水色をぬるためには?
Excel(エクセル)
-
17
Dir関数のDo Whileステートメントにおける1回目と2回目のファイル名の呼出し方法の違い
Excel(エクセル)
-
18
「テキストデータで送ってください」と指示があった場合
Access(アクセス)
-
19
【マクロ】エラー【#DIV/0!】が発生する場合の回避方法について
Excel(エクセル)
-
20
【マクロ】複数の日付データをYYYY/MM/DDに読替えて、別ブックへ転記したい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのVBAで集計をしたい
-
【マクロ】【相談】Excelブック...
-
コマンドボタンがデザインモー...
-
エクセルを開いたとき常に同じ...
-
エクセル・複数のシートを一度...
-
【 Excel】シートの見出しに自...
-
エクセルのチェックボックス
-
複数シートの保護・解除
-
EXCELの起動時に常に同じ...
-
EXCELでマクロを使わずに図形の...
-
エクセルでセル(列)を飛ばし...
-
エクセル ヘッダー(フッター)...
-
エクセルで複数のSheetを一括フ...
-
マクロ 各シートの決められた位...
-
エクセルを閉じる際に自動保存...
-
マクロを特定の複数シートで実...
-
Excel:複数シートから条件に合...
-
エクセルでシートの並び替えで...
-
Excel2007シート移動のショート...
-
VBA シート名を先月の名前に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルのVBAで集計をしたい
-
【マクロ】【相談】Excelブック...
-
コマンドボタンがデザインモー...
-
エクセルを開いたとき常に同じ...
-
【 Excel】シートの見出しに自...
-
マクロを複数シートに実行する...
-
エクセル ヘッダー(フッター)...
-
EXCELでマクロを使わずに図形の...
-
Excelのマクロの呼び出し元を知...
-
EXCELのエラー
-
エクセルでシートの並び替えで...
-
マクロを特定の複数シートで実...
-
エクセルで複数のSheetを一括フ...
-
VBA シート名を先月の名前に...
-
メッセージボックスでシート名...
-
マクロ 各シートの決められた位...
-
Excel:複数シートから条件に合...
-
EXCELでワークシートを開いたら...
-
エクセルのチェックボックス
-
エクセルVBAでcmbBoxのプロパテ...
おすすめ情報