ここには、表示されるx値に従って軸を拡大縮小する機能があります。
は、私はそれをよくコメントしようとしましたが、ロジックは次のとおりです。
- が
.VisibleRange
財産
- を使用して可視範囲を取得し、可視範囲とプロットの左と右のポイントを取得します。面積
- と表示される xの値を計算し、最も近いのデータポイントを見つけます。それぞれです。これにより、等距離のxデータをとる必要がなくなります。
- データ内の極値のインデックスを取得して、対応するy値を得ることができます。
- yは
値のものとスケール軸を注:これは、現在ActiveChart
オブジェクトに依存、与えられた名前で定義されたチャートオブジェクトを使用して、より堅牢なずっとだろう。それはあなたの特定の使い方までです。
コード:
Sub scaley()
' Get visible range
Dim visrange As Range
Set visrange = ActiveWindow.VisibleRange
' Get left and right in points
Dim L As Double, R As Double
L = visrange.Left
R = visrange.Cells(visrange.Cells.Count).Offset(0, 1).Left
' Get left and right of chart, relies on chart being active
' could easily replace with calling your chart by name
Dim chtL As Double, chtR As Double
Dim cht As Chart
Set cht = ActiveChart
chtL = cht.Parent.Left + cht.PlotArea.Left
chtR = chtL + cht.PlotArea.Width
' Get visible region by percentage
Dim pL As Double, pR As Double
pL = WorksheetFunction.Max((L - chtL)/(chtR - chtL), 0)
pR = WorksheetFunction.Min((R - chtL)/(chtR - chtL), 1)
' Get x axis values, and the visible x axis range
Dim xval() As Variant
xval = cht.SeriesCollection(1).XValues
Dim xmin As Double, xmax As Double, xrange As Double
xmin = WorksheetFunction.Min(xval)
xrange = WorksheetFunction.Max(xval) - xmin
xmax = xmin + pR * xrange
xmin = xmin + pL * xrange
' Get actual corresponding x values
Dim imin As Long, imax As Long
For imin = LBound(xval) To UBound(xval)
If xval(imin) >= xmin Then Exit For
Next imin
For imax = UBound(xval) To LBound(xval) Step -1
If xval(imax) <= xmax Then Exit For
Next imax
' Get y values in the visible range
Dim allyval() As Variant, yval() As Variant
allyval = cht.SeriesCollection(1).Values
ReDim yval(0 To imax - imin)
Dim i As Long
For i = imin To imax
yval(i - imin) = allyval(i)
Next i
' scale axes, including buffer so max/min values dont sit right on edge
Dim buffer As Double
buffer = 0.1
cht.Axes(xlValue).MaximumScale = WorksheetFunction.Max(yval) + buffer
cht.Axes(xlValue).MinimumScale = WorksheetFunction.Min(yval) - buffer
End Sub
はここにいくつかの例出力です。私は散布図を作成するために任意のデータx = -10, -9, ..., 10
とy = 100, 81, 64, 49, ..., 81, 100
(これはx^2
です)を使用し、異なるウィンドウ位置でサブを実行しました。グラフのサイズは変更されません
、私は単純にチャートが選択されていることを確認し、私の窓のサイズ/スクロールを変更する(上記の「注意事項」を参照)とサブを実行します。
実際にスクロールイベントでこのサブをトリガーする必要がある場合は、cpearson - DetectScrollをご覧ください。これは簡単なことではありません!より簡単なオプションは、上記のscaley
サブを呼び出すことができるトップ(または同様のもの)の上に実際に広いボタンを持つことです。
あなたが言うように、私の頭が目に見えるグラフ領域を検出する興味深い問題にすぐに飛んだと思うと、これはおそらくより良いUIソリューションです!私はあなたが*「確立されたダイナミックなチャート技術」*を意味するのは不思議ですね。あなたは名前付き公式なしであなたが言っていることを簡単に行うことができますか? – Wolfie
素晴らしい考え。あなたがまれに別の回答を投稿した場合、私はあなたが今度はそうしたことをうれしく思っています。この答えは、元の質問から戻り、状況を把握し、このケースのための正しい方法である代替アプローチを提案することによって、質問自体の必要性を取り除きます。私はこれをデータセット全体をチャートに組み込み、これを実装しましたが、これは必須条件ではありませんでしたが、それに固執しました。私は可視領域を検出することについて私の質問のための受け入れられた答えとしてこれをマークすることが適切であるかどうかを調べるよう試みるが、この解決法は私が行くつもりだ。 – SantiBailors
[ガイドライン](http://stackoverflow.com/help/someone-answers)から:*「あなたの問題に対する最良の解決策であると思われる回答を受け入れることができます。 [meta](https://meta.stackoverflow.com/)で聞くことができます。 – Wolfie