[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『各シートにグラフ範囲にしたいセルがあります。(マクロ)』(うさぎたん)
各シートにグラフ範囲にしたいセルがあります。
どうやってつくったらいいか考えてもわかりません。
グラフの中身なのですが、
タイトル各シート範囲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.