VBAでシートの複数のグラフを、
For eachなどで順番に処理する際、
グラフが上から順番に処理されない場合があります。
これはグラフが、indexプロパティの順番どおりに配置されていないと
発生します。
そこで、グラフをindex順ではなく、左上から右下に向かって
処理されるように、
グラフの位置でソートして
配列にindexを格納して見ました。
この配列(コードではgArray)を先頭から処理すれば、
ちゃんとレイアウト通りにグラフが処理されます。
'グラフの順番を取得する。(グラフのindexが位置どおりになっていないことがある)
Sub ChartSort()
Dim gCnt As Integer
Dim gArray()
'グラフの行・列・インデックスを取得する。
For Each mychart In ActiveSheet.ChartObjects
gCnt = gCnt + 1
ReDim Preserve gArray(2, gCnt - 1)
gArray(0, gCnt - 1) = mychart.Index
gArray(1, gCnt - 1) = mychart.TopLeftCell.Row
gArray(2, gCnt - 1) = mychart.TopLeftCell.Column
Next
'検証
Debug.Print "ソート前======================================="
For i = 0 To gCnt - 1
Debug.Print gArray(0, i), gArray(1, i), gArray(2, i)
Next
'行・列の値でバブルソートする。(小さい順に並べる)
For i = 0 To gCnt - 1
For j = gCnt - 1 To i Step -1
'行が小さいか、行が一緒で列が小さい場合に、
'小さい方を先頭に持ってくる。
If gArray(1, i) > gArray(1, j) Or _
gArray(1, i) = gArray(1, j) And gArray(2, i) > gArray(2, j) Then
hoge0 = gArray(0, i)
hoge1 = gArray(1, i)
hoge2 = gArray(2, i)
gArray(0, i) = gArray(0, j)
gArray(1, i) = gArray(1, j)
gArray(2, i) = gArray(2, j)
gArray(0, j) = hoge0
gArray(1, j) = hoge1
gArray(2, j) = hoge2
End If
Next
Next
'検証
Debug.Print "ソート後======================================="
For i = 0 To gCnt - 1
Debug.Print gArray(0, i), gArray(1, i), gArray(2, i)
Next
End Sub