標題:
[發問]
關於工作表的calculate事件
[打印本頁]
作者:
lin_6219
時間:
2013-6-13 20:26
標題:
關於工作表的calculate事件
各位大大,不好意思,我這邊有個問題想懇求會的給我指點迷津,
一般來講,工作表的calculate要先在那個工作表的程式碼視窗寫上事件,
然後當公式數值改變時,就會觸發calculate事件,
若我現在要在n個(也就是不確定的工作表數),
在每個裡面都寫上一樣的calculate事件,
有辦法用一般模組或者VBA的其他功能、變數那些等等,
使他自動填入嗎?
麻煩各位了
還是這個是沒辦法用程式寫的,謝謝
作者:
stillfish00
時間:
2013-6-13 20:47
回復
1#
lin_6219
改成寫在ThisWorkbook中的SheetCalculate事件看看。
作者:
lin_6219
時間:
2013-6-13 20:50
回復
2#
stillfish00
好, 我先試看看 感謝你:)))
作者:
lin_6219
時間:
2013-6-13 21:54
回復
2#
stillfish00
我可能把我的意思表達錯了,
應該這樣講,我要執行的calculate,是要觸發它去畫動態的圖表,
但是每個工作表的資料不同,如果用SheetCalculate這個方法,
會讓任何一張工作表的公式值改變,就去觸發這個事件,
這樣會不會太耗效能,有沒有其他方法,抱歉喔,
我表達不太好,但這個問題我真的想不透。感謝
作者:
stillfish00
時間:
2013-6-14 13:33
回復
4#
lin_6219
該事件有帶參數Sh,說明是哪個工作表觸發的,
用他判斷是不是你指定的工作表觸發的應該就可以了,如下。
然後我不曉得你的動態圖表是如何達成? 一般好像都是用定義名稱去控制吧。
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Select Case Sh.Name
Case "工作表11", "工作表12"
MsgBox "畫動態的圖表??"
Case Else
MsgBox "什麼都不做"
End Select
End Sub
複製代碼
作者:
lin_6219
時間:
2013-6-14 18:11
回復
5#
stillfish00
恩恩,好的,我先試看看,非常感謝你的解釋,謝謝。
作者:
c_c_lai
時間:
2013-6-15 07:52
本帖最後由 c_c_lai 於 2013-6-15 07:54 編輯
回復
1#
lin_6219
看了你數日的討論成果,還是給你個提示吧,要加油呦!
思考問題要多方的驗證及觀察,以期能切入到真正的問題核心。
觸發執行畫動態的圖表:
Option Explicit
Dim timerEnabled As Boolean ' 判定開啟本工作表單的時段是否為開盤前啟動。
Private Sub Workbook_Open()
KChartWithVolume ' 以你自己的 K 圖做為例證
' 每逢星期六、日 除外, 自動啟動計時器
If Weekday(Date, 2) <= 5 Then Call timerStart
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.inProcess", , False
Me.Save
End Sub
Sub timerStart()
If timerEnabled Then
' 第二次(含)以後均以設定之 "間隔時段" 來處理執行序的作業。 (本例以每五分鐘執行一次)
Application.OnTime (Now + TimeValue("00:05:00")), "ThisWorkbook.inProcess"
Else
timerEnabled = True
If (TimeValue(Now) <= TimeValue("08:45:00")) Then
Application.OnTime (TimeValue("08:45:00")), "ThisWorkbook.inProcess"
Else
' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.inProcess"
End If
End If
End Sub
Private Sub inProcess()
On Error Resume Next
If (TimeValue(Now) < TimeValue("08:45:00") Or TimeValue(Now) > TimeValue("13:46:01")) Then Exit Sub
' 盤中處理,將資料匯入寫入工作表單內儲存。
With Sheets("主畫面")
' . . . . .
' . . . . . (寫入DDE匯入之相關資料))
' . . . . .
End With
Call getKLastMove() ' 觸發執行畫動態的圖表
Call timerStart
End Sub
Sub getKLastMove()
Dim totalRows As Long
With Worksheets("主畫面")
.Select
totalRows = Worksheets("繪圖資料").Range("A" & .Rows.Count).End(xlUp).Row
ActiveSheet.ChartObjects.Select
With ActiveChart
.SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$E$" & CStr(totalRows) & ", 繪圖資料!$G$2:繪圖資料!$G$" & CStr(totalRows) & _
", 繪圖資料!$F$2:繪圖資料!$F$" & CStr(totalRows))
.SeriesCollection(1).Name = "=繪圖資料!$B$1" ' 開盤價
.SeriesCollection(2).Name = "=繪圖資料!$C$1" ' 最高價
.SeriesCollection(3).Name = "=繪圖資料!$D$1" ' 最低價
.SeriesCollection(4).Name = "=繪圖資料!$E$1" ' 收盤價 (成交價)
.SeriesCollection(5).Name = "=繪圖資料!$G$1" ' 移動平均線
.SeriesCollection(5).Name = "成交量" ' 成交金額
End With
End With
End Sub
Sub KChartWithVolume() ' K線圖與成交量圖放在同一圖表
' . . . . .
' . . . . . (K線圖與成交量圖)
' . . . . .
End Sub
複製代碼
多跟學校教授及同學們相互請益。
作者:
lin_6219
時間:
2013-6-15 15:23
回復
7#
c_c_lai
恩恩,真的很感謝你喔,我目前學VBA才六七個月吧,
只對基礎概念略知,但還不是非常明白,
目前我的這個問題算是解決了,
但再呼叫圖表上還有很大的問題,
我先再好好思考研究,非常感謝你的分享,我會努力的。
作者:
c_c_lai
時間:
2013-6-15 17:40
回復
8#
lin_6219
首先要先去瞭解及熟悉 F8 (Debug) 的應用,
透過 F8 你再去追蹤 Local Variables 值的變化,
以及利用 "監看式" 視窗 "運算式" 觀察目前之
Runtime Values, 如此你可以從中去體會程式
完整執行過程、以及問題發生錯誤的原因。
作者:
lin_6219
時間:
2013-6-15 18:22
回復
9#
c_c_lai
恩恩, 好的 感謝你:)))
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)