Board logo

標題: [發問] 圖表 chart 內趨勢線的資料點之 Top Left 座標 VBA如何取得 [打印本頁]

作者: Scott090    時間: 2014-8-14 20:22     標題: 圖表 chart 內趨勢線的資料點之 Top Left 座標 VBA如何取得

敬請賢達指導:
下列新加一趨勢線,資料點在 Array 內,執行畫趨勢線後如何取得個資料點的 top left 座標值?
謝謝

  ActiveChart.SeriesCollection.NewSeries.Select
        With Selection
            .Name = "=""AAAA"""
            .XValues = Array(0.12,0.13, 0.14,0.15)     'x_category
            .Values = Array(2.2,2.1,1.8,1.5)                   'y_value
            .MarkerStyle = -4142
           With Selection.Format.Line
               .Visible = msoTrue
               .ForeColor.RGB = RGB(255, 0, 0)
               .Transparency = 0
               .Weight = 3#
           End With
        End With
作者: GBKEE    時間: 2014-8-15 08:26

回復 1# Scott090
是這樣嗎?
  1. Option Explicit
  2. Sub Ex()
  3.     Dim X, Y
  4.     With ActiveChart.SeriesCollection.NewSeries
  5.         .XValues = Array(0.12, 0.13, 0.14, 0.15)   'x_category
  6.         .Values = Array(2.2, 2.1, 1.8, 1.5)        'y_value
  7.         X = .XValues 'X軸數值
  8.         Y = .Values 'Y軸數值
  9.         MsgBox "Top= " & X(1) & " ,Left= " & Y(1)
  10.     End With
  11. End Sub
複製代碼

作者: Scott090    時間: 2014-8-15 21:50

回復 2# GBKEE

謝謝指導
能否轉化為 相對於chartarea 或 plotarea 的 top left (也許是視窗座標吧? 不確定叫甚麼)
例如  .top = 250
           .left = 55
再感恩
作者: Scott090    時間: 2014-8-16 07:57

本帖最後由 Scott090 於 2014-8-16 08:10 編輯

回復 2# GBKEE


    '特定資料點(0.15,1.5) 的 Top, Left 如何取得??
請參考附件, 謝謝
作者: Scott090    時間: 2014-8-16 08:16

回復 3# Scott09
附件
作者: GBKEE    時間: 2014-8-17 07:27

本帖最後由 GBKEE 於 2014-8-17 07:28 編輯

回復 5# Scott090

特定資料點(0.15,1.5) 的 Top, Left 如何取得, 功力不夠幫不上忙.
如圖: 滑鼠移到資料點可顯示出資料點的數值,為何還要加上說明.


    [attach]18934[/attach]
作者: Scott090    時間: 2014-8-17 08:00

回復 6# GBKEE


    謝謝大師熱心地回應
作者: GBKEE    時間: 2014-8-18 10:40

回復 7# Scott090
幫你練一下功,試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim X(), Y(), XLeft As Single, Ytop As Single, i As Integer
  4.     Dim P As PlotArea, C As Chart, S As Shapes
  5.     Set C = ActiveSheet.ChartObjects(1).Chart  '指定圖表
  6.     Set P = C.PlotArea
  7.     X = C.SeriesCollection(1).XValues 'X軸數值
  8.     Y = C.SeriesCollection(1).Values  'Y軸數值
  9.     i = 3   '指定數值點.
  10.     With C.Axes(1) 'xlCategory  'X軸
  11.          XLeft = P.InsideWidth / (.MaximumScale - .MinimumScale)
  12.          '點數間距的寬度
  13.     End With
  14.     With C.Axes(2)   'xlValue  'Y軸
  15.         Ytop = P.InsideHeight / (.MaximumScale - .MinimumScale)
  16.         ''點數間距的高度
  17.     End With
  18.     XLeft = P.InsideLeft + (XLeft * X(i))
  19.     Ytop = P.InsideTop + P.InsideHeight - (Ytop * Y(i))
  20.     Set S = C.Shapes
  21.     If S.Count <> 0 Then
  22.         C.Parent.Activate
  23.         S.SelectAll
  24.         Selection.Delete
  25.     End If
  26.     With C.Shapes.AddShape(msoShapeRectangle, Left:=XLeft, Top:=Ytop, Width:=100, Height:=50)
  27.         .TextFrame.Characters.Text = "附加說明1:" & Chr(10) & "X: " & X(i) & Space(5) & "Y: " & Y(i)
  28.     End With
  29.     C.Parent.Parent.Activate
  30. End Sub
複製代碼

作者: Scott090    時間: 2014-8-18 21:12

本帖最後由 Scott090 於 2014-8-18 21:14 編輯

回復 8# GBKEE


    非常感恩大師熱情的指導
由 PlotArea 視窗直接計算資料點位置一定是非常的穩健的做法

另,有找到資料點的屬性 Points().top Points().left,其穩健性如何不得而知,大膽列出來給參考:
  1. Sub Ex2()
  2.     Dim X(), Y(), XLeft As Single, Ytop As Single, i As Integer
  3.     Dim P As PlotArea, C As Chart, S As Shapes
  4.    
  5.     Set C = ActiveSheet.ChartObjects(1).Chart  '指定圖表
  6.     X = C.SeriesCollection(1).XValues 'X軸數值
  7.     Y = C.SeriesCollection(1).Values  'Y軸數值
  8.     i = 3   '指定數值點.
  9.    
  10.     Ytop = C.SeriesCollection(1).Points(i).Top      '資料點 i 的 Top 值
  11.     XLeft = C.SeriesCollection(1).Points(i).Left    '資料點 i 的 left 值
  12.    
  13.     With C.Shapes.AddShape(msoShapeRectangle, Left:=XLeft, Top:=Ytop, Width:=100, Height:=50)
  14.         .TextFrame.Characters.Text = "附加說明1:" & Chr(10) & "X: " & X(i) & Space(5) & "Y: " & Y(i)
  15.     End With
  16.    
  17.     Range("E10").Select
  18. End Sub
複製代碼

作者: GBKEE    時間: 2014-8-19 07:18

回復 9# Scott090
2003版Points沒有這些屬性
  1.   Ytop = C.SeriesCollection(1).Points(i).Top      '資料點 i 的 Top 值
  2. XLeft = C.SeriesCollection(1).Points(i).Left    '資料點 i 的 left 值
複製代碼
試試看
  1. Sub Ex()
  2.     Dim P As Point, C As Chart, i As Integer
  3.     Set C = ActiveSheet.ChartObjects(1).Chart  '指定圖表
  4.     i = 2   '指定數值點
  5.     With C.SeriesCollection(1)
  6.         .HasDataLabels = True
  7.         .DataLabels.Delete
  8.     End With

  9.     Set P = C.SeriesCollection(1).Points(i)
  10.     P.ApplyDataLabels xlDataLabelsShowLabel, ShowValue:=True
  11.     With P.DataLabel
  12.         .Interior.ColorIndex = 35
  13.         .Characters.Text = "附加說明1:  " & vbLf & .Characters.Text
  14.     End With
  15. End Sub
複製代碼

作者: Scott090    時間: 2014-8-19 08:03

回復 10# GBKEE

利用資料標籤來顯示其他文字,實在高明
學習了,問題也解決了
辛苦了大師

謝謝
作者: fei6999    時間: 2016-1-3 12:13

本帖最後由 fei6999 於 2016-1-3 12:15 編輯
回復  Scott090

特定資料點(0.15,1.5) 的 Top, Left 如何取得, 功力不夠幫不上忙.
如圖: 滑鼠移到資料 ...
GBKEE 發表於 2014-8-17 07:27


請問版主標示紅色框是顯示圖表數列及資料點,這個功能可以關掉不讓它顯示嗎?
作者: Scott090    時間: 2016-1-4 23:41

回復 12# fei6999


    不太能了解你的意思,最好能貼一張圖說明
一般是趨勢圖做完了以後再變更屬性,用手動或VBA畫的就用VBA變更它
是否能畫圖前先關掉它,我不知道




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)