0

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 つのチャートは切り捨てられます。

4

5 に答える 5

1

Excel が計算するものを使用するというアイデア: MajorUnit は優れています (常に正しいと仮定します!! 証明する必要があります)。探しているラウンド関数は次のとおりです。

tryxMax = Sgn(maxi) * WorksheetFunction.MRound(Abs(maxi + maju / 2.001), maju)
tryxMin = Sgn(mini) * WorksheetFunction.MRound(Abs(mini - maju / 2.001), maju)

小さい数値または負の数値を含むすべての数値に対して機能します。

于 2013-02-01T13:35:04.540 に答える
0

90 と 140 が最適な値であると言うときに、人間として使用するアルゴリズムは何ですか?

個人的には、Excel が既定で選択している軸区分を見て、データ自体の外側にある最も近い区分を選択します。あなたの例では、80と140になります。

Excel では、これを Axis オブジェクトの "MajorUnit" プロパティと呼びます。

于 2013-01-31T13:49:22.117 に答える
0

私が使用するアプローチは次のとおりです 。Excel VBA でナイス軸スケールを計算する

于 2013-04-30T01:46:42.827 に答える