Board logo

標題: [發問] 如何在股價圖下方應用 VBA 增列一拉霸? [打印本頁]

作者: c_c_lai    時間: 2012-5-13 18:35     標題: 如何在股價圖下方應用 VBA 增列一拉霸?

請教諸位先進,如何能在股價圖下方 (如附圖) 應用 VBA 語法來增列一拉霸 (ScrollBar)?
,先前 GBKEE 版大有個範本給我,但是拿來應用在此處卻不成功,
光是  .ScrollBar1.Min = 1  的宣告就無疾而終,更何況接下去了,
要怪只能怪自個兒功力不行!  附上檔案,謝謝諸位先進指導!
[attach]10931[/attach]
[attach]10932[/attach]
作者: f3202    時間: 2012-5-14 08:35

回復 1# c_c_lai
參考教學

    http://davidpu.pixnet.net/blog/post/25682509-%E8%A3%BD%E4%BD%9C%E5%8F%AF%E6%8D%B2%E5%8B%95%E5%92%8C%E7%B8%AE%E6%94%BE%E7%9A%84-excel-%E8%82%A1%E7%A5%A8%E5%9C%96-(%E4%BA%8C)---
作者: c_c_lai    時間: 2012-5-14 09:40

回復 2# f3202
謝謝您!
因為我的每張圖表都是動態產生的,所以我才想在每個圖表下方均各自動態配置一組拉霸,而非靜態(預先就已經產生)的,
不過您提共的網站內容非常的棒,謝謝您的分享!
作者: alexliou    時間: 2012-5-14 14:21

本帖最後由 alexliou 於 2012-5-14 14:31 編輯

回復 3# c_c_lai
製作 Scrolling Chart時
重點是把ScrollBar的Value 和圖表的資料來源的位置連在一起

當ScrollBar 的Change事件發生時
圖表就必須將資料來源重設一次

附件中檔案有一個利用長短均線值來決定買賣訊號的K線圖,
其中有兩個重點:
1. 因為資料量很多, 都放在一張圖裡會顯得很擁擠, 所以一張圖裡限定只放150根K棒
    K線圖下設計了一個捲軸, 讓使用者可以捲動捲軸來檢視不同時期的資料
2. 當有買賣訊號出現時, K棒上會出現"買進"或"賣出"的標籤
    但當捲軸移動時,這些標籤也要跟著移動
作者: alexliou    時間: 2012-5-14 15:56

另一種版本
圖停留在WorkSheet中
差別在Scroll Event Handler 中加入某些環境變數的設定
作者: c_c_lai    時間: 2012-5-14 16:55

回復 4# alexliou
Alex 兄,
許久沒聯絡了,謝謝您的分享,受益良多,
裡頭�埵酗ˋ貜熙B裡方法,蠻值得探討的,
這也是我近月來開始接觸 Excel 及 VBA 很棒的臨床實驗,
在此言謝了!
(請教您'長均線'是回溯多久,您是怎麼處裡數據的?)
作者: c_c_lai    時間: 2012-5-14 18:18

回復 5# alexliou
我把 DataLabel 小改了一下,效果還不錯,請參考:
  1.             If .DataLabel.Text = "多單平倉" Or .DataLabel.Text = "賣出空單" Then
  2.                 .DataLabel.Text = .DataLabel.Text & Chr(10) & Format(Cells(i, 5).Value, "###0")      ' ********* 小改了一下 **********
  3.                 ActiveChart.SeriesCollection(4).Points(i - StartKBarRow + 1).MarkerStyle = xlMarkerStyleStar   
  4.                 ActiveChart.SeriesCollection(4).Points(i - StartKBarRow + 1).MarkerSize = 10
  5.                 .DataLabel.position = XlDataLabelPosition.xlLabelPositionBelow
  6.             ElseIf .DataLabel.Text = "空單平倉" Or .DataLabel.Text = "買進多單" Then
  7.                 .DataLabel.Text = .DataLabel.Text & Chr(10) & Format(Cells(i, 5).Value, "###0")      ' ********* 小改了一下 **********
  8.                 ActiveChart.SeriesCollection(4).Points(i - StartKBarRow + 1).MarkerStyle = xlMarkerStyleTriangle
  9.                 ActiveChart.SeriesCollection(4).Points(i - StartKBarRow + 1).MarkerSize = 8
  10.                 .DataLabel.position = XlDataLabelPosition.xlLabelPositionAbove
  11.             End If
複製代碼

作者: alexliou    時間: 2012-5-14 20:52

本帖最後由 alexliou 於 2012-5-14 20:59 編輯

回復 6# c_c_lai
上傳的程式是整個均線策略回測器Project的一部份
它的功能僅處理繪製K線圖

股價的基本資料放在Access 資料庫裡    (也是靠VBA從網路上擷取而來)
可以根據某個UserForm 或 某些Cell的內容決定要Load
哪一個商品  哪一段期間的資料進來
這可以用一個Sub來處理

長短期均線是根據基本資料來計算
要用多少天的移動平均 也可以根據某個UserForm 或 某些Cell的內容來決定
這個例子用的是四日和五十日(隨便設的)
移動平均的計算可以用另一個Sub來處理

買賣訊號根據移動平均線的狀況來決定
例如當短期均線上穿長期均線則產生"買進"訊號
反之則"賣出"
這可以用另一個Sub來處理
....
....
....
作者: c_c_lai    時間: 2012-5-14 21:39

回復 8# alexliou
以往在職場時常使用 PostgreSQL以及MS SQL,說真格的我還沒用過Acess,有空時我會來試試它,
目前我是將資料直接存放在Excel表單內做測試。藉由練習以了解 VBA 及 Excel 的資料處理與應用。
謝謝您的幫助,今後如有不解之處還需再來打擾您了!
作者: c_c_lai    時間: 2012-5-15 07:48

回復 8# alexliou
請問由 VBA 產生的 ScrollBar 的 Event Handler 如何命名? 例如:Private Sub ScrollBar1_Change()  ~  End Sub
但是加入 ScrollBar1_Change() 後並未起任何作用? 應該要使用 Private Sub ScrollBar???_Change()?
附上測試檔案,謝謝指教!
[attach]10952[/attach]
[attach]10953[/attach]
作者: GBKEE    時間: 2012-5-15 16:54

本帖最後由 GBKEE 於 2012-5-15 16:55 編輯

回復 10# c_c_lai
這裡可以參考
你附檔的是 表單的ScrollBar
  1. Sub 捲軸7()    '表單的ScrollBar 須指定巨集
  2.     Dim S As Object
  3.     Set S = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
  4.     MsgBox S.Name
  5.     MsgBox S.Value
  6.     MsgBox S.Max
  7. End Sub
  8. Sub 捲軸7A()    '表單的ScrollBar 須指定巨集
  9.     MsgBox ActiveSheet.Shapes(Application.Caller).OLEFormat.Object.Name
  10.     MsgBox ActiveSheet.Shapes(Application.Caller).OLEFormat.Object.Value
  11.     MsgBox ActiveSheet.Shapes(Application.Caller).OLEFormat.Object.Max
  12. End Sub
複製代碼
  1. Private Sub ScrollBar1_Change() '控制工具箱 ScrollBar1物件的程序
  2.     MsgBox ScrollBar1.Name
  3.     MsgBox ScrollBar1.Value
  4.     MsgBox ScrollBar1.Max
  5. End Sub
複製代碼
如圖


[attach]10958[/attach]
作者: alexliou    時間: 2012-5-15 19:42

本帖最後由 alexliou 於 2012-5-15 20:38 編輯

回復 10# c_c_lai
1.用VBA code 產生的 表單控制項 它的名稱是由Excel 決定的 (ex. "卷軸 7")
為了掌控這個控制項, 你最好是幫它重新命名
這可利用 .Name 屬性來達成
(ex.  .Name = "MyScrollBar1")


2. 設定此一控制項的Event Handler
這可利用 .OnAction 屬性來達成
(ex.  .OnAction =  "MySrollBar1_Change"

3. 撰寫 MyScrollBar1_Change 程序的程式碼

4. 第一步可省略, 但做了會使一致性(控制項的名稱和它的Event Handler 名稱)提高
你可把 .Name = "MyScrollBar1" 那行 Mark掉
程式可以運作
只不過 "捲軸 x"的事件處理器是 MyScrollBar1_Change
兩者名稱不一致

5. ScrollBar 有兩種  可以是表單控制項或是Active X 控制項
樓上GBKEE大大有Demo
兩者用VBA Code建立與處理方法不同
你用的是表單控制項
作者: c_c_lai    時間: 2012-5-15 22:04

回復 11# GBKEE
回復 12# alexliou
謝謝兩位的幫忙,這兩天我上了國外網站收尋資料,找到了一篇還不錯,如下:
  1. Sheet1.ScrollBars.Add(624763.5, 4271616, 5095730.25, 189166.5).Select

  2. With Selection
  3.     .Value = 60
  4.     .Min = SMin
  5.     .Max = SMax
  6.     .SmallChange = 1
  7.     .LargeChange = 1
  8.     .LinkedCell = "Sheet1!$O$5"
  9.     .Display3DShading = True
  10.      
  11.     With .ShapeRange
  12.         .Left = 0
  13.         .Width = 680.32
  14.         .Top = 0
  15.         .Height = 15
  16.     End With
  17.      
  18.     .OnAction = "ScrollBarChange"
  19. End With
複製代碼
但是我卻鑽進了死胡同  .OnAction = "ScrollBarChange"  老是告訴我無法使用此巨集,
百思不解之下才來求援,結果是 Alex兄叫我使用 .OnAction = "工作表1.ScrollBarChange"  ,
便迎刃而解了。 就差別在必須加上 "工作表1."字樣才能正常運作。謝謝您們!
另外再請教,在 ThisWorkbook 上頭已經宣告了 Public 型態,理論上它應屬於 Global,
為何在"工作表1"內卻無法取得該等變數內容值呢?
作者: alexliou    時間: 2012-5-16 02:17

本帖最後由 alexliou 於 2012-5-16 03:09 編輯

回復 13# c_c_lai
那些附屬在物件(如ThisWorkBook, 工作表1, .......)下的變數或程序
即使宣告為Public , 要去存取或呼叫,  需透過物件的階層  
如Thisworkbook.VariableA, 工作表1.ScrollBarChange,.....

但在模組(Module)中宣告的變數或程序
如宣告為Public, 即使是在Module外取用或呼叫
也不用加上模組的名稱

像你前述的問題
如果把ScrollBarChange 程序 放在模組表1中
並把它宣告為Public (這裡不宣告也行  此情形是特例)
那你使用   .OnAction = "ScrollBarChange" 也會work

工作表上的控制項的Event Handler 通常會放在附屬於工作表的程序裡
因為同一類別的控制項可能會在不同的工作表中出現
如果能確保每個控制項稱都不同名
Event Handlers全都放在模組表裡亦可
作者: c_c_lai    時間: 2012-5-16 07:34

回復 14# alexliou
我會再實地演練多次以瞭解它們佊此間互動關聯的, 謝謝您!
依您所言,您所有資料都直接由DDE匯入到Acess,那線上您只看券商的圖表,
Excel 上的統計圖表只是來當作歷史資料參考依據了, 或是兩者皆儲存,同步參考?
作者: alexliou    時間: 2012-5-16 10:07

回復 15# c_c_lai
我的Access 資料庫中所存的都是歷史資料
資料源並非券商的DDE

但在需要即時交易資料的狀況下
券商的DDE資料源則是個不錯的選擇
至少跟其他一般免費的資料源(如交易所的網頁)
它的穩定性和即時性(更新頻率)都較佳
作者: c_c_lai    時間: 2012-5-20 13:30

本帖最後由 c_c_lai 於 2012-5-21 10:15 編輯

回復 16# alexliou
目前我的 ScrollBar 是由VBA動態產生的,亦即當進入(啟動) Excel表單,該系統即自動產生一ScrollBar,
Sheets("統計圖表").ScrollBars.Add(Cells(20, 1).Left, Cells(20, 1).Top, 879, Rows(1).Height).Select
當離開Excel時,又自動將它刪除掉。
我的提問是:
我想能將該動態產生的ScrollBar加上背景或者是前景顏色,如此比較顯著,否者使用者會看不清ScrollBar在哪裡,
因為VBA產生的ScrollBar的顏色是Default值,不知道可不可以這麼做?   又,               
.InvertIfNegative = True
.InvertColor = RGB(255, 124, 128)                     
只能應用在柱狀圖,我在想如果是 xlLine 型態時,當表列數值為負值時,有否將其顯示之顏色更變成橘紅色,
正值時則選擇其它顏色,不知能否突破?
謝謝指導!
[attach]11076[/attach]
作者: alexliou    時間: 2012-5-22 19:34

本帖最後由 alexliou 於 2012-5-22 19:39 編輯

回復 17# c_c_lai
先回答你有關於ScrollBar 顏色的問題

1. 前面說過  工作表可使用的控制項可分兩種:
表單控制項和ActiveX控制項
在不使用VBA來自動建立ScrollBar控制項的狀況下
也就是在工作表環境中  我們選擇[開發人員] > [插入]時
就可以發現 EXCEL提供兩種選擇 : 表單控制項和ActiveX控制項
而且表單控制項的屬性較少  
ActiveX控制項的屬性選擇較多 (當Mouse 在ActiveX控制項上時按右鍵, 你會發現多了一個[內容]標籤)
這兩種控制項在用VBA 建立時及操作時
使用的Code也不一樣
附件中用VBA code 建立了兩種不同的ScrollBar控制項 敬請參考

[attach]11104[/attach]
2. 表單控制項的ScrollBar 並無BackColor 和 ForeColor等屬性
所以無法改變它的顏色
如果你要讓ScrollBar 有顏色
就只能使用ActiveX控制項ScrollBar了
它的BackColor屬性可以調整Bar的顏色
它的ForeClor屬性可以調整Bar兩端箭頭的顏色

3. 當你用VBA Code自動建立ActiveX控制項時
會遇到一個麻煩   是它不支援中斷模式
會讓你偵錯很不方便
(但我還是比較喜歡用ActiveX控制項)

4. ActiveX控制項的名稱還有一些Tricky的地方
(你可以在VBA 的 IDE下 利用Help查ActiveX控制項)
所以盡量在設計階段時建置
而不要在程式執行階段利用VBA Code建置它
作者: alexliou    時間: 2012-5-22 19:47

本帖最後由 alexliou 於 2012-5-22 21:34 編輯

回復 17# c_c_lai

折線圖並沒直接的辦法來設定不同的顏色
也就是說  InvertIfNegative 與折線圖合用時並不會發揮作用
(線段是連接兩點, InvertIfNegtative 是針對"點")

若要處理折線圖在不同的範圍(可以是X軸, 也可以是不同的Y值)顯示不同的顏色
一般解法是把一個資料數列根據範圍拆成不同的數列
每個序列賦予不同的顏色

PS. 以上說得很簡單 但Implement起來會有新的問題發生
假設第一點的Y值是 10, 第二點的Y值是-5
你想要在0以上的線段和0以下的線段呈現不同的顏色
這樣就得人工插入一個點0 (分界點又會形成一個資料數列)
你可以朝這個方向去思考
這是一個不算小的工程
作者: c_c_lai    時間: 2012-5-22 23:01

回復 18# alexliou
Alex兄,
謝謝您,我試著在程式執行階段利用VBA Code建置它,它不僅充滿著 Tricky, 而且還 Difficult to manage,
所以我還是做個乖寶寶使用原本的 ScrollBar 比較親和性也不會作怪,雖然沒有 BackColor & ForeColor。
Anyway 還是要向您說聲謝謝囉!
作者: clietj37    時間: 2014-4-30 11:20

c_c_lai大
想請問您這套分析系統可否分享,
作為小弟系統建置的參考用呢
[email protected]




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