Board logo

標題: 為什麼我的Excel 不會動 ?? [打印本頁]

作者: color790    時間: 2011-11-11 17:08     標題: 為什麼我的Excel 不會動 ??

本帖最後由 color790 於 2011-11-11 17:29 編輯

問一個很粗淺的問題.....(不過我快被搞瘋了)

主要是想用版主GBKEE 這一段程式 http://forum.twbts.com/thread-4188-1-1.html
只是都無法動,所以找了以下最簡單的程式來試試結果也不行,
Private Sub Worksheet_Calculate()
Range("b1").End(xlDown).Offset(1) = Range("a1")
End Sub
意思應該是[A1]如果變動,在B欄會記錄下來, 可是為什麼我的Excel 不會動 ??
程式寫在工作表1也不會動, ThisWorkbook也不會動
[attach]8501[/attach]
作者: Hsieh    時間: 2011-11-11 18:01

回復 1# color790


    Worksheet_Calculate是工作表重算事件
必須是工作表內有公式存在
當公式儲存格有重算動作才會觸發
作者: color790    時間: 2011-11-11 18:27

剛有重試一下, 我用DDE, 數據確定會動, 但B欄卻都不會動
還是說要設定哪邊, 真奇怪
作者: GBKEE    時間: 2011-11-11 18:30

本帖最後由 GBKEE 於 2011-11-11 18:36 編輯

回復 1# color790
Range("b1").End(xlDown).Offset(1) = Range("a1").Address
這語法基本上沒有錯誤的   但如果 B欄是完全沒有資料,或是直到最後一列才有資料
Range("b1").End(xlDown).Offset(1) ->會是工作表範圍之外 ,你的附檔就有錯誤的

例在 b1 以下任一列輸入 資料 就沒錯誤了

Range("b1").End(xlDown).Offset(1) = "=" & Range("a1").Address  
公式才會引發 Worksheet_Calculate 這事件
作者: color790    時間: 2011-11-11 18:47

可以了.... 結果真的很奇怪
好像要在巨集設定裡, 點選 "啟用所有巨集(......) "
以前都點選 "除了經數位簽章的巨集外,停用所有巨集" , 開檔案按啟用巨集就可使用巨集
這個居然不行.....
不過總算可用了, 晚一點再來試試GBKEE的程式
謝謝大家的幫忙, 如果有問題,再麻煩各位幫忙解答...... ^^
作者: color790    時間: 2011-11-11 20:21

HI~GBKEE版主
剛用你寫的程式, 又不會動了
可否麻煩你幫我看一下(我有修改時間及一點點其他的)
[attach]8502[/attach]
作者: GBKEE    時間: 2011-11-11 20:58

本帖最後由 GBKEE 於 2011-11-11 21:00 編輯

回復 6# color790
有反應的
startTime = Range("b1") '開盤時間, 例如: "09:00:00 AM"
stopTime = Range("d1")  '收盤時間, 例如: "01:30:00 PM"
你測試時間需在startTime - stopTime 時間內 ,可調整 B1,D1
如圖設立中斷點  , 工作表中選擇有公式的儲存格  先按 F2  再按 Enter 便可見動作了
之後在VBA 視窗 按 F8 逐步執行


[attach]8503[/attach]
作者: color790    時間: 2011-11-11 21:22

版主,我不太懂
我D1現在是設 10:00:00 PM ,  B1是09:00:00 AM
由於是抓外國的DDE所以目前都會動, 也設立中斷點, 也按 F2  再按 Enter
但在VBA視窗按F8都是到尚未開盤下一行就又迴圈了, 這是為什麼?
作者: GBKEE    時間: 2011-11-12 06:46

回復 8# color790
慚愧 是我那一篇寫錯了 ,已更正了.
  1. Private Sub Worksheet_Calculate()
  2.     Dim startTime, stopTime
  3.     Dim Tr As String, Time_Step As Date
  4.     Time_Step = #12:05:00 AM#     '設定間隔時間: 5分鐘->300秒
  5.     'Time_Step = #12:00:01 AM#     '設定間隔時間: 1秒
  6.     startTime = Range("b1") '開盤時間, 例如: "09:00:00 AM"
  7.     stopTime = Range("d1")  '收盤時間, 例如: "01:30:00 PM"
  8.     If startTime > Time Then  '<- 修改這裡  尚未開盤      
  9.         Exit Sub
  10.     ElseIf stopTime < Time Then '<- 修改這裡   已經收盤
  11.         Exit Sub
  12.     Else
  13.         If [C2] <> "-" And [C2] <> "###" Then   '清盤的狀態, 不取其資料
  14.             'Tr = Int((nowTime - startTime) * 1440) + 30  '每差 300 秒就換一列
  15.             Tr = Int((Time - startTime) / Time_Step) + 30 ' 每5分鐘一列 從第30列開始
  16.             If Range("D" & Tr) = "" Then Range("D" & Tr) = Range("C2")  '開始價
  17.             If Range("E" & Tr) = "" Or Range("C2") > Range("E" & Tr) _
  18.                 Then Range("E" & Tr) = Range("C2")                      '最高價
  19.             If Range("F" & Tr) = "" Or Range("C2") < Range("F" & Tr) _
  20.                 Then Range("F" & Tr) = Range("C2")                      '最低價
  21.             Range("G" & Tr) = Range("C2")                               '結束價
  22.         End If
  23.     End If
  24. End Sub
複製代碼

作者: color790    時間: 2011-11-12 10:35

版主不要這麼說, 你肯幫忙已經很好了....
由於現在是假日沒有DDE來源可用, 禮拜一再來完整的使用看看,
如果用版主的方法(設中斷點,按F8測試), 會在這一行停止
  Tr = Int((Time - startTime) / Time_Step) + 30
換成另一行OK
Tr = Int((Time - startTime) * 1440) +30
作者: color790    時間: 2011-11-14 22:01

HI~版主
已經可以用了, 謝謝幫忙~
另外再請問一下(雖然原來的做法也可以)
1.如果使用DDE上的時間, 要怎麼做到每幾分鐘抓一次資料(因為有時候會跟電腦的時間不太一樣)
DDE時間格式是類似像134459 --->13:44:59
2.DDE一直在跳動,可以用使累積量記錄嗎?比如記錄累積一分鐘的買賣量
3.Private Sub Worksheet_Calculate() 有辦法在其中一兩個儲存格發生變動才觸發vb嗎?
作者: GBKEE    時間: 2011-11-15 08:13

本帖最後由 GBKEE 於 2011-11-15 08:20 編輯

回復 11# color790
請附上檔案範例 看看
作者: color790    時間: 2011-11-15 09:16

[attach]8538[/attach]
hi~版主, 不好意思, 有2個想法想請你幫忙
1. 時間是想以dde上的時間為主,每5分鐘(或1分鐘) 記錄價格,時間,最高價,最低價,開始價,結束價及累積[G8] & [I8]的量

2. 另一個想法是想[G8] & [I8]發生變化, 才記錄時間,價格
作者: GBKEE    時間: 2011-11-15 11:37

回復 13# color790
  1. '工作表1的程式
  2. Dim S As String   '工作表1的 私用變數
  3. Private Sub Worksheet_Calculate()
  4.     Application.EnableEvents = False
  5.     If S <> [G8] & [i8] And [G8] & [i8] <> "" Then
  6.         Cells(Rows.Count, "k").End(xlUp).Offset(1).Resize(1, 3) = Array(Time, [G8], [i8])
  7.         S = [G8] & [i8]
  8.     End If
  9.     Application.EnableEvents = True
  10. End Sub
複製代碼
  1. 'Module1的程序
  2. Sub AUTO_OPEN()
  3.     巨集1
  4. End Sub
  5. Private Sub 巨集1()
  6.     Dim 開盤時間 As String, 收盤時間  As String, DEE時間, Deehh As String, Deemm As String
  7.     Dim Time_Step As Date
  8.     開盤時間 = "B5"
  9.     收盤時間 = "D5"
  10.     DEE時間 = "C2"
  11.     Dim TESTTr  '此變數是測試給你看的
  12.     With 工作表1
  13.         If .Range(開盤時間) > Time Then  ' 尚未開盤   '等候開盤時間到執行
  14.             Application.OnTime .Range("開盤時間"), "巨集1"
  15.         ElseIf .Range(收盤時間) < Time Then ' 已經收盤   '關閉巨集
  16.             Exit Sub
  17.         End If
  18.         Time_Step = #12:05:00 AM#      '設定間隔時間: 5分鐘
  19.         'Time_Step = #12:01:00 AM#     '設定間隔時間: 1分鐘
  20.          ' 1 = 1分鐘 ; 一天的總分鐘數 24 * 60 =1440
  21.           '1分鐘    #12:01:00 AM# * 1400
  22.          'Time_Step* 1400 = 設定間隔 ? 分鐘
  23.          
  24.          '**有錯誤 Tr = Int((Time - .Range(開盤時間) ) * 1440) + 30  '每差 300 秒就換一列***
  25.          '上式應為傳回->  間隔的總分鐘數 + 30
  26.            Tr = Int(Int((Time - .Range(開盤時間)) * 1440) / 5) '每差 300 秒 此變數是測試給你看的
  27.            TESTTr = Int((Time - .Range(開盤時間)) / Time_Step)  '此變數是測試給你看的
  28.            MsgBox TESTTr = Tr                                  '此變數是測試給你看的
  29.         If .[D2] <> "-" And .[D2] <> "###" Then   '清盤的狀態, 不取其資料
  30.             Tr = Int((Time - .Range(開盤時間)) / Time_Step) + 30
  31.             ' Time_Step 分鐘一列    ->  從第30列開始 **
  32.             Range("K" & Tr) = Time                '加上時間
  33.             If Range("L" & Tr) = "" Then Range("L" & Tr) = Range("D2")  '開始價
  34.             If Range("M" & Tr) = "" Or Range("D2") > Range("M" & Tr) _
  35.                 Then Range("M" & Tr) = Range("D2")                      '最高價
  36.             If Range("N" & Tr) = "" Or Range("D2") < Range("N" & Tr) _
  37.                 Then Range("N" & Tr) = Range("D2")                      '最低價
  38.             Range("O" & Tr) = Range("D2")                               '結束價
  39.         End If
  40.         Deehh = Mid(.Range(DEE時間), 1, 2)
  41.         Deemm = Mid(.Range(DEE時間), 3, 2)
  42.         Deemm = (Int(Deemm / (Time_Step * 1440)) + 1) * (Time_Step * 1440)
  43.         If Val(Deemm)>=60 Then
  44.             Deehh = Deehh + 1
  45.             Deemm = "00"
  46.         End If
  47.         Application.OnTime TimeSerial(Deehh, Deemm, 0) + Time_Step, "巨集1"
  48.     End With
  49. End Sub
複製代碼

作者: color790    時間: 2011-11-15 14:37

天啊.....太感謝你了,版主
回家再來試一下, 感恩:'(
作者: color790    時間: 2011-11-16 22:48

HI~版主, 再麻煩你一下~
第一個程式在剛打開程式時, 下面這一行會有錯誤產生
If S <> [G8] & [i8] And [G8] & [i8] <> "" Then
不過在偵錯後停止再按執行就OK了,再麻煩你一下, 謝謝版主~
作者: GBKEE    時間: 2011-11-17 06:58

回復 16# color790
你的DEE 資料為錯誤值 #REF!
  1. Private Sub Worksheet_Calculate()
  2.     Application.EnableEvents = False
  3.     If IsError([G8]) = 0 And IsError([i8]) = 0 Then
  4.         If S <> [G8] & [i8] And [G8] & [i8] <> "" Then
  5.             Cells(Rows.Count, "k").End(xlUp).Offset(1).Resize(1, 3) = Array(Time, [G8], [i8])
  6.             S = [G8] & [i8]
  7.         End If
  8.     End If
  9.     Application.EnableEvents = True
  10. End Sub
複製代碼

作者: color790    時間: 2011-11-17 13:47

謝謝版主的幫忙




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