返回列表 上一主題 發帖

這種依時間運算的巨集要如何寫??

這種依時間運算的巨集要如何寫??

請問版上大大,如果我要寫一個巨集功能如下,要如何
A1=5
B1=3
C1=4

A2=7
B2=6
C2=9

如果我要在8:46分執行運算E1=SUM(A1:C1),8:47分執行E2=SUM(A2:C2),依此類推一直執行到13:45分,且執行完後直接寫入值,而不是公式,請問版上大大這個巨集要如何寫呢??

P.S 我之前有試過直接將公式寫在儲存格,但發現資料量大的話會拖慢執行數度,所以想跟版上大大請教一下用巨集要如何寫
上面的示範例,我實際執行的資料量比較大

本帖最後由 PKKO 於 2014-11-16 01:36 編輯

回復 1# 藍天麗池

試試看
  1. Public i As interger
  2. Sub test1()
  3.     i = 1
  4.     Application.OnTime TimeValue("08:46:00"), "test2" '特定時間呼叫程式
  5. End Sub
  6. Sub test2()
  7.     Range("e" & i) = Application.WorksheetFunction.Sum(Range("A" & i & ":" & "C" & i + 2)) '輸入值
  8.    
  9.     If Hour(Time) = 13 Then '判斷小時
  10.         If Minute(Time) = 45 Then '判斷分
  11.             MsgBox "結束" '相同時分則不再進行
  12.         Else
  13.             Application.OnTime Now + TimeValue("00:01:00"), "test2" '一分鐘後運行
  14.         End If
  15.     Else
  16.         Application.OnTime Now + TimeValue("00:01:00"), "test2" '一分鐘後運行
  17.     End If
  18.     i = i + 1
  19. End Sub
複製代碼
PKKO

TOP

本帖最後由 藍天麗池 於 2014-11-16 10:29 編輯

改.rar (101.96 KB) 回復 2# PKKO

請問大大,會出現使用者型態尚未定義是什麼意思
另外,如果我要把Range("e" & i) = Application.WorksheetFunction.Sum(Range("A" & i & ":" & "C" & i + 2))裡面的SUM函數改成=IF(ISERROR(MATCH(U2,P:P,0)),"",MATCH(U2,P:P,0)),那請問一下巨集要怎麼改??

是改成Range("e" & i) = Application.WorksheetFunction.IF(ISERROR(MATCH(Range("U" & i +1& "," & "P" &":" & "P" & "," & "0"),"",MATCH(Range("U" & i +1& "," & "P" &":" & "P" & "," & "0"))改成這樣對嗎??

請問大大Range("A" & i & ":" & "C" & i + 2)裡面的範圍部分,除了用&的的方式有沒有其他寫法,因為公式如果很多的話會&不完

抱歉大大問題有點多,不過還是謝謝你的回覆

大大我有附上我的檔案,其實我要修改的是T、W、X欄的部分,因為直接寫在儲存格上面會造成運算變慢,所以我才會想用巨集的方式試試看,如果大大能直接幫我修改就真的是感激不盡,如果不能,還帆請大大幫我解答一下上面的問題,感謝

TOP

本帖最後由 GBKEE 於 2014-11-16 15:43 編輯

回復 3# 藍天麗池

試試看
  1. Option Explicit
  2. Dim i As Integer '(短整數)資料型態
  3. 'Public i As interger => 出現使用者型態尚未定義, 正確: Integer
  4. Sub Ex()
  5.     Dim xTime As Date
  6.     If Time >= #8:46:00 AM# And Time <= #1:45:00 PM# Then
  7.         With Sheets("RTD").Cells(i + 2, "T")
  8.                     'T欄公式=IF(ISERROR(MATCH(U2,P:P,0)),"",MATCH(U2,P:P,0))
  9.             .Range("A1") = "=IF(ISERROR(MATCH(RC[1],P:P,0)),"""",MATCH(RC[1],P:P,0))"
  10.                     'U欄
  11.             .Range("B1") = IIf(Minute(Time) Mod 2 = 0, Application.Sum(Range("A1:C1")), Application.Sum(Range("A2:C2")))
  12.                     'V欄
  13.             .Range("C1") = Time
  14.                     'W欄公式=IF(ISERROR(INDIRECT("O"&T2)),"",INDIRECT("O"&T2))
  15.             .Range("D1") = "=IF(ISERROR(INDIRECT(""O""&RC[-3])),"""",INDIRECT(""O""&RC[-3]))"
  16.                     'X欄公式=IF(W2="","",IF(W2>54,-1,IF(W2<6,1,"")))
  17.             .Range("E1") = "=IF(RC[-1]="""","""",IF(RC[-1]>54,-1,IF(RC[-1]<6,1,"""")))"
  18.                     'Y欄公式=IF(ISERROR(INDIRECT("R"&T2)),Y1,INDIRECT("R"&T2))
  19.             .Range("F1") = "=IF(ISERROR(INDIRECT(""R""&RC[-5])),R[-1]C,INDIRECT(""R""&RC[-5]))"
  20.             .Resize(, 6) = .Resize(, 6).Value  '將公式回數值
  21.         End With
  22.         i = i + 1
  23.         xTime = Time + #12:01:00 AM#
  24.         If xTime <= #1:45:00 PM# Then Application.OnTime xTime, "EX"
  25.     ElseIf Time < #8:46:00 AM# Then
  26.         Application.OnTime #8:46:00 AM#, "EX"
  27.     Else
  28.         MsgBox "時間已過"
  29.     End If
  30. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 4# GBKEE

G大謝謝你的回覆,真的很感謝你,等等來試試看,謝謝

TOP

回復 4# GBKEE


    G大測試過後只有U欄和V欄有數字其他都顯示空白

TOP

回復 4# GBKEE


    G大,剛剛上述的部分我已經修改完成了,目前執行上是OK的,不過跟G大說一聲抱歉,因為我跑完後發現這不是我要的結果,想在請教一下G大,如果我要把之前的那個程式改成函數還是在儲存格上面,但當每分鐘執行完後接值寫在儲存格內(主要是要看每秒鐘的變化,但是程式執行後變成每分鐘到的時候才看的到數值),而是不公式,請問一下G大這樣要怎麼改??

TOP

回復 4# GBKEE

G大剛剛的回覆有點亂,以下才是真實版本(抱歉邏輯有點亂掉才會這樣)

    G大,剛剛上述的部分我已經修改完成了,目前執行上是OK的,不過跟G大說一聲抱歉,因為我跑完後發現這不是我要的結果

想在請教一下G大,如果我要把之前的那個程式改成函數出現在後一分鐘的儲存格,等到時間到在寫成值(主要是要看每秒鐘的變化,但是之前的程式執行後變成每分鐘到的時候才看的到數值),例如8:45分的時候將公式寫在8:46分相對應的儲存格,然後8:46分到的時候再將公式寫成值,請問一下G大這樣要怎麼改??

TOP

回復 8# 藍天麗池

是這樣嗎?
  1. With Sheets("RTD").Cells(i + 2, "T").Resize(, 7)
  2.             .Offset(-1).Value = .Offset(-1).Value '上一列:將公式回數值
  3.             
  4.                     'T欄公式=IF(ISERROR(MATCH(U2,P:P,0)),"",MATCH(U2,P:P,0))
  5.             .Range("A1") = "=IF(ISERROR(MATCH(RC[1],P:P,0)),"""",MATCH(RC[1],P:P,0))"
  6.                     'U欄
  7.             .Range("B1") = IIf(Minute(Time) Mod 2 = 0, Application.Sum(Range("A1:C1")), Application.Sum(Range("A2:C2")))
  8.                     'V欄
  9.             .Range("C1") = Time
  10.                     'W欄公式=IF(ISERROR(INDIRECT("O"&T2)),"",INDIRECT("O"&T2))
  11.             .Range("D1") = "=IF(ISERROR(INDIRECT(""O""&RC[-3])),"""",INDIRECT(""O""&RC[-3]))"
  12.                     'X欄公式=IF(W2="","",IF(W2>54,-1,IF(W2<6,1,"")))
  13.             .Range("E1") = "=IF(RC[-1]="""","""",IF(RC[-1]>54,-1,IF(RC[-1]<6,1,"""")))"
  14.                     'Y欄公式=IF(ISERROR(INDIRECT("R"&T2)),Y1,INDIRECT("R"&T2))
  15.             .Range("F1") = "=IF(ISERROR(INDIRECT(""R""&RC[-5])),R[-1]C,INDIRECT(""R""&RC[-5]))"
  16.                     'Z欄公式=IF(ISERROR(Y2-Y1),"",Y2-Y1)
  17.             .Range("G1") = "=IF(ISERROR(RC[-1]-R[-1]C[-1]),"""",RC[-1]-R[-1]C[-1])"
  18.            
  19.         End With
  20.         
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 9# GBKEE

G大真的很謝謝你,這樣OK了

TOP

        靜思自在 : 修行要繫緣修心,藉事練心,隨處養心。
返回列表 上一主題