標題:
[發問]
如何在股價圖下方應用 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 小改了一下,效果還不錯,請參考:
If .DataLabel.Text = "多單平倉" Or .DataLabel.Text = "賣出空單" Then
.DataLabel.Text = .DataLabel.Text & Chr(10) & Format(Cells(i, 5).Value, "###0") ' ********* 小改了一下 **********
ActiveChart.SeriesCollection(4).Points(i - StartKBarRow + 1).MarkerStyle = xlMarkerStyleStar
ActiveChart.SeriesCollection(4).Points(i - StartKBarRow + 1).MarkerSize = 10
.DataLabel.position = XlDataLabelPosition.xlLabelPositionBelow
ElseIf .DataLabel.Text = "空單平倉" Or .DataLabel.Text = "買進多單" Then
.DataLabel.Text = .DataLabel.Text & Chr(10) & Format(Cells(i, 5).Value, "###0") ' ********* 小改了一下 **********
ActiveChart.SeriesCollection(4).Points(i - StartKBarRow + 1).MarkerStyle = xlMarkerStyleTriangle
ActiveChart.SeriesCollection(4).Points(i - StartKBarRow + 1).MarkerSize = 8
.DataLabel.position = XlDataLabelPosition.xlLabelPositionAbove
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
Sub 捲軸7() '表單的ScrollBar 須指定巨集
Dim S As Object
Set S = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
MsgBox S.Name
MsgBox S.Value
MsgBox S.Max
End Sub
Sub 捲軸7A() '表單的ScrollBar 須指定巨集
MsgBox ActiveSheet.Shapes(Application.Caller).OLEFormat.Object.Name
MsgBox ActiveSheet.Shapes(Application.Caller).OLEFormat.Object.Value
MsgBox ActiveSheet.Shapes(Application.Caller).OLEFormat.Object.Max
End Sub
複製代碼
Private Sub ScrollBar1_Change() '控制工具箱 ScrollBar1物件的程序
MsgBox ScrollBar1.Name
MsgBox ScrollBar1.Value
MsgBox ScrollBar1.Max
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
謝謝兩位的幫忙,這兩天我上了國外網站收尋資料,找到了一篇還不錯,如下:
Sheet1.ScrollBars.Add(624763.5, 4271616, 5095730.25, 189166.5).Select
With Selection
.Value = 60
.Min = SMin
.Max = SMax
.SmallChange = 1
.LargeChange = 1
.LinkedCell = "Sheet1!$O$5"
.Display3DShading = True
With .ShapeRange
.Left = 0
.Width = 680.32
.Top = 0
.Height = 15
End With
.OnAction = "ScrollBarChange"
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/)