Excel のグラフの自動スケーリングに不満があったので、このサブルーチンを作成しました。組み込みの Excel メソッドはある程度機能しますが、グラフ データの範囲が少し広くなると、最小スケールが 0 に設定されるだけで、その下に空白スペースが大量にある非常に押しつぶされた線になる可能性があります。以下のように...
私が書いたコードは、グラフのデータに基づいて y 軸の適切な最大値と最小値を選択することで、Excel の方法を改善しようとしています。問題なく動作しますが、最適ではない値を選択することがあります。私のコードを同じチャートに適用した結果は次のとおりです。
ここでは、すべてのデータがプロット エリアに収まっているため、非常に明確にわかりますが、選択した値は最適ではありません。人間はこのデータを見て、この例で使用するのにおそらく 90 と 140 が最適な制限であるとすぐに判断できますが、同じことを行うスクリプトを書くのに苦労しました。
これがサブ全体です。長すぎません。制限の計算を改善するための提案をいただければ幸いです...
Sub ScaleCharts()
'
' ScaleCharts Macro
'
Dim objCht As ChartObject
Dim maxi As Double, mini As Double, Range As Double, Adj As Double, xMax As Double, xMin As Double
Dim Round As Integer, Order As Integer, x As Integer, i As Integer
Application.ScreenUpdating = False
For x = 1 To ActiveWorkbook.Sheets.Count
Application.StatusBar = "Crunching sheet " & x & " of " & ActiveWorkbook.Sheets.Count
For Each objCht In Sheets(x).ChartObjects
If objCht.Chart.ChartType = xlLine Or objCht.Chart.ChartType = xlXYScatter Then
With objCht.Chart
For i = 0 To .SeriesCollection.Count - 1 'Loop through all the series in the chart
'Get the Max and Min values of the data in the chart
maxi = Application.max(.SeriesCollection(i + 1).Values)
mini = Application.min(.SeriesCollection(i + 1).Values)
Range = maxi - mini
If Range > 1 Then
Order = Len(Int(Range))
Adj = 10 ^ (Order - 2)
Round = -1 * (Order - 1)
ElseIf Range <> 0 Then
Order = Len(Int(1 / Range))
Adj = 10 ^ (-1 * Order)
Round = Order - 1
End If
'Get the Max and Min values for the axis based on the data
If i = 0 Or WorksheetFunction.Round(maxi, Round + 1) + Adj > xMax Then
xMax = WorksheetFunction.Round(maxi, Round + 1) + Adj
End If
If i = 0 Or WorksheetFunction.Round(mini, Round + 1) - Adj < xMin Then
xMin = WorksheetFunction.Round(mini, Round + 1) - Adj
End If
Next i
With .Axes(xlValue)
.MaximumScale = xMax
.MinimumScale = xMin
End With
End With
End If
Next objCht
Next x
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
編集: qPCR4vir の変更の結果は次のとおりです...
-100 を超えないため、最後の 2 つのチャートは切り捨てられます。