2017-05-17 3 views
1

私は燭台のチャートを含むExcelワークシートを持っていますが、この質問の目的のためには、通常の2D線グラフか、横軸です。Excelのグラフの最初と最後の点をExcelのウィンドウよりも広い範囲で検出する

グラフのデータソースは数学関数ではありません。代わりに、別のワークシートの列から読み取った価格を表す任意のデータです。

マイ・チャートは、ワークシート・ウィンドウとExcelウィンドウ自体よりも何倍も広いです。ワークシートの通常の水平スクロールバーを使用するだけで、チャートを水平方向にブラウズします。ワークシートのチャートを含むワークシートをスクロールします。

水平にスクロールするときに表示される新しいグラフの値に異なるY軸の最小値と最大値が必要な場合があるため、同じワークシートにボタンを配置してVBAコードを使ってグラフの垂直スケール(Y軸)値を最適な方法で表示することができます。

私はこのスケーリングを自動スケーリングに置き換えたいと思います。各スクロールの後に、最も左の目に見えるチャートポイントと右端のポイントが最初と最後の可視ポイントであることがわかります。それから、私は最高のYスケールを計算し、それをチャートに設定します。

私は最初と最後の可視点を検出するためにVBAコードを書き込もうとしています。 Chartオブジェクトは、関連するメソッドやプロパティを持っているようには見えず、これまでの方法を見つけることができませんでした。だから私の質問です。

Chart.AutoScalingプロパティはグラフ全体に影響するため、グラフの現在表示されている部分のみに適した縦方向の尺度を設定することは目的ではありません。だから私はチャートの最初と最後の目に見える点を見つける必要があります。

このグラフのユーザーは、Excel 2007と同じ古いバージョンのExcelを使用している可能性があるため、古いバージョンでは最適なソリューションが使用できますが、新しいExcelバージョンが必要なソリューションも優れています。

答えて

1

私はまれに別の回答を投稿するので、これはいくつかの考えを持っています。

すべてのデータを示す静的なグラフではなく、データの選択された部分のみを表示する動的なグラフを考えてみましょう。複数の画面幅にまたがるグラフを作成するのではなく、画面に完全に当てはまる単一のグラフを持つことができますが、ユーザーはそのグラフに表示する内容を決定できます。

次に、グラフデータの開始点を入力できるコントロールセルと、チャートに表示するキャンドル/バー/ポイントの数を指定できる別のコントロールをユーザーに与えます。

ユーザーが提供した情報を使用して、チャート範囲の名前付き公式などの確立された動的チャート作成手法を適用できます。次に、上に少しVBAを振って、選択したチャート範囲の最小値と最大値を決定します。

このテクニックのサンプルを見たい場合はお知らせください。リンクを追加します。ウィンドウの左右に表示されていないチャートをスクロールするよりも、実行するのは難しいことではなく、ユーザーエクスペリエンスもはるかに優れています。

編集:私はあなたがこのファイルのマクロを有効にする必要があり、このDropbox link

でダウンロードできるサンプルファイルを作成しました。

上の図は、すべてのデータを示しています。

行26のグラフはダイナミックレンジを使用しています。ユーザーはF17とF18を操作して、開始点とプロットする行数を選択できます。 26行目のグラフでは、Excelの既定値を使用して、Excelのように値の軸に適切なパディングが適用されます。

行42のグラフは、Exelのデフォルトを上書きし、F23とF24の値をそれぞれ最小値と最大値に使用します。これは、シート内のセルが変更されるたびに実行されるワークシート変更イベントマクロで行われます。

F23やF24のチャートパラメータが変更されたときにマクロを起動するような、このアプローチを微調整して改善する方法がありますが、それは重要ではありません。

重要な点は、ダイナミックレンジ名を使用して、選択したデータをグラフに表示できることです。コードなしで、Y軸の最小値と最大値をExcelが決定するようにします。 D26のチャートと同じです。

Y軸の最小値と最大値をさらに細かく制御するには、D42のコードバージョンとグラフを使用します。

質問をするのは楽しいです。

+1

あなたが言うように、私の頭が目に見えるグラフ領域を検出する興味深い問題にすぐに飛んだと思うと、これはおそらくより良いUIソリューションです!私はあなたが*「確立されたダイナミックなチャート技術」*を意味するのは不思議ですね。あなたは名前付き公式なしであなたが言っていることを簡単に行うことができますか? – Wolfie

+0

素晴らしい考え。あなたがまれに別の回答を投稿した場合、私はあなたが今度はそうしたことをうれしく思っています。この答えは、元の質問から戻り、状況を把握し、このケースのための正しい方法である代替アプローチを提案することによって、質問自体の必要性を取り除きます。私はこれをデータセット全体をチャートに組み込み、これを実装しましたが、これは必須条件ではありませんでしたが、それに固執しました。私は可視領域を検出することについて私の質問のための受け入れられた答えとしてこれをマークすることが適切であるかどうかを調べるよう試みるが、この解決法は私が行くつもりだ。 – SantiBailors

+0

[ガイドライン](http://stackoverflow.com/help/someone-answers)から:*「あなたの問題に対する最良の解決策であると思われる回答を受け入れることができます。 [meta](https://meta.stackoverflow.com/)で聞くことができます。 – Wolfie

1

正確なコードを提供するには十分な知識がありませんが、概念的には、シートを水平方向にスクロールすると、表示可能なウィンドウの左上のセルのアドレスを決定する方法が必要です。たとえばActiveWindow.VisibleRange.Cells(1,1)で、ロジックの同じ行に沿って、列の幅とズーム率を知っていれば、可視ウィンドウの最後のセルを特定できます。

これらの可視セルとそれぞれのアドレスをチャートデータソース内の関連する範囲に接続できます。たとえば、可視範囲が列A〜Mの場合、グラフのデータ範囲は1〜55行でなければなりません。可視範囲が列M〜Zの場合、グラフのデータ範囲は行55〜100でなければなりません。その関係の変換式を計算する必要があるかもしれません。

次に、グラフにプロットされるソースデータ内の適切な値を取得し、値軸の最小値と最大値を処理できます。

+0

ありがとう、これは興味深いアプローチですが、私が望んでいたものよりも間接的ですが、絶対に検討する価値があります。目に見える列を決定することは確かに可能であり、おそらく簡単ですし、列の範囲に対応する点の範囲を決定するための変換式を考えることは確かに実行可能ですが、1つの列でスクロールすると、左側の目に見えるウィンドウを「終了」する(うまくいけば、ウィンドウを右側から「入力」する点の量に等しい)。それは確かに行く方法です。 – SantiBailors

1

ここには、表示される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, ..., 10y = 100, 81, 64, 49, ..., 81, 100(これはx^2です)を使用し、異なるウィンドウ位置でサブを実行しました。グラフのサイズは変更されません

、私は単純にチャートが選択されていることを確認し、私の窓のサイズ/スクロールを変更する(上記の「注意事項」を参照)とサブを実行します。

zoom 1

zoom 2


実際にスクロールイベントでこのサブをトリガーする必要がある場合は、cpearson - DetectScrollをご覧ください。これは簡単なことではありません!より簡単なオプションは、上記のscaleyサブを呼び出すことができるトップ(または同様のもの)の上に実際に広いボタンを持つことです。

+0

ありがとう、それは素晴らしいですね。私はちょうどあなたのコードからこの問題を解決しようとしているのですが、私の場合はそうではないので、この解決策は関数の結果であるチャート化された値(例えば 'y = x^2')質問への情報)。しかし、それでも私はいつも特定の 'x'の' y'を得ることができます。スクロールの検出に関する情報とボタンのアイデアもありがとうございます。私はまったく簡単な感触があった。あなたの提案は、スクロール左とスクロール右のボタンを追加してスクロールし、特定のセルで指定された量だけスクロールすることができると思うように促しました。 – SantiBailors

+1

私は 'y = x^2'を例として使用しましたが、この解決策はチャートのすべてのデータに依存します*途中でグラフの' XValues'を取得します。 y値( 'Values')、彼らは何でもあったかもしれません!スクロールボタンを追加するのは問題ありませんが、手動でスクロールするときに問題が発生する可能性があります。 – Wolfie

関連する問題