質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1545閲覧

vbaで複数データを用いた散布図を作りたいですが、データ数が多すぎて応答なしになります

fantata

総合スコア30

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/03/16 11:55

前提・実現したいこと

vbaで複数データの散布図を自動作成するツールを作っています。
データが1000近くあるため、重すぎて応答なしになってしまいます。

発生している問題・エラーメッセージ

vbaが重くて動かない

該当のソースコード

vba

1Sub 散布図作成() 2 3 4Application.ScreenUpdating = False 5 6 7Dim ch As Chart 8Set ch = ActiveSheet.ChartObjects.Add(10, 0, 400, 300).Chart 9ch.ChartType = xlXYScatterLinesNoMarkers 10 11 12 13 14With ch 15 16 .HasTitle = True 17 .ChartTitle.Text = "test" 18 19 .HasLegend = True 20 .Legend.Position = xlLegendPositionBottom 21 22End With 23 24For i = 0 To 12 25 26 With ch.SeriesCollection.NewSeries 27 .XValues = Range(Cells(68, 7), Cells(Rows.Count, 7)) 28 .Values = Range(Cells(68, 10 + 7 * i), Cells(Rows.Count, 10 + 7 * i)) 29 .Name = Cells(i + 2, 1) 30 .MarkerStyle = xlNone 31 .MarkerBackgroundColor = i + 1 32 End With 33 34 With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(i + 1) 35 .MarkerStyle = xlNone 'マーカーを非表示 36 End With 37 38Next 39 40End Sub 41 42

試したこと

エクセル内の数式はすべて数値に置き換えました。
画面の更新をオフにしました。

応答なしのままです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2022/03/16 13:30

> 重すぎて応答なしになってしまいます。 しばらく待てば処理が終わりませんか?
fantata

2022/03/17 08:39

読み込むデータを少なくして(iを0to3ぐらい)待ったところ3分ぐらいでグラフが完成しました。しかしそのあとグラフの軸を編集しようとすると一個直すのに30秒ほどかかってしまいます。何が原因でこんなに遅くなってしまうのでしょうか。
fantata

2022/03/17 08:52

データが12列でも8分ほどで完成しました。ただそのあと軸をいじろうとするとかなり時間がかかってしまいます。
meg_

2022/03/18 15:46

時間はかかるものの動作はしたのですね?状況を質問に追記されると良いかと思います。 データが不明なため分かりませんが、VBAでは動作が重くなるのは仕方がないことかと思います。(マシンスペックにも依るかもしれません) Python等で処理した方が速くなることが多いでしょう。
fantata

2022/03/19 07:59

ありがとうございます。質問の方自己解決しました。
guest

回答1

0

自己解決

.XValues = Range(Cells(68, 7), Cells(Rows.Count, 7))
.Values = Range(Cells(68, 10 + 7 * i), Cells(Rows.Count, 10 + 7 * i))
のx軸とy軸のデータ選択で行をエクセルファイルの一番下まで取得していたため、動作がかなり重くなっていたことが分かりました。

x_row = cells(Rows.Count ,7).End(xlup).row
.XValues = Range(Cells(68, 7), Cells(x_row, 7))

のようにしてデータ範囲を適切に選択したところ超絶軽くなりました。
コメントしてくださった皆様ありがとうございました。

投稿2022/03/19 08:07

fantata

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問