標題:
為什麼我的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
慚愧 是我那一篇寫錯了 ,已更正了.
Private Sub Worksheet_Calculate()
Dim startTime, stopTime
Dim Tr As String, Time_Step As Date
Time_Step = #12:05:00 AM# '設定間隔時間: 5分鐘->300秒
'Time_Step = #12:00:01 AM# '設定間隔時間: 1秒
startTime = Range("b1") '開盤時間, 例如: "09:00:00 AM"
stopTime = Range("d1") '收盤時間, 例如: "01:30:00 PM"
If startTime > Time Then '<- 修改這裡 尚未開盤
Exit Sub
ElseIf stopTime < Time Then '<- 修改這裡 已經收盤
Exit Sub
Else
If [C2] <> "-" And [C2] <> "###" Then '清盤的狀態, 不取其資料
'Tr = Int((nowTime - startTime) * 1440) + 30 '每差 300 秒就換一列
Tr = Int((Time - startTime) / Time_Step) + 30 ' 每5分鐘一列 從第30列開始
If Range("D" & Tr) = "" Then Range("D" & Tr) = Range("C2") '開始價
If Range("E" & Tr) = "" Or Range("C2") > Range("E" & Tr) _
Then Range("E" & Tr) = Range("C2") '最高價
If Range("F" & Tr) = "" Or Range("C2") < Range("F" & Tr) _
Then Range("F" & Tr) = Range("C2") '最低價
Range("G" & Tr) = Range("C2") '結束價
End If
End If
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的程式
Dim S As String '工作表1的 私用變數
Private Sub Worksheet_Calculate()
Application.EnableEvents = False
If S <> [G8] & [i8] And [G8] & [i8] <> "" Then
Cells(Rows.Count, "k").End(xlUp).Offset(1).Resize(1, 3) = Array(Time, [G8], [i8])
S = [G8] & [i8]
End If
Application.EnableEvents = True
End Sub
複製代碼
'Module1的程序
Sub AUTO_OPEN()
巨集1
End Sub
Private Sub 巨集1()
Dim 開盤時間 As String, 收盤時間 As String, DEE時間, Deehh As String, Deemm As String
Dim Time_Step As Date
開盤時間 = "B5"
收盤時間 = "D5"
DEE時間 = "C2"
Dim TESTTr '此變數是測試給你看的
With 工作表1
If .Range(開盤時間) > Time Then ' 尚未開盤 '等候開盤時間到執行
Application.OnTime .Range("開盤時間"), "巨集1"
ElseIf .Range(收盤時間) < Time Then ' 已經收盤 '關閉巨集
Exit Sub
End If
Time_Step = #12:05:00 AM# '設定間隔時間: 5分鐘
'Time_Step = #12:01:00 AM# '設定間隔時間: 1分鐘
' 1 = 1分鐘 ; 一天的總分鐘數 24 * 60 =1440
'1分鐘 #12:01:00 AM# * 1400
'Time_Step* 1400 = 設定間隔 ? 分鐘
'**有錯誤 Tr = Int((Time - .Range(開盤時間) ) * 1440) + 30 '每差 300 秒就換一列***
'上式應為傳回-> 間隔的總分鐘數 + 30
Tr = Int(Int((Time - .Range(開盤時間)) * 1440) / 5) '每差 300 秒 此變數是測試給你看的
TESTTr = Int((Time - .Range(開盤時間)) / Time_Step) '此變數是測試給你看的
MsgBox TESTTr = Tr '此變數是測試給你看的
If .[D2] <> "-" And .[D2] <> "###" Then '清盤的狀態, 不取其資料
Tr = Int((Time - .Range(開盤時間)) / Time_Step) + 30
' Time_Step 分鐘一列 -> 從第30列開始 **
Range("K" & Tr) = Time '加上時間
If Range("L" & Tr) = "" Then Range("L" & Tr) = Range("D2") '開始價
If Range("M" & Tr) = "" Or Range("D2") > Range("M" & Tr) _
Then Range("M" & Tr) = Range("D2") '最高價
If Range("N" & Tr) = "" Or Range("D2") < Range("N" & Tr) _
Then Range("N" & Tr) = Range("D2") '最低價
Range("O" & Tr) = Range("D2") '結束價
End If
Deehh = Mid(.Range(DEE時間), 1, 2)
Deemm = Mid(.Range(DEE時間), 3, 2)
Deemm = (Int(Deemm / (Time_Step * 1440)) + 1) * (Time_Step * 1440)
If Val(Deemm)>=60 Then
Deehh = Deehh + 1
Deemm = "00"
End If
Application.OnTime TimeSerial(Deehh, Deemm, 0) + Time_Step, "巨集1"
End With
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!
Private Sub Worksheet_Calculate()
Application.EnableEvents = False
If IsError([G8]) = 0 And IsError([i8]) = 0 Then
If S <> [G8] & [i8] And [G8] & [i8] <> "" Then
Cells(Rows.Count, "k").End(xlUp).Offset(1).Resize(1, 3) = Array(Time, [G8], [i8])
S = [G8] & [i8]
End If
End If
Application.EnableEvents = True
End Sub
複製代碼
作者:
color790
時間:
2011-11-17 13:47
謝謝版主的幫忙
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)