Board logo

標題: [發問] 關於工作表的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,說明是哪個工作表觸發的,
用他判斷是不是你指定的工作表觸發的應該就可以了,如下。
然後我不曉得你的動態圖表是如何達成? 一般好像都是用定義名稱去控制吧。
  1. Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
  2.     Select Case Sh.Name
  3.     Case "工作表11", "工作表12"
  4.         MsgBox "畫動態的圖表??"
  5.     Case Else
  6.         MsgBox "什麼都不做"
  7.     End Select
  8. 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
看了你數日的討論成果,還是給你個提示吧,要加油呦!
思考問題要多方的驗證及觀察,以期能切入到真正的問題核心。
觸發執行畫動態的圖表:
  1. Option Explicit

  2. Dim timerEnabled As Boolean        '   判定開啟本工作表單的時段是否為開盤前啟動。
  3. Private Sub Workbook_Open()
  4.     KChartWithVolume                        '   以你自己的 K 圖做為例證
  5.     '   每逢星期六、日 除外, 自動啟動計時器
  6.     If Weekday(Date, 2) <= 5 Then Call timerStart
  7. End Sub

  8. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  9.     On Error Resume Next
  10.     Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.inProcess", , False
  11.     Me.Save
  12. End Sub

  13. Sub timerStart()
  14.     If timerEnabled Then
  15.         ' 第二次(含)以後均以設定之 "間隔時段" 來處理執行序的作業。 (本例以每五分鐘執行一次)
  16.         Application.OnTime (Now + TimeValue("00:05:00")), "ThisWorkbook.inProcess"
  17.     Else
  18.         timerEnabled = True
  19.         
  20.         If (TimeValue(Now) <= TimeValue("08:45:00")) Then
  21.             Application.OnTime (TimeValue("08:45:00")), "ThisWorkbook.inProcess"
  22.         Else
  23.             ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
  24.             ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  25.             Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.inProcess"
  26.         End If
  27.     End If
  28. End Sub

  29. Private Sub inProcess()
  30.     On Error Resume Next
  31.     If (TimeValue(Now) < TimeValue("08:45:00") Or TimeValue(Now) > TimeValue("13:46:01")) Then Exit Sub
  32.    
  33.     ' 盤中處理,將資料匯入寫入工作表單內儲存。

  34.     With Sheets("主畫面")
  35.         ' . . . . .
  36.         ' . . . . . (寫入DDE匯入之相關資料))
  37.         ' . . . . .
  38.     End With
  39.         
  40.     Call getKLastMove()     '  觸發執行畫動態的圖表
  41.     Call timerStart
  42. End Sub

  43. Sub getKLastMove()
  44.     Dim totalRows As Long
  45.    
  46.     With Worksheets("主畫面")
  47.         .Select
  48.         totalRows = Worksheets("繪圖資料").Range("A" & .Rows.Count).End(xlUp).Row
  49.         ActiveSheet.ChartObjects.Select
  50.         With ActiveChart
  51.             .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$E$" & CStr(totalRows) & ", 繪圖資料!$G$2:繪圖資料!$G$" & CStr(totalRows) &  _
  52.                                          ", 繪圖資料!$F$2:繪圖資料!$F$" & CStr(totalRows))
  53.             .SeriesCollection(1).Name = "=繪圖資料!$B$1"           ' 開盤價
  54.             .SeriesCollection(2).Name = "=繪圖資料!$C$1"           ' 最高價
  55.             .SeriesCollection(3).Name = "=繪圖資料!$D$1"           ' 最低價
  56.             .SeriesCollection(4).Name = "=繪圖資料!$E$1"           ' 收盤價 (成交價)
  57.             .SeriesCollection(5).Name = "=繪圖資料!$G$1"           ' 移動平均線
  58.             .SeriesCollection(5).Name = "成交量"                   ' 成交金額
  59.         End With
  60.     End With
  61. End Sub

  62. Sub KChartWithVolume()                         '  K線圖與成交量圖放在同一圖表
  63.     ' . . . . .
  64.     ' . . . . .  (K線圖與成交量圖)
  65.     ' . . . . .
  66. 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/)