0

Excelチャートシリーズコレクションの最大値と最小値、およびチャート上の同じ位置を取得するにはどうすればよいですか?シリーズの各ポイントのラベルの位置を計算し、それに応じて移動したいと思います。

不思議に思うかもしれませんが、見栄えを良くするためにこれを行っています。ラベルをやみくもに動かすと、数字がめちゃくちゃになる傾向があります。チャートの下部に数字を表示できると確信していますが、それは私がやろうとしていることではありません。Chartオブジェクトがオブジェクトリストthing-a-ma-jig(オブジェクト名の後にピリオドを押すとポップアップするwhatcha-ma-call-it)を操作するのが難しいことはあまり役に立ちません。

編集:私が達成しようとしているのは、Excelチャートの特定のシリーズの最高(最大)値と最低(最小)値の取得です。また、チャート自体での位置を(上または左から)取得したいと思います。どちらの見方をするかはわかりますが、どちらの方法で測定するかを確認するコードを提供すると、ボーナスになります。下の図を参照してください。

   -------------------Left------------------------------------- >
  |        ________________________________________
  |       |                                        |
  |   225 |----------------------------------------|max (highest)
  |   200 |                                        |
  |   175 |                                        |
  |   150 |            -----                       |
|Top| 125 |           /     \                      |
  |   100 |          /       \                     |
  |    75 |   -------         \                    |
  |    50 |  /                 --------------\     |
  |    25 | /                                 \    |
 \|/    0 |----------------------------------------|min (lowest)
  V       |________________________________________|
4

3 に答える 3

2

これにはVBAはまったく必要ありません。私はあなたが何を望んでいるかを知っており、すでにそれを作成しました。最小の場合と同様に、最大の位置でどのように行うかを説明します。最初に最大Y軸ラベルを見つける必要があり、それから簡単になります。

それを5つのステップに分けてみましょう。

  1. 式のA:スケールを決定します。
  2. 式のB:そのスケールで比較します。
  3. 式のC:間隔を測定します。
  4. 数式のD:切り捨てます。
  5. 式のE:最大軸ラベルを計算します。

OK、各ステップの式は次のとおりです。

  1. = ROUNDDOWN(LOG(MAX(data)); 1)ここで、dataは値を含むセルを表します。
  2. = MAX(データ)/ 10 ^ A)* 1.05
  3. = 0.2 +(B> 2)* 0.3 +(B> 5)* 0.5
  4. = ROUNDDOWN(B; C)
  5. =(C + D)* 10 ^ A

私は自分でオランダの数式を使用しているので、わずかな翻訳エラーが発生した可能性があります。それ以外は、これが機能することをお約束します。その理由は、Excelがグラフでどのように「考える」かを理解したからです。これがどのように機能するかを説明しようと思います。

基本的に、Excelが使用する基本的な範囲は3つあります。1から2、2から5、5から10です。数値が10より大きい場合、10は再び1と見なされ、最初の範囲にフォールバックします。 。そのため、最初にLOG式を使用してスケールを決定します。初めての場合は、wikiで調べてください。

したがって、スケールがある場合、それがどの範囲に含まれるかを決定します。これら3つの範囲のそれぞれについて、y軸のラベル間隔は異なります。したがって、3番目のステップでそれらを計算し、4番目のステップでそれを使用して数値Bを切り捨てます。5番目のステップでは、単純に元のスケールに乗算します。

そして、そこに行きます:最大Y軸ラベルが見つかります。チャートを見てください、そしてそれは同じであるはずです。アイデアが浮かんだら、最小のY軸ラベルも見つかります。ラベルをどこに配置するかを非常に簡単に計算できるようになったので、グリッドのサイズがわかります。

それで頑張ってください、そしてあなたがまだ質問があるならば、私に知らせてください。

パトリック

于 2012-11-16T05:37:11.400 に答える
0

何を達成したいのかは明確ではありませんが、ここにSeriesPointsおよびLabelsチャートへのアクセスのデモがあります。

Sub MoveLabels()
    Dim sh As Worksheet
    Dim oCh As Chart
    Dim oSers As SeriesCollection
    Dim oSer As Series
    Dim oPts As Points
    Dim oPt As Point
    Dim oLbls As DataLabels
    Dim oLbl As DataLabel
    Dim i As Long, pt As Long


    Set sh = ActiveSheet
    Set oCh = sh.ChartObjects("Chart 8").Chart

    ' Series Collection of a chart
    Set oSers = ch.SeriesCollection
    For Each oSer In oSers
        'Labels collection of a series
        Set oLbls = oSer.DataLabels
        For Each oLbl In oLbls
            ' Label Object

        Next

        'Points collection of a series
        Set oPts = oSers.Points
        For Each oPt In oPts
            ' Label Object
            Set oLbl = oPt.DataLabel
        Next
    Next
End Sub
于 2012-10-17T08:18:54.087 に答える
0

さて、もう少し実験した後(これは、VBAの目的の1つです)、私はそれを手に入れました。私の特定のケースには、互いに重なり合った2つのバーシリーズがあります。コードはかなり長いですが、高速に軽量化されています。その過程でvbaを高速化する方法について少し学んだと思います!

Sub AdjustReportChart()
    'main report chart
    Dim mrc As Chart
    Dim sercol As SeriesCollection
    Dim axe As Axis, ser As series
    Dim poi1 As Point, poi2 As Point
    Dim i As Integer, j As Integer
    'select the chart
    If hwb Is Nothing Then Call SetGlobals
    Set mrc = mws.ChartObjects("Chart 1").Chart
    'delave all the needed vars
    Dim poi1pos As Double, poi1val As Double
    Dim min1 As Integer, max1 As Integer
    Dim poi2pos As Double, poi2val As Double
    Dim min2 As Integer, max2 As Integer
    'get the chart width params
    Dim width As Integer
    width = Int(mrc.PlotArea.InsideWidth)
    Set sercol = mrc.SeriesCollection
    Set axe = mrc.Axes(2, sercol(1).AxisGroup)
    min1 = axe.MinimumScale
    max1 = axe.MaximumScale
    Set axe = mrc.Axes(2, sercol(2).AxisGroup)
    min2 = axe.MinimumScale
    max2 = axe.MaximumScale
    'start adjusting. 
    For j = 1 To sercol(1).points.Count
        Set poi1 = sercol(1).points(j)
        Set poi2 = sercol(2).points(j)
        poi1pos = poi1.DataLabel.Left
        poi2pos = poi2.DataLabel.Left
        poi1val = poi1.DataLabel.Text
        poi2val = poi2.DataLabel.Text
        poi1pos = (poi1val / (max1 - min1) * width - 6) + 142
        poi2pos = (poi2val / (max2 - min2) * width - 6) + 142
        If poi2pos < poi1pos + (Len(Str(poi1val)) * 6) And _
            poi1pos < poi2pos + (Len(Str(poi2val)) * 6) Then
            poi2pos = poi1pos + (Len(Str(poi1val)) * 6)
        End If
        poi1.DataLabel.Left = poi1pos
        poi2.DataLabel.Left = poi2pos
    Next j
End Sub
于 2012-10-18T15:53:49.283 に答える