返回列表 上一主題 發帖

為什麼我的Excel 不會動 ??

本帖最後由 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 這事件

TOP

本帖最後由 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 逐步執行


TOP

回復 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
複製代碼

TOP

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

回復 11# color790
請附上檔案範例 看看

TOP

回復 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
複製代碼

TOP

回復 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
複製代碼

TOP

        靜思自在 : 君子如水,隨方就圓,無處不自在。
返回列表 上一主題