返回列表 上一主題 發帖

[發問] 如何應用 VBA 將股票圖完整的呈現出來?

回復 1# c_c_lai
這可以利用 xlStockVOHLC的ChartType來完成
假設日期在A欄,成交量在B欄, 開高低收分別在CDEF欄

n = Range("A1").End(xlDown).Row
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlStockVOHLC       '自動會把日期和成交量帶進去        
ActiveChart.SetSourceData Source:=Range("A1:F" & n)         
With ActiveChart
        .HasLegend = False
        .Axes(xlCategory).CategoryType = xlCategoryScale    'X軸設為Category, 為避免有些日期無交易而造成圖形不連續
End With
Alex

TOP

本帖最後由 alexliou 於 2012-4-24 17:47 編輯

分成兩步做 且用到xlColumnClustered也是可以
這次加上顏色  上漲Bar用紅色 下跌用藍色

假設日期在A欄, 開高低收分別在BCDE欄, 成交量在F欄

Dim n As Integer
n = Range("A1").End(xlDown).Row
  ActiveSheet.Shapes.AddChart.Select
  ActiveChart.SetSourceData Source:=Range("A1:E" & n)
  ActiveChart.ChartType = xlStockOHLC       '自動會把日期帶進去
  
ActiveChart.ChartGroups(1).UpBars.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
ActiveChart.ChartGroups(1).DownBars.Format.Fill.ForeColor.RGB = RGB(0, 32, 96)
   
ActiveChart.SeriesCollection.Add Source:=Range("F2:F" & n)    '不包含標題列, 要從2開始
ActiveChart.SeriesCollection(5).ChartType = xlColumnClustered
   
With ActiveChart
        .HasLegend = False
        .Axes(xlCategory).CategoryType = xlCategoryScale
End With
Alex

TOP

本帖最後由 alexliou 於 2012-4-24 17:48 編輯

另外一種設顏色的方法

n = Range("A1").End(xlDown).Row
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("A1:E" & n)
ActiveChart.ChartType = xlStockOHLC
   
ActiveChart.SeriesCollection.Add Source:=Range("F2:F" & n)   '不包含標題列 要從2開始
ActiveChart.SeriesCollection(5).ChartType = xlColumnClustered
   
With ActiveChart
        .HasLegend = False
        .Axes(xlCategory).CategoryType = xlCategoryScale
End With
   
With ActiveChart.ChartGroups(2)      '注意, ChartGroup在插入成交量直條後變成2了
'如果在插入成交量直條前則要改為1, the sequence of code matters         
            .UpBars.Interior.Color = RGB(255, 0, 0)
            .DownBars.Interior.Color = RGB(0, 32, 96)
End With
Alex

TOP

本帖最後由 alexliou 於 2012-4-24 18:54 編輯

回復 5# c_c_lai
要增加5MA, 20MA, 50MA就和把成交量加上去一樣
可利用 SeriesCollection.Add 方法
假設5MA, 20MA, 50MA分別在H, I, J 欄

ActiveChart.SeriesCollection.Add Source:=Range("H2:J" & totalrows)
ActiveChart.SeriesCollection(6).ChartType = xlLine
ActiveChart.SeriesCollection(7).ChartType = xlLine
ActiveChart.SeriesCollection(8).ChartType = xlLine

資料序列6,7,8 (即5MA, 20MA, 50MA) 會與資料序列5(成交量)共用副座標軸
但5MA, 20MA, 50MA的刻度應與股價一致
所以需將副座標軸的刻度與主座標軸的刻度設為相同  
缺點是當成交量與股價的規模差太多時  
圖會看起來很奇怪 (所以成交量要取適當的單位, 讓它的值和股價不會差太多)
但我還找不出方法讓5MA, 20MA, 50MA與股價漲跌圖共用同一座標軸
Alex

TOP

本帖最後由 alexliou 於 2012-4-25 08:24 編輯

回復 11# c_c_lai
1.  先提醒一下
.SeriesCollection.Add Source:=Range("統計圖表!$H$1:統計圖表!$J$" & totalRows)
.SeriesCollection.Add Source:=Range("統計圖表!$G$1:統計圖表!$G$" & totalRows)
這兩行的$H$1和$G$1 要改為 $H$2和$G$2, 要不然會造成和股價資料的不Match
C2會對應到H1和G1
這是因為用  .SeriesCollection.Add 方法時, 它不會幫你考慮到標題列

2.  在這個問題裡, 總共有三個 ChartGroups
第一個是股價開高收低的 漲跌圖 (其實也是折線圖的延伸)
第二個是5MA, 20MA, 60MA的折線圖
第三個是成交量的直條圖
(在成交量直條圖加入後, 直條圖變chartgroups(1), 漲跌圖變chartgroups(2), 折線圖變chartgroups(3),
我猜測 Excel給不同的圖形Type指定不同的優先順序)
       
如果漲跌圖和折線圖如果能共用一個數值座標軸, 而成交量用副座標軸, 那這個問題就算完美解決了       
但我試了幾次, 漲跌圖組一定要獨用一個數值座標軸 (把別的圖組指定使用漲跌圖組的座標軸都會發生錯誤訊息)       
所以均線圖組只能和成交量圖組共用一個座標軸
但這兩組資料的數值大小差異很大
而且均線圖組的座標軸刻度還要和漲跌圖組的座標軸刻度一樣 (看起來才有意義)
       
在這些限制條件下, 單用EXCEL的chart功能, 目前我找不出完美的解決方法
       
3. 另一個方法是把它拆成兩個圖, 漲跌和均線在一個圖上, 成交量在一個圖上, 然後把兩個圖上下連在一起

股票圖表.zip (27.72 KB)

Alex

TOP

股票圖表.zip (29.56 KB) 我嘗試把兩個圖表連在一起
Alex

TOP

        靜思自在 : 人生沒有所有權,只有生命的使用權。
返回列表 上一主題