Board logo

標題: [發問] 請問該如何用VBA自動化出股票K線圖呢? [打印本頁]

作者: j1221    時間: 2011-1-16 23:19     標題: 請問該如何用VBA自動化出股票K線圖呢?

本帖最後由 j1221 於 2011-1-16 23:50 編輯

各位前輩好,小弟又來叨擾了,這次我的問題如下:

我利用VBA先抓出我要的資料後,然後再將所抓出來的資料化成K線圖

在畫圖的部份,因為小弟不知道該怎麼寫,所以我是利用錄製巨集的功能,把巨集製作出來。

但製作好之後,當我想要重新執行一次巨集的時候,跳出對話視窗「ChartType 方法(Chart物件)失敗」

可否請問是甚麼問題,該如何解決呢?

煩請參閱附件(Module 2)

[attach]4416[/attach]
作者: skybbs    時間: 2011-1-17 18:35

Hello,

如果是在活頁簿裡的資料, 建議直接使用圖表的方式繪製就可以了.
這樣子比較簡單快速.
作者: Hsieh    時間: 2011-1-17 21:01

回復 1# j1221
先改變資料數列再設定圖表類型
  1. Sub Macro1()
  2. '
  3. ' Macro1 Macro
  4. ' Shih-Hao 在 2011/1/16 錄製的巨集
  5. '

  6. '
  7.     Charts.Add
  8.     'ActiveChart.ChartType = xlStockOHLC  '取消這行

  9.     ActiveChart.SetSourceData Source:=Sheets("76C").Range("A1:N22"), PlotBy:= _
  10.         xlColumns
  11.     ActiveChart.SeriesCollection(5).Delete
  12.     ActiveChart.SeriesCollection(5).Delete
  13.     ActiveChart.SeriesCollection(5).Delete
  14.     ActiveChart.SeriesCollection(5).Delete
  15.     ActiveChart.SeriesCollection(5).Delete
  16.     ActiveChart.SeriesCollection(1).XValues = "='76C'!R2C1:R22C1"
  17.     ActiveChart.SeriesCollection(2).XValues = "='76C'!R2C1:R22C1"
  18.     ActiveChart.SeriesCollection(3).XValues = "='76C'!R2C1:R22C1"
  19.     ActiveChart.SeriesCollection(4).XValues = "='76C'!R2C1:R22C1"
  20.     ActiveChart.Location Where:=xlLocationAsObject, Name:="76C"
  21.     With ActiveChart
  22.         .HasTitle = False
  23.         .Axes(xlCategory, xlPrimary).HasTitle = False
  24.         .Axes(xlValue, xlPrimary).HasTitle = False
  25.         .ChartType = xlStockOHLC   '這裡才改變類型
  26.     End With
  27.     ActiveChart.HasLegend = False
  28.     Windows("test1.xls").SmallScroll Down:=7
  29.     ActiveSheet.Shapes(1).IncrementLeft -168.75
  30.     ActiveSheet.Shapes(1).IncrementTop 269.25
  31.     Windows("test1.xls").SmallScroll Down:=6
  32.     ActiveSheet.Shapes(1).ScaleWidth 1.53, msoFalse, msoScaleFromTopLeft
  33.     ActiveSheet.Shapes(1).ScaleHeight 1.36, msoFalse, msoScaleFromTopLeft
  34.     ActiveChart.PlotArea.Select
  35.     With Selection.Border
  36.         .ColorIndex = 16
  37.         .Weight = xlThin
  38.         .LineStyle = xlContinuous
  39.     End With
  40.     With Selection.Interior
  41.         .ColorIndex = 2
  42.         .PatternColorIndex = 1
  43.         .Pattern = xlSolid
  44.     End With
  45.     With Selection.Border
  46.         .ColorIndex = 16
  47.         .Weight = xlThin
  48.         .LineStyle = xlContinuous
  49.     End With
  50.     With Selection.Interior
  51.         .ColorIndex = 40
  52.         .PatternColorIndex = 1
  53.         .Pattern = xlSolid
  54.     End With
  55.     ActiveChart.Axes(xlCategory).Select
  56.     Selection.TickLabels.NumberFormatLocal = "yyyy-mm-dd"

  57. End Sub
複製代碼

作者: j1221    時間: 2011-1-18 12:16

感激Hsieh板主,受教了....

但可否請問您,為何要「先改變資料數列再設定圖表類型」才對呢?

再次感謝
作者: Hsieh    時間: 2011-1-18 13:35

回復 4# j1221


    k線圖資料必需依序排列
你若直接用所有欄位直接製圖會以預設的直調圖呈現
若直接轉換類型,EXCEL也會出現警告視窗,要求變更資料範圍
作者: j1221    時間: 2011-1-20 11:58

回復 5# Hsieh


Hsieh大感恩,又學到一樣東西。可否再請教您如何指定工作表的問題。我先定義了兩個變數c 和 op,c 為數字,op為文字
。然後我利用 ThisWorkbook.ActiveSheet.Name = c & op 命名目前的工作表。但知後我想要再指定這個工作表時該如何指定?

我是用 Sheets("c & op").Cells(i, 1)....
   
煩請您參考附件,在Module 1的列32,感謝。:D

[attach]4465[/attach]
作者: Hsieh    時間: 2011-1-20 12:20

回復 6# j1221


    Sheets(c & op).Cells(i, 1).PasteSpecial
作者: j1221    時間: 2011-1-20 12:34

回復 7# Hsieh

Hsieh大抱歉,請問在繪製圖表裡面的部份該怎麼改?比如說這個?

ActiveChart.SeriesCollection(1).XValues = "='c & op'!R2C1:R22C1"
作者: Hsieh    時間: 2011-1-20 12:39

回復 8# j1221


    ActiveChart.SeriesCollection(1).XValues = "='" & c & op & "'!R2C1:R22C1"
作者: j1221    時間: 2011-1-20 13:08

回復 9# Hsieh


Hsieh大,抱歉又有問題了.....這次問題出在我跑完d=1,進入d=2時。在

    With Sheets("data")
                Cells(1, 1).EntireRow.Select
                Selection.Copy
                Sheets.Add After:=Sheets("data")
                ActiveSheet.Cells(1, 1).PasteSpecial
                ThisWorkbook.ActiveSheet.Name = c & op
   End With

出現「Class Range的Select 方法失敗」的訊息,為什麼第一圈沒有問題,第二圈的時候就會出來選擇錯誤??感謝您
作者: Hsieh    時間: 2011-1-20 16:24

回復 10# j1221
應該是SELECT的問題
  1.     With Sheets("data")
  2.                 .Cells(1, 1).EntireRow.Copy
  3.                 Sheets.Add After:=Sheets("data")
  4.                 ActiveSheet.Cells(1, 1).PasteSpecial
  5.                 ThisWorkbook.ActiveSheet.Name = c & op
  6.    End With
複製代碼

作者: j1221    時間: 2011-1-21 12:13

回復 11# Hsieh


    感激大大....一切OK了!!:D
作者: j1221    時間: 2011-1-22 11:39

回復 11# Hsieh


Hsieh大,抱歉又來打擾了....

可以使用之後,我還想再加一個「輸入和約月份」的對話框,這樣可以選擇需要挑出的月份

我是這樣寫的

    f = Application.InputBox(prompt:="請輸入合約結算月份(格式:yyyymm)")
然後在挑取資料的時候

If Sheets("data").Cells(i, 3).Value = f

可是好像excel認不出來這個 f  ,所以我無法把資料挑選出來,可否請問您為什麼嗎?

請您參考附件,感謝:D

[attach]4485[/attach]
作者: Hsieh    時間: 2011-1-22 11:47

回復 13# j1221


    Sheets("data").Cells(i, 3).Value = Val(f)
因為inputbox位指定變數型態則會以字串形態默認
所以f是一個數字組合的字串
但是,你工作表的年月是通用格式,所以被認為是數値
所以判斷式數直是不可能跟字串相等
故此將f使用VAL函數轉為數值即可




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