Board logo

標題: [發問] 有關excelVBA圖表的問題 [打印本頁]

作者: lin_6219    時間: 2013-6-7 22:46     標題: 有關excelVBA圖表的問題

各位各位~
不好意思,我現在再寫VBA圖表,要做股市K線圖,
要在一張圖表上放上K棒和移動平均線,並合併圖表放上成交量,
但目前這樣的程式在2003的版本,顯示出來很正常,
可是當用2007時,由於副作標是以成交量為主,
然後移動平均線也以副作標為主,
會導致移動平均線被擠在底下看不見= =
有沒有辦法,讓移動平均線也放在主座標軸
不會受到成交量影響,
拜託各位幫我想想,真的很急~麻煩了 謝謝:'(

作者: lin_6219    時間: 2013-6-7 23:04

有需要程式碼 我可以附上 謝謝))
作者: c_c_lai    時間: 2013-6-8 09:27

回復 2# lin_6219
未附上檔案,各位大大如何測試你所謂的問題。
作者: lin_6219    時間: 2013-6-8 12:43

回復 3# c_c_lai
抱歉抱歉~我是新手也第一次發問
這裡附上檔案
請大家幫幫我,謝謝:))
作者: c_c_lai    時間: 2013-6-8 19:41

回復 4# lin_6219
試試看!
  1. Sub KChartWithVolume()          '  K 線圖 與 成交量圖 放在同一圖表
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.    
  8.     Worksheets("主畫面").ChartObjects.Delete
  9.     nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  10.             
  11.     With Worksheets("繪圖資料")                  '  設定主座標軸最大及最小值
  12.         myMax = Application.Max(.Range("C2:C" & CStr(nRow)))
  13.         myMin = Application.Min(.Range("D2:D" & CStr(nRow)))
  14.         myMin = myMin - (myMax - myMin)
  15.     End With
  16.    
  17.     ' Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  18.     Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 490, 280)
  19.    
  20.     With ChtObj.Chart
  21.         ' .SetSourceData Worksheets("繪圖資料").Range("A2:E" & CStr(nRow))
  22.         .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$E$" & CStr(nRow))
  23.         .ChartType = xlStockOHLC
  24.         .HasTitle = True
  25.         .ChartTitle.Characters.Text = "K線與成交量圖"
  26.    
  27.         With .ChartGroups(1)
  28.             .HasUpDownBars = True
  29.             .UpBars.Interior.ColorIndex = 3
  30.             .DownBars.Interior.ColorIndex = 1
  31.             .GapWidth = 10
  32.         End With
  33.         
  34.         .SeriesCollection(1).Name = ""    ' 開盤價
  35.         .SeriesCollection(2).Name = ""    ' 最高價
  36.         .SeriesCollection(3).Name = ""    ' 最低價
  37.         .SeriesCollection(4).Name = ""    ' 收盤價 (成交價)
  38.         
  39.         With .Axes(xlValue)
  40.             .MaximumScale = Round(myMax, 2)
  41.             .MinimumScale = Round(myMin, 2)
  42.             '  .MaximumScale = myMax
  43.             '  .MinimumScale = myMin
  44.             .MajorUnit = 0.5                        ' 圖表左側數列之間距值設定
  45.         End With
  46.             
  47.         '  .SeriesCollection.Add Worksheets("繪圖資料").Range("G1:G" & CStr(nRow))
  48.         .SeriesCollection.Add Source:=Range("繪圖資料!$G$1:繪圖資料!$G$" & CStr(nRow))
  49.         With .SeriesCollection(5)
  50.             .AxisGroup = 1
  51.             '  .ChartType = xlXYScatterLinesNoMarkers
  52.             .ChartType = xlLines
  53.             .Name = "=繪圖資料!$G$1"    '  移動平均線
  54.             .Border.ColorIndex = 7
  55.         End With
  56.         
  57.         '  .SeriesCollection.NewSeries       '  新增成交量數列
  58.         .SeriesCollection.Add Source:=Range("繪圖資料!$F$1:繪圖資料!$F$" & CStr(nRow))
  59.         With .SeriesCollection(6)
  60.             .AxisGroup = 2                   '  設為副座標軸
  61.             '  .Values = Worksheets("繪圖資料").Range("F2:F" & CStr(nRow))
  62.             .ChartType = xlColumnClustered
  63.             .Name = "成交量"
  64.             .Interior.ColorIndex = 17
  65.         End With
  66.         
  67.         With Worksheets("繪圖資料")                      '  計算副座標軸最大及最小值
  68.             myMax = Application.Max(.Range("F2:F" & CStr(nRow)))
  69.             myMax = myMax * 2
  70.             myMin = 0.01
  71.         End With
  72.         
  73.         With .Axes(xlValue, xlSecondary)      '  設定副座標軸最大及最小值
  74.             .MaximumScale = Round(myMax, 0)
  75.             .MinimumScale = Round(myMin, 0)
  76.         End With
  77.         
  78.         With .PlotArea                         '  調整繪圖區域大小與位置
  79.             .Top = .Top - 2
  80.             .Height = .Height + 10
  81.             .Width = .Width + 75
  82.         End With
  83.         
  84.         .PlotArea.Select                        ' 將圖表的繪圖區格線灰黑顏色修改成淡青色、以及表格實線改以虛線表示
  85.         .Axes(xlValue).MajorGridlines.Select
  86.         With Selection.Format.Line
  87.             .Visible = msoTrue
  88.             .ForeColor.ObjectThemeColor = msoThemeColorAccent1
  89.             .ForeColor.TintAndShade = 0
  90.             .ForeColor.Brightness = 0.8000000119
  91.             .Transparency = 0
  92.             .Weight = 0.25
  93.             .DashStyle = msoLineSysDash
  94.         End With
  95.         
  96.         With .Legend
  97.             .Position = xlLegendPositionTop
  98.             .Top = .Top - 8
  99.             .Border.ColorIndex = 57
  100.             .Border.Weight = xlThin
  101.             .Border.LineStyle = xlContinuous
  102.             .Interior.ColorIndex = xlNone
  103.         End With
  104.     End With
  105.     Worksheets("主畫面").[A1].Select
  106. End Sub
複製代碼

作者: c_c_lai    時間: 2013-6-8 19:44

回復 4# lin_6219
附上圖表共參考。
[attach]15204[/attach]
作者: c_c_lai    時間: 2013-6-8 21:23

回復 4# lin_6219
股票柱狀圖好像與其它圖表無法共處在同一主軸上。
作者: lin_6219    時間: 2013-6-9 01:27

回復 7# c_c_lai
好喔,非常非常感謝你:)))))
目前好像真的不能把K線和移動平均線還有成交量一起放在同一張圖上,
學校的老師也找不到解決的辦法,
再次感謝你的幫忙,謝謝你。:)
作者: c_c_lai    時間: 2013-6-9 06:58

回復 8# lin_6219
一般我是將成交量(副座標軸)與股票柱狀圖(主座標軸)分開處哩,
亦即主座標軸指存在股票柱狀圖,其他均歸副座標軸歸類。
如圖:
[attach]15205[/attach]
[attach]15206[/attach]
[attach]15207[/attach]
作者: c_c_lai    時間: 2013-6-9 07:38

回復 8# lin_6219
我將你提供的程式碼稍稍修改了一些,
簡潔了一些使用之語法,效益性亦會改良。
如圖: (上圖是原本程式的執行結果,下圖是經過修飾的)
[attach]15208[/attach]
  1. Sub KChartWithVolume3()                         '  K線圖與成交量圖放在同一圖表
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     Worksheets("主畫面").ChartObjects.Delete
  9.     nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  10.     Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  11.    
  12.     With ChtObj.Chart
  13.         .SetSourceData Worksheets("繪圖資料").Range("B2:E" & CStr(nRow))
  14.         .ChartType = xlStockOHLC
  15.         .HasTitle = True
  16.         .ChartTitle.Characters.Text = "K線與成交量圖"
  17.         .SeriesCollection.Add Worksheets("繪圖資料").Range("G1:G" & CStr(nRow))
  18.         
  19.         With .SeriesCollection(5)
  20.             .ChartType = xlXYScatterLinesNoMarkers
  21.             '  .ChartType = xlLine
  22.             .Border.ColorIndex = 7
  23.             .AxisGroup = xlPrimary
  24.             .Name = "=繪圖資料!$G$1"
  25.         End With
  26.    
  27.         With .ChartGroups(1)
  28.             .AxisGroup = xlPrimary
  29.             .HasUpDownBars = True
  30.             .UpBars.Interior.ColorIndex = 3
  31.             .DownBars.Interior.ColorIndex = 1
  32.             .GapWidth = 10
  33.         End With
  34.         
  35.         With Worksheets("繪圖資料")              '  設定主座標軸最大及最小值
  36.             myMax = Application.Max(.Range("C2:C" & CStr(nRow)))
  37.             myMin = Application.Min(.Range("D2:D" & CStr(nRow)))
  38.             myMin = myMin - (myMax - myMin)
  39.         End With
  40.         
  41.         With .Axes(xlValue)
  42.             .MaximumScale = Round(myMax, 2)
  43.             .MinimumScale = Round(myMin, 2)
  44.         End With
  45.         
  46.         .SeriesCollection.NewSeries              '  新增成交量數列
  47.         With .SeriesCollection(6)
  48.             .Values = Worksheets("繪圖資料").Range("F2:F" & CStr(nRow))
  49.             .ChartType = xlColumnClustered
  50.             .Name = "成交量"
  51.             .Interior.ColorIndex = 17
  52.             .AxisGroup = xlSecondary             '  設為副座標軸
  53.         End With
  54.         
  55.         With Worksheets("繪圖資料")              '  計算副座標軸最大及最小值
  56.             myMax = Application.Max(.Range("F2:F" & CStr(nRow)))
  57.             myMax = myMax * 2
  58.             myMin = 0.01
  59.         End With
  60.         
  61.         With .Axes(xlValue, xlSecondary)         '  設定副座標軸最大及最小值
  62.             .MaximumScale = Round(myMax, 0)
  63.             .MinimumScale = Round(myMin, 0)
  64.         End With
  65.         
  66.          With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  67.              .CategoryType = xlCategoryScale
  68.              .TickLabelSpacing = 3                            '  標示間距
  69.              .TickLabels.NumberFormatLocal = "yyyy/m/d"
  70.              .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  71.         End With
  72.         
  73.         With .Legend                                          '  刪除不必要的圖例
  74.             .LegendEntries(2).Delete
  75.             .LegendEntries(2).Delete
  76.             .LegendEntries(2).Delete
  77.             .LegendEntries(2).Delete
  78.             .Top = .Parent.ChartTitle.Top - 5
  79.         End With
  80.         
  81.         With .PlotArea                                        '  調整繪圖區域大小與位置
  82.             .Top = .Top - 10
  83.             .Height = .Height + 10
  84.             .Width = .Width + 75
  85.         End With
  86.         
  87.         .PlotArea.Select    '  將圖表的繪圖區格線灰黑顏色修改成淡青色、以及表格實線改以虛線表示
  88.         .Axes(xlValue).MajorGridlines.Select
  89.         With Selection.Format.Line
  90.             .Visible = msoTrue
  91.             .ForeColor.ObjectThemeColor = msoThemeColorAccent1
  92.             .ForeColor.TintAndShade = 0
  93.             .ForeColor.Brightness = 0.8000000119
  94.             .Transparency = 0
  95.             .Weight = 0.25
  96.             .DashStyle = msoLineSysDash
  97.         End With
  98.     End With
  99.     Worksheets("主畫面").[A1].Select
  100. End Sub
複製代碼

作者: lin_6219    時間: 2013-6-9 14:39

回復 10# c_c_lai
好的,十分感謝你喔,我會在做修改的,讓效益更好。再次謝謝你:)))
作者: lin_6219    時間: 2013-6-9 15:18

回復 10# c_c_lai
不好意思 在向你詢問一個問題
我現在如果要畫一個xlline的圖
然後我要把日期加進去當成最底下的座標
通常就把日期欄位一起放進資料來源
可是他居然也畫出線來
這有辦法可以解決嗎
謝謝
作者: c_c_lai    時間: 2013-6-9 15:24

回復  c_c_lai
不好意思 在向你詢問一個問題
我現在如果要畫一個xlline的圖
然後我要把日期加進去當成最 ...
lin_6219 發表於 2013-6-9 15:18

你是一開始便宣告的嗎? 譬如下方之例子:
.SetSourceData Worksheets("繪圖資料").Range("A2:E" & CStr(nRow))
還是在中段加入的?
作者: lin_6219    時間: 2013-6-9 15:50

回復 13# c_c_lai

我是一開始就加進去了,可是我要畫線的資料在J欄,中間的資料沒要畫線,
所以我這樣打 SetSourceData Worksheets("繪圖資料").Range("A2:A" &Cstr(nrow), "J2:J" & CStr(nRow))
作者: c_c_lai    時間: 2013-6-9 16:17

回復 14# lin_6219
附上測試程式供參考: Range("繪圖資料!$A$2:繪圖資料!$A$" & CStr(nRow) & ", 繪圖資料!$F$2:繪圖資料!$F$" & CStr(nRow))
  1. Sub Test()
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer, chartname As String
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     With Worksheets("主畫面")
  9.         .ChartObjects.Delete
  10.         .Select
  11.         nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  12.         Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  13.         
  14.         With ChtObj.Chart
  15.             .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$A$" & CStr(nRow) & ", 繪圖資料!$F$2:繪圖資料!$F$" & CStr(nRow))
  16.             .ChartType = xlXYScatterLinesNoMarkers
  17.             .HasTitle = True
  18.             .ChartTitle.Characters.Text = "K線與成交量圖"
  19.             
  20.             With .SeriesCollection(1)
  21.                 .Border.ColorIndex = 7
  22.                 .Name = "=繪圖資料!$F$1"
  23.             End With
  24.             
  25.             With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  26.                 .CategoryType = xlCategoryScale
  27.                 .TickLabelSpacing = 3                            '  標示間距
  28.                 .TickLabels.NumberFormatLocal = "yyyy/m/d"
  29.                 .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  30.             End With
  31.         End With
  32.     End With
  33. End Sub
複製代碼
[attach]15219[/attach]
作者: lin_6219    時間: 2013-6-10 00:04

回復 15# c_c_lai
非常非常感謝你,我還有一個小小問題,就是目前坐標軸沒問題了,可是日期軸的部分,
他對應的直槓(黑線間隔),不像你的只有有日期才有出現,而是全部都出現有出現,請問有設定的屬性嗎?
作者: c_c_lai    時間: 2013-6-10 06:39

回復 16# lin_6219
對應的直槓(黑線間隔),不像你的只有有日期才有出現,而是全部都出現有出現?
不太明白你指的是?  能否描述清楚些?
作者: lin_6219    時間: 2013-6-10 22:37

[attach]15230[/attach]回復 17# c_c_lai
不好意思,這麼晚才回你,
我所指的就是圖中黃色框起來的部分,你的圖是有日期的地方,向上才有黑槓,
但我的每個間距都有,是哪邊需要做設定嗎?感謝:))
作者: c_c_lai    時間: 2013-6-11 12:22

回復 18# lin_6219
這我倒是沒去留意,為什麼會不同,
我也不清楚。乾脆附上程式碼讓你核對:
  1. Sub Test()
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer, chartname As String
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     With Worksheets("主畫面")
  9.         .ChartObjects.Delete
  10.         .Select
  11.         nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  12.         Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  13.         
  14.         With ChtObj.Chart
  15.             '  .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$A$20, 繪圖資料!$F$2:繪圖資料!$F$20")
  16.             .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$A$" & CStr(nRow) & ", 繪圖資料!$F$2:繪圖資料!$F$" & CStr(nRow))
  17.             .ChartType = xlXYScatterLinesNoMarkers
  18.             .HasTitle = True
  19.             .ChartTitle.Characters.Text = "K線與成交量圖"
  20.             
  21.             With .SeriesCollection(1)
  22.                 .Border.ColorIndex = 7
  23.                 .Name = "=繪圖資料!$F$1"
  24.             End With
  25.             
  26.             With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  27.                 ' .CategoryType = xlCategoryScale
  28.                 ' .TickLabelSpacing = 1                            '  標示間距
  29.                 .TickLabels.NumberFormatLocal = "yyyy/m/d"
  30.                 .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  31.                 ' .TickLabels.Orientation = xlTickLabelOrientationUpward
  32.             End With
  33.         End With
  34.     End With
  35. End Sub
複製代碼

作者: lin_6219    時間: 2013-6-11 15:49

回復 19# c_c_lai
好的,非常感謝你喔,我核對看看然後試試,謝謝你:D
作者: lin_6219    時間: 2013-6-12 01:13

找到了,我是用xlLine劃線,所以才會有每個間距出現,大家可以用 xlXYScatterLinesNoMarkers 試看看。
作者: c_c_lai    時間: 2013-6-12 06:19

本帖最後由 c_c_lai 於 2013-6-12 06:25 編輯
找到了,我是用xlLine劃線,所以才會有每個間距出現,大家可以用 xlXYScatterLinesNoMarkers 試看看。
lin_6219 發表於 2013-6-12 01:13

請看了圖示後,再行觀察。xlXYScatterLinesNoMarkers 並非是主因,
關鍵點應該是 "日期時間軸" 之歸屬,且是位於 xlPrimary 主座標軸。
因為你的日期是用民國年,故在圖表複雜處理下日期顯示亦有不同。
語法內容之增減,結果亦造成會些許之異同。只能在Coding時盡力避開。
如以 圖1、圖2 為例,因 "移動平均線" 與  "日期時間軸" 均位於主座標軸;
圖3~6 則是以股票柱狀圖 (xlStockOHLC) 為主座標軸,是故 圖1~2 論定便不適用。
至於 圖3~4、圖5~6 的顯示日期為何几近雷同的模組會有不同結果那就要
仔細去觀察程式碼了。
[attach]15237[/attach][attach]15236[/attach]
[attach]15238[/attach][attach]15239[/attach]
[attach]15240[/attach][attach]15241[/attach]
作者: c_c_lai    時間: 2013-6-12 06:28

本帖最後由 c_c_lai 於 2013-6-12 06:32 編輯

回復 21# lin_6219
想了想還是將程式模組貼上,你有空時再行觀察。
  1. Sub KChartWithVolume()                         '  K線圖與成交量圖放在同一圖表
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     With Worksheets("主畫面")
  9.         .ChartObjects.Delete
  10.         nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  11.         Set ChtObj = .ChartObjects.Add(1, 1, 450, 250)
  12.         
  13.         With ChtObj.Chart
  14.             .SetSourceData Worksheets("繪圖資料").Range("A1:E" & CStr(nRow))
  15.             .ChartType = xlStockOHLC
  16.             .HasTitle = True
  17.             .ChartTitle.Characters.Text = "K線與成交量圖"
  18.                
  19.             With .ChartGroups(1)
  20.                 .AxisGroup = xlPrimary
  21.                 .HasUpDownBars = True
  22.                 .UpBars.Interior.ColorIndex = 3
  23.                 .DownBars.Interior.ColorIndex = 1
  24.                 .GapWidth = 10
  25.             End With
  26.             
  27.             .SeriesCollection.Add Worksheets("繪圖資料").Range("G2:G" & CStr(nRow))
  28.                
  29.             With .SeriesCollection(5)
  30.                 ' .ChartType = xlXYScatterLinesNoMarkers
  31.                 .ChartType = xlLine
  32.                 .AxisGroup = xlPrimary
  33.                 .Border.ColorIndex = 7
  34.                 .Name = "=繪圖資料!$G$1"
  35.             End With
  36.             
  37.             With Worksheets("繪圖資料")              '  設定主座標軸最大及最小值
  38.                 myMax = Application.Max(.Range("C2:C" & CStr(nRow)))
  39.                 myMin = Application.Min(.Range("D2:D" & CStr(nRow)))
  40.                 myMin = myMin - (myMax - myMin)
  41.             End With
  42.             
  43.             With .Axes(xlValue)
  44.                 .MaximumScale = Round(myMax, 2)
  45.                 .MinimumScale = Round(myMin, 2)
  46.             End With
  47.             
  48.             .SeriesCollection.NewSeries              '  新增成交量數列
  49.             With .SeriesCollection(6)
  50.                 .Values = Worksheets("繪圖資料").Range("F2:F" & CStr(nRow))
  51.                 .ChartType = xlColumnClustered
  52.                 .Name = "成交量"
  53.                 .Interior.ColorIndex = 17
  54.                 .AxisGroup = xlSecondary             '  設為副座標軸
  55.             End With
  56.             
  57.             With Worksheets("繪圖資料")              '  計算副座標軸最大及最小值
  58.                 myMax = Application.Max(.Range("F2:F" & CStr(nRow)))
  59.                 myMax = myMax * 2
  60.                 myMin = 0.01
  61.             End With
  62.             
  63.             With .Axes(xlValue, xlSecondary)         '  設定副座標軸最大及最小值
  64.                 .MaximumScale = Round(myMax, 0)
  65.                 .MinimumScale = Round(myMin, 0)
  66.             End With
  67.             
  68.              With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  69.                  .CategoryType = xlCategoryScale
  70.                  .TickLabelSpacing = 4                            '  標示間距
  71.                  .TickLabels.NumberFormatLocal = "yyyy/m/d"
  72.                  .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  73.             End With
  74.             
  75.             With .Legend                                          '  刪除不必要的圖例
  76.                 .LegendEntries(2).Delete                          '  開盤價
  77.                 .LegendEntries(2).Delete                          '  最高價
  78.                 .LegendEntries(2).Delete                          '  最低價
  79.                 .LegendEntries(2).Delete                          '  收盤價
  80.                 .Top = .Parent.ChartTitle.Top - 5
  81.             End With
  82.                
  83.             '  With .ChartArea
  84.             '      .Border.Weight = 2
  85.             '      .Border.LineStyle = 0
  86.             '      '  圖表的繪圖區外之 X、Y 軸列示資料數據區塊部分予以填入圖表預設(系統)之底色、可增強視覺效果。
  87.             '      .Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=1, Degree:=0.231372549019608
  88.             '      ' .Fill.Visible = True         '  加入圖表底色變數內給于之色系。
  89.             '      ' .Fill.ForeColor.SchemeColor = 圖表底色
  90.             '  End With
  91.             
  92.             With .PlotArea                                        '  調整繪圖區域大小與位置
  93.                 .Top = .Top - 10
  94.                 .Height = .Height + 10
  95.                 .Width = .Width + 95
  96.             End With
  97.             
  98.             .PlotArea.Select    '  將圖表的繪圖區格線灰黑顏色修改成淡青色、以及表格實線改以虛線表示
  99.             .Axes(xlValue).MajorGridlines.Select
  100.             With Selection.Format.Line
  101.                 .Visible = msoTrue
  102.                 .ForeColor.ObjectThemeColor = msoThemeColorAccent1
  103.                 .ForeColor.TintAndShade = 0
  104.                 .ForeColor.Brightness = 0.8000000119
  105.                 .Transparency = 0
  106.                 .Weight = 0.25
  107.                 .DashStyle = msoLineSysDash
  108.             End With
  109.         End With
  110.         .[A1].Select
  111.     End With
  112. End Sub
複製代碼

作者: c_c_lai    時間: 2013-6-12 06:28

回復 21# lin_6219
  1. Sub KChartWithVolume2()                         '  K線圖與成交量圖放在同一圖表
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer, chartname As String
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     With Worksheets("主畫面")
  9.         .ChartObjects.Delete
  10.         .Select
  11.         nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  12.         '  Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  13.         '  With ChtObj.Chart ~ End With
  14.         '  此範例 改以 Worksheets("主畫面").Shapes.AddChart.Select 的方式處理;
  15.         '              With ActiveChart
  16.         '                  . . . . . . . . . . . .
  17.         '                  With .ChartArea
  18.         '                      .Height = 250
  19.         '                      .Width = 450
  20.         '                  End With
  21.         '                  . . . . . . . . . . . .
  22.         '                  chartname = Trim(Replace(ActiveChart.Name, ActiveSheet.Name, ""))
  23.         '                  .Shapes(chartname).Left = Cells(1, 1).Left
  24.         '                  .Shapes(chartname).Top = Cells(1, 1).Top
  25.         '                  . . . . . . . . . . . .
  26.         '              End With
  27.         '  同理,亦可以使用 Worksheets("主畫面").ChartObjects.Add() 的方式處理
  28.         '  差別只在於 With ActiveChart ~ End With 間,要另行宣告圖表高、寬度,以及座標位置。
  29.         '  換言之, Worksheets("主畫面").ChartObjects.Add() 是一次便宣告完成,宣告物件不同。
  30.         .Shapes.AddChart.Select
  31.         
  32.         '  With ChtObj.Chart
  33.         With ActiveChart
  34.             '  .SetSourceData Worksheets("繪圖資料").Range("A2:E" & CStr(nRow))
  35.             .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$E$" & CStr(nRow))
  36.             .ChartType = xlStockOHLC
  37.             .HasTitle = True
  38.             .ChartTitle.Characters.Text = "K線與成交量圖"
  39.             
  40.             With .ChartGroups(1)
  41.                 .AxisGroup = xlPrimary
  42.                 .HasUpDownBars = True
  43.                 .UpBars.Interior.ColorIndex = 3
  44.                 .DownBars.Interior.ColorIndex = 1
  45.                 .GapWidth = 10
  46.             End With
  47.             
  48.             '  .SeriesCollection.Add Worksheets("繪圖資料").Range("G1:G" & CStr(nRow))
  49.             .SeriesCollection.Add Source:=Range("繪圖資料!$G$2:繪圖資料!$G$" & CStr(nRow))
  50.                
  51.             With .SeriesCollection(5)
  52.                 .ChartType = xlXYScatterLinesNoMarkers
  53.                 '  .ChartType = xlLine
  54.                 .AxisGroup = xlPrimary
  55.                 ' 如果 主座標值為 xlStockOHLC,此處宣告會被忽視,視同 xlSecondary。
  56.                 .Border.ColorIndex = 7
  57.                 .Name = "=繪圖資料!$G$1"
  58.             End With
  59.                            
  60.             With Worksheets("繪圖資料")              '  設定主座標軸最大及最小值
  61.                 myMax = Application.Max(.Range("C2:C" & CStr(nRow)))
  62.                 myMin = Application.Min(.Range("D2:D" & CStr(nRow)))
  63.                 myMin = myMin - (myMax - myMin)
  64.             End With
  65.             
  66.             With .Axes(xlValue)
  67.                 .MaximumScale = Round(myMax, 2)
  68.                 .MinimumScale = Round(myMin, 2)
  69.             End With
  70.             
  71.             '  .SeriesCollection.NewSeries      '  新增成交量數列 (與下述宣告結果一致)
  72.             .SeriesCollection.Add Source:=Range("繪圖資料!$F$2:繪圖資料!$F$" & CStr(nRow))
  73.             
  74.             With .SeriesCollection(6)
  75.                 '  此處 .Values 存放值範圍必須是指向 "有實體數據資料" 範圍區域。
  76.                 '  如果使用 .SeriesCollection.NewSeries 宣告,則必須指明 .Values。
  77.                 ' .Values = Worksheets("繪圖資料").Range("F2:F" & CStr(nRow))
  78.                 .ChartType = xlColumnClustered
  79.                 .Name = "成交量"                     '  "=繪圖資料!$F$1" (成交金額)
  80.                 .Interior.ColorIndex = 17
  81.                 .AxisGroup = xlSecondary             '  設為副座標軸
  82.             End With
  83.             
  84.             With Worksheets("繪圖資料")              '  計算副座標軸最大及最小值
  85.                 myMax = Application.Max(.Range("F2:F" & CStr(nRow)))
  86.                 myMax = myMax * 2
  87.                 myMin = 0.01
  88.             End With
  89.             
  90.             With .Axes(xlValue, xlSecondary)         '  設定副座標軸最大及最小值
  91.                 .MaximumScale = Round(myMax, 0)
  92.                 .MinimumScale = Round(myMin, 0)
  93.             End With
  94.             
  95.             With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  96.                 .CategoryType = xlCategoryScale
  97.                 .TickLabelSpacing = 4                            '  標示間距
  98.                 .TickLabels.NumberFormatLocal = "yyyy/m/d"
  99.                 .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  100.             End With
  101.             
  102.             With .Legend                                          '  刪除不必要的圖例
  103.                 .LegendEntries(2).Delete                          '  開盤價
  104.                 .LegendEntries(2).Delete                          '  最高價
  105.                 .LegendEntries(2).Delete                          '  最低價
  106.                 .LegendEntries(2).Delete                          '  收盤價
  107.                 .Top = .Parent.ChartTitle.Top - 5
  108.             End With
  109.             
  110.             With .ChartArea
  111.                 .Height = 250                               '  將原本設定之高度調至適度位置
  112.                 .Width = 450
  113.                         
  114.                 .Border.Weight = 2
  115.                 .Border.LineStyle = 0
  116.                 '  圖表的繪圖區外之 X、Y 軸列示資料數據區塊部分予以填入圖表預設(系統)之底色、可增強視覺效果。
  117.                 .Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=1, Degree:=0.231372549019608
  118.                 ' .Fill.Visible = True         '  加入圖表底色變數內給于之色系。
  119.                 ' .Fill.ForeColor.SchemeColor = 圖表底色
  120.             End With
  121.             
  122.             With .PlotArea                                        '  調整繪圖區域大小與位置
  123.                 .Top = .Top - 10
  124.                 .Height = .Height + 15
  125.                 .Width = .Width + 95
  126.             End With
  127.             
  128.             .PlotArea.Select    '  將圖表的繪圖區格線灰黑顏色修改成淡青色、以及表格實線改以虛線表示
  129.             .Axes(xlValue).MajorGridlines.Select
  130.             With Selection.Format.Line
  131.                 .Visible = msoTrue
  132.                 .ForeColor.ObjectThemeColor = msoThemeColorAccent1
  133.                 .ForeColor.TintAndShade = 0
  134.                 .ForeColor.Brightness = 0.8000000119
  135.                 .Transparency = 0
  136.                 .Weight = 0.25
  137.                 .DashStyle = msoLineSysDash
  138.             End With
  139.         End With
  140.             
  141.         chartname = Trim(Replace(ActiveChart.Name, ActiveSheet.Name, ""))
  142.         .Shapes(chartname).Left = Cells(1, 1).Left     '  設定此圖表實際擺放的 X、Y 座標位置。
  143.         .Shapes(chartname).Top = Cells(1, 1).Top

  144.         .[A1].Select
  145.     End With
  146. End Sub
複製代碼

作者: c_c_lai    時間: 2013-6-12 06:29

回復 21# lin_6219
  1. Sub KChartWithVolume3()                         '  K線圖與成交量圖放在同一圖表
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     Worksheets("主畫面").ChartObjects.Delete
  9.     nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  10.     Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  11.    
  12.     With ChtObj.Chart
  13.         .SetSourceData Worksheets("繪圖資料").Range("B2:E" & CStr(nRow))
  14.         .ChartType = xlStockOHLC
  15.         .HasTitle = True
  16.         .ChartTitle.Characters.Text = "K線與成交量圖"
  17.    
  18.         With .ChartGroups(1)
  19.             .AxisGroup = xlPrimary
  20.             .HasUpDownBars = True
  21.             .UpBars.Interior.ColorIndex = 3
  22.             .DownBars.Interior.ColorIndex = 1
  23.             .GapWidth = 10
  24.         End With
  25.         
  26.         .SeriesCollection.Add Worksheets("繪圖資料").Range("G2:G" & CStr(nRow))
  27.         
  28.         With .SeriesCollection(5)
  29.             .ChartType = xlXYScatterLinesNoMarkers
  30.             '  .ChartType = xlLine
  31.             .AxisGroup = xlPrimary
  32.             .Border.ColorIndex = 7
  33.             .Name = "=繪圖資料!$G$1"
  34.         End With
  35.         
  36.         With Worksheets("繪圖資料")              '  設定主座標軸最大及最小值
  37.             myMax = Application.Max(.Range("C2:C" & CStr(nRow)))
  38.             myMin = Application.Min(.Range("D2:D" & CStr(nRow)))
  39.             myMin = myMin - (myMax - myMin)
  40.         End With
  41.         
  42.         With .Axes(xlValue)
  43.             .MaximumScale = Round(myMax, 2)
  44.             .MinimumScale = Round(myMin, 2)
  45.         End With
  46.         
  47.         .SeriesCollection.NewSeries              '  新增成交量數列
  48.         With .SeriesCollection(6)
  49.             .Values = Worksheets("繪圖資料").Range("F2:F" & CStr(nRow))
  50.             .ChartType = xlColumnClustered
  51.             .Name = "成交量"
  52.             .Interior.ColorIndex = 17
  53.             .AxisGroup = xlSecondary             '  設為副座標軸
  54.         End With
  55.         
  56.         With Worksheets("繪圖資料")              '  計算副座標軸最大及最小值
  57.             myMax = Application.Max(.Range("F2:F" & CStr(nRow)))
  58.             myMax = myMax * 2
  59.             myMin = 0.01
  60.         End With
  61.         
  62.         With .Axes(xlValue, xlSecondary)         '  設定副座標軸最大及最小值
  63.             .MaximumScale = Round(myMax, 0)
  64.             .MinimumScale = Round(myMin, 0)
  65.         End With
  66.         
  67.         With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  68.             .CategoryType = xlCategoryScale
  69.             .TickLabelSpacing = 4                            '  標示間距
  70.             .TickLabels.NumberFormatLocal = "yyyy/m/d"
  71.             .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  72.         End With
  73.         
  74.         With .Legend                                          '  刪除不必要的圖例
  75.             .LegendEntries(2).Delete                          '  開盤價
  76.             .LegendEntries(2).Delete                          '  最高價
  77.             .LegendEntries(2).Delete                          '  最低價
  78.             .LegendEntries(2).Delete                          '  收盤價
  79.             .Top = .Parent.ChartTitle.Top - 5
  80.         End With
  81.         
  82.         With .PlotArea                                        '  調整繪圖區域大小與位置
  83.             .Top = .Top - 10
  84.             .Height = .Height + 10
  85.             .Width = .Width + 95
  86.         End With
  87.         
  88.         .PlotArea.Select    '  將圖表的繪圖區格線灰黑顏色修改成淡青色、以及表格實線改以虛線表示
  89.         .Axes(xlValue).MajorGridlines.Select
  90.         With Selection.Format.Line
  91.             .Visible = msoTrue
  92.             .ForeColor.ObjectThemeColor = msoThemeColorAccent1
  93.             .ForeColor.TintAndShade = 0
  94.             .ForeColor.Brightness = 0.8000000119
  95.             .Transparency = 0
  96.             .Weight = 0.25
  97.             .DashStyle = msoLineSysDash
  98.         End With
  99.     End With
  100.     Worksheets("主畫面").[A1].Select
  101. End Sub
複製代碼

作者: c_c_lai    時間: 2013-6-12 06:31

回復 21# lin_6219
  1. Sub Test()
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer, chartname As String
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     With Worksheets("主畫面")
  9.         .ChartObjects.Delete
  10.         .Select
  11.         nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  12.         Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  13.         
  14.         With ChtObj.Chart
  15.             '  .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$A$20, 繪圖資料!$F$2:繪圖資料!$F$20")
  16.             .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$A$" & CStr(nRow) & ", 繪圖資料!$F$2:繪圖資料!$F$" & CStr(nRow))
  17.             .ChartType = xlXYScatterLinesNoMarkers
  18.             ' .ChartType = xlLine
  19.             .HasTitle = True
  20.             .ChartTitle.Characters.Text = "K線與成交量圖"
  21.             
  22.             With .SeriesCollection(1)
  23.                 .Border.ColorIndex = 7
  24.                 .Name = "=繪圖資料!$F$1"
  25.             End With
  26.             
  27.             With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  28.                 .CategoryType = xlCategoryScale
  29.                 .TickLabelSpacing = 4                            '  標示間距
  30.                 .TickLabels.NumberFormatLocal = "yyyy/m/d"
  31.                 .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  32.                 ' .TickLabels.Orientation = xlTickLabelOrientationUpward
  33.             End With
  34.         End With
  35.     End With
  36. End Sub
複製代碼

作者: lin_6219    時間: 2013-6-12 15:35

回復 26# c_c_lai
好的,我再好好仔細研究看看,圖表這個部分,狀況真的很多呢,十分感謝你:)))
作者: lin_6219    時間: 2013-6-12 21:34

回復 26# c_c_lai
不好意思,我想再請問說,如果是成交量這種圖,而且是用西元年,那有辦法避免掉嗎? 感謝。[attach]15243[/attach]
圖表類型為 xlColumnClustered
作者: c_c_lai    時間: 2013-6-13 06:37

本帖最後由 c_c_lai 於 2013-6-13 06:42 編輯

回復 28# lin_6219
基本上,圖表在運作時,它並不會理會是西元、或民國年,
只是在顯示時發生轉換上的問題。
原則上,如果我選用民國年作為檔案的日期欄,在此情況下
.TickLabels.NumberFormatLocal = "m/d" 應該會是我的選擇。
至於在 xlColumnClustered  下,我是沒試過點位的問題。
作者: c_c_lai    時間: 2013-6-13 07:02

回復 28# lin_6219
經測試 xlColumnClustered、xlColumnStacked、xl3DColumnStacked、
xl3DColumnClustered 等,結果都是一般正常的點位。如圖:
[attach]15245[/attach]
這方面可能要直接請教 Microsoft 或自行上網搜尋相關資料了。
作者: lin_6219    時間: 2013-6-13 15:44

回復 30# c_c_lai
好的,那這樣我瞭解了,非常感謝你很詳細的解答我的問題,謝謝:)))




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