[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『各シートにグラフ範囲にしたいセルがあります。(マクロ)』(うさぎたん)
各シートにグラフ範囲にしたいセルがあります。
どうやってつくったらいいか考えてもわかりません。
グラフの中身なのですが、
タイトル各シート範囲C16 中身の範囲B13〜K13
グラフの凡例はB1〜K1
シートの枚数は5〜sheetcount
マクロで積み上げグラフをつくるときに
対象のセルをコピーペーストで一つのシートに一か所にまとめてから範囲指定しましたが
動作がかなり重くなってしまって改善したいのです。
Formula で範囲指定した方がいいか。。それとも。。SetSourceData??
お手数ですがよろしくお願いします
< 使用 Excel:Excel2019、使用 OS:unknown >
また、シート数はどのくらいなのでしょうか?
(DS) 2020/08/21(金) 15:21
'グラフの元(集計)------------------------------------------------------------------------------------------
ww = 2
kkko = 1
kkk = 8
kkkL = 9
JJO = Workbooks("外観マクロ0.xlsm").Worksheets("設定とデーター登録").Cells(Rows.Count, 9).End(xlUp).Row
For gigi = 2 To JJO
Workbooks("外観マクロ0.xlsm").Activate
L = Worksheets("設定とデーター登録").Cells(ww, 9).Value
llll = Worksheets(L).Range("A16").Value
Application.Calculate '再計算
cc = Worksheets("グラフの元(集計)").Cells(Rows.Count, 8).End(xlUp).Row '型式号車
cc = cc + 1
'型式
Worksheets(L).Range("C16").Copy
Worksheets("グラフの元(集計)").Activate
Worksheets("グラフの元(集計)").Cells(cc, 8).PasteSpecial Paste:=xlPasteValues
aaaaa = Worksheets("グラフの元(集計)").Cells(cc, 8).Value & "_" & llll
ActiveCell = aaaaa
'手直し時間
Worksheets(L).Range("M13").Copy
Worksheets("グラフの元(集計)").Cells(cc, 19).PasteSpecial Paste:=xlPasteValues
'欠点合計
Worksheets(L).Range("B13:K13").Copy
Worksheets("グラフの元(集計)").Cells(cc, 9).PasteSpecial Paste:=xlPasteValues
つづく
(うさぎたん) 2020/08/24(月) 09:03
ww = ww + 1
Next gigi
'型式ラベル
Worksheets("グラフの元(集計)").Range("H1").Value = "型式"
'時間ラベル
Worksheets("グラフの元(集計)").Range("S1").Value = "手直し時間"
'欠点ラベル
Worksheets(L).Range("B1:K1").Copy
Worksheets("グラフの元(集計)").Cells(1, 9).PasteSpecial Paste:=xlPasteValues
' グラフの中身を作る -----------------------------------------------------------------------------------------------------------------------------
Workbooks("集計グラフ.xlsx").Activate
Range("A1").Select
' 手直し時間と欠点個数のグラフを作る
Dim chartObj As Object
strPath = ThisWorkbook.Path
Set chartObj = ActiveSheet.ChartObjects.Add(10, 20, 250, 300)
With chartObj
Dim rangeWidth: rangeWidth = Range("E1:E2").Width
Dim rangeHeight: rangeHeight = Range("E1:E2").Height
'サイズ
.Height = rangeHeight
.Width = rangeWidth
'配置
.Left = Range("E1").Left
.Top = Range("E1").Top
End With
'グラフの中身
With chartObj.Chart
.ApplyChartTemplate (strPath & "\Charts\型式別欠点可視化グラフ.crtx") 'フォーマットを引っ張ってくる
GHJ = Workbooks("外観マクロ0.xlsm").Worksheets("グラフの元(集計)").Cells(1, Columns.Count).End(xlToLeft).Column '何回繰り返すか取得
GHJ = GHJ - 1
For uuu = kkk To GHJ
'範囲j定義
j = Workbooks("外観マクロ0.xlsm").Worksheets("グラフの元(集計)").Cells(Rows.Count, 8).End(xlUp).Row
jj = 2
'始まり
P = Cells(jj, kkk).Address '型式アドレス取得
P2 = Cells(jj, kkkL).Address '欠点種類
'終わり
Cells(j, kkk).Select: P1 = ActiveCell.Address '型式
Cells(j, kkkL).Select: PP2 = ActiveCell.Address '欠点種類
'各タイトル
tyty = Cells(1, kkkL).Address
'ソース
.SeriesCollection(kkko).Formula = _
"=SERIES('[外観マクロ0.xlsm]グラフの元(集計)'! " & tyty & ",'[外観マクロ0.xlsm]グラフの元(集計)'!" & P1 & ":" & P & ",'[外観マクロ0.xlsm]グラフの元(集計)'!" & PP2 & ":" & P2 & ",1)"
kkkL = kkkL + 1
kkko = kkko + 1
Next uuu
(うさぎたん) 2020/08/24(月) 09:06
シートの枚数は未定が目安は65枚ぐらいです。
よろしくお願いします。。
(うさぎたん) 2020/08/24(月) 09:11
正直、シートの構造を見ないとマクロの全体像が見えないのですが、
『重い』に対応するのであれば、ScreenUpdatingを切れば、重くなくなるのでは?
それでも重いのであれば、
Workbooks("外観マクロ0.xlsm").Worksheets("グラフの元(集計)")
Workbooks("集計グラフ.xlsx")
の方にコピーしてきて使うとか。
貼られたコードを一部直しましたが、正直、変数の意図が難解で、
それほど極端な直しはしていません。
元のコードが(動いているが、重い、という状態なら)
Application.ScreenUpdating = False/True
を入れるだけでも違うと思いますよ。
'
Sub てすと()
Application.ScreenUpdating = False
'グラフの元(集計)--------------------------
ww = 2
kkko = 1
kkk = 8
kkkL = 9
With Workbooks("外観マクロ0.xlsm")
JJO = .Worksheets("設定とデーター登録").Cells(Rows.Count, 9).End(xlUp).Row
For gigi = 2 To JJO
L = .Worksheets("設定とデーター登録").Cells(ww, 9).Value
cc = .Worksheets("グラフの元(集計)").Cells(Rows.Count, 8).End(xlUp).Row '型式号車
cc = cc + 1
'型式
.Worksheets("グラフの元(集計)").Cells(cc, 8).Value = _
.Worksheets(L).Range("C16") & "_" & .Worksheets(L).Range("A16").Value
'手直し時間
.Worksheets("グラフの元(集計)").Cells(cc, 19).Value = .Worksheets(L).Range("M13")
'欠点合計
.Worksheets("グラフの元(集計)").Cells(cc, 9).Resize(1, 10).Value = .Worksheets(L).Range("B13:K13").Value
ww = ww + 1
Next gigi
'型式ラベル
.Worksheets("グラフの元(集計)").Range("H1").Value = "型式"
'時間ラベル
.Worksheets("グラフの元(集計)").Range("S1").Value = "手直し時間"
'欠点ラベル
.Worksheets("グラフの元(集計)").Cells(1, 9).Resize(1, 10).Value = Worksheets(L).Range("B1:K1").Value
End With
' グラフの中身を作る -------------------------
' 手直し時間と欠点個数のグラフを作る
Workbooks("集計グラフ.xlsx").Activate
Dim chartObj As Object
strPath = ThisWorkbook.Path
Set chartObj = ActiveSheet.ChartObjects.Add(10, 20, 250, 300)
'サイズ
chartObj.Height = Range("E1:E2").Height
chartObj.Width = Range("E1:E2").Width
'配置
chartObj.Left = Range("E1").Left
chartObj.Top = Range("E1").Top
'グラフの中身
With chartObj.Chart
.ApplyChartTemplate strPath & "\Charts\型式別欠点可視化グラフ.crtx" 'フォーマットを引っ張ってくる
GHJ = Workbooks("外観マクロ0.xlsm").Worksheets("グラフの元(集計)").Cells(1, Columns.Count).End(xlToLeft).Column '何回繰り返すか取得
GHJ = GHJ - 1
For uuu = kkk To GHJ
'範囲j定義
j = Workbooks("外観マクロ0.xlsm").Worksheets("グラフの元(集計)").Cells(Rows.Count, 8).End(xlUp).Row
jj = 2
'始まり
P = Cells(jj, kkk).Address '型式アドレス取得
P2 = Cells(jj, kkkL).Address '欠点種類
'終わり
P1 = Cells(j, kkk).Address '型式
PP2 = Cells(j, kkkL).Address '欠点種類
'各タイトル
tyty = Cells(1, kkkL).Address
'ソース
.SeriesCollection(kkko).Formula = _
"=SERIES('[外観マクロ0.xlsm]グラフの元(集計)'! " & tyty & ",'[外観マクロ0.xlsm]グラフの元(集計)'!" & P1 & ":" & P & ",'[外観マクロ0.xlsm]グラフの元(集計)'!" & PP2 & ":" & P2 & ",1)"
kkkL = kkkL + 1
kkko = kkko + 1
Next uuu
End With
Application.ScreenUpdating = True
End Sub
(DS) 2020/08/24(月) 16:49
理想の形としては各シートのグラフの範囲をコピペで一か所にまとめず取得したいです。
↑このコードの書き方がわからず
今日ふと思いましたが、重い問題は多分シートを行き来し、セルをコピペしているからなのではと思っております。
(うさぎたん) 2020/08/24(月) 17:22
・Application.EnableEvents = False
・Application.Calculation = xlCalculationManual
・Select/Activateをしない
(セルの値等を操作するとき、SelectやActivateは不要です)
以下は効果がどのくらいあるかわからないですが、
・ワークブック間での参照をやめて、グラフの元(集計)を
集計グラフ.xlsxにコピーしてから、グラフにする。
・一行ずつグラフに反映させずに、一気に指定する。
(おっしゃる通り、SetSourceDataを使う)
また、
>重い問題は多分シートを行き来し、セルをコピペしているからなのではと思っております。
重い原因を探るのであれば、ところどころにSTOPをいれて、
どの部分で時間がかかっているのか調べてみては?
例えば、「For uuu = kkk To GHJ」の前の行でSTOPを入れてみる。
(DS) 2020/08/25(火) 05:17
・Select/Activateをしない
2つブックを使うのですが並べく抑えてあります
どこで重いかはプうログレスバーで確認しました。
ちょうどグラフを作るセルをコピペしている部分でした。
・ワークブック間での参照をやめて、グラフの元(集計)を
集計グラフ.xlsxにコピーしてから、グラフにする。
>やってみましたがそこまで変わらず。。
・一行ずつグラフに反映させずに、一気に指定する。
(おっしゃる通り、SetSourceDataを使う)
>書き方とかわかるようでしたら教えてください。
宜しくお願いします。
(うさぎたん) 2020/08/25(火) 08:33
(うさぎたん) 2020/08/25(火) 14:02
Sub sample()
Dim t As Double, tt As Double
tt = Timer
t = Timer
'処理1
Debug.Print "処理1の時間:" & Timer - t
t = Timer
'処理2
Debug.Print "処理2の時間:" & Timer - t
t = Timer
'処理3
Debug.Print "処理3の時間:" & Timer - t
Debug.Print "トータル時間:" & Timer - tt
End Sub
イミディエイトウィンドウに秒単位で経過時間を表示します。
(tkit) 2020/08/25(火) 15:57
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.