Board logo

標題: 想請教-在設定的日期自動執行巨集 [打印本頁]

作者: 三寶    時間: 2010-10-18 15:00     標題: 想請教-在設定的時間自動執行巨集,VBA該如何寫?

我需要寫一個VBA,
內容很簡單,
就像下面這樣:

早上09:05:12
marco1

早上09:08:32
marco2

早上10:35:26
marco3
.
.
.
.
.
.
.
.
我巨集很多,不列出了
巨集我會自己錄
但是我寫不出"時間"的語法,
就是電腦系統時間到了,會自動執行巨集這樣子,
網路上有很多用Timer設定的方式,
講真的,我實在看不懂如何設定Timer,
好像要去算幾秒鐘是吧?然後會自動跳到下一列,
但是因為我時間不固定,
我想要隨時去改VBA裡的時間,
請教各位達人,
這該如何寫?
謝謝....
作者: oobird    時間: 2010-10-18 16:09

Application.OnTime "9:05:12", "marco1"
作者: 三寶    時間: 2010-10-18 16:33

不好意思,oobird版大,
請問這一句要放在哪裡啊?
放在marco1前面,還是放在marco1裡面?
要怎麼樣才會打開工作表後就可以自動執行呢?
感謝你....
作者: oobird    時間: 2010-10-18 16:47

Sub auto_open()
Application.OnTime "9:05:12", "marco1"
Application.OnTime "9:08:32", "marco2"
.....................................
...............................
end sub
放在module中。
作者: 三寶    時間: 2010-10-19 00:56

本帖最後由 GBKEE 於 2010-10-19 06:53 編輯

感謝oobird版大回覆,但是無法執行
以下是我測試的巨集:
Sub auto_open()
Application.OnTime "00:50:35", "marco1"
Application.OnTime "00:50:50", "marco2"
End Sub

Sub Macro1()

    Range("A1:D1").Select
    Selection.Copy
    Range("A2:D2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub


Sub Macro2()

    Range("A1:D1").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("A3:D3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

我按執行auto_open ,然後等時間到
它告訴我"找不到巨集"
我都放在同一個Module裡面,
但是它說找不到,
我如果直接按執行巨集,是可以執行的
請問為什麼找不到巨集呢?
是不是漏了什麼?
謝謝....
作者: 三寶    時間: 2010-10-19 00:58

呃....
那個Range裡面是選取的儲存格D啦,
貼到版上變成笑臉了...呵呵...
作者: GBKEE    時間: 2010-10-19 06:53

本帖最後由 GBKEE 於 2010-10-19 07:02 編輯

回復 6# 三寶
不要有   發文時下面的選項要勾選 [禁用表情]
marco1<>Macro1 你的字母顛倒了
作者: 三寶    時間: 2010-10-19 11:14

啊!!
真的...
我這豬頭,
感謝GBKEE版大細心
問題解決了,
謝謝.
作者: oobird    時間: 2010-10-19 13:36

不怪你,要怪我。
代碼不夠人性化,它應該要自己會判斷套用的!
作者: 三寶    時間: 2010-10-19 14:56

不好意思,
可以再請教一下,
如果我要加上日期,
該怎麼寫?
謝謝....
作者: 三寶    時間: 2010-10-19 15:27     標題: 想請教-在設定的日期自動執行巨集

繼上一次提問設定時間自動執行巨集之後,
感謝版主大大鼎力相助,已解決小弟的問題
想再請教,
如果我想加入"日期"的話,
該怎麼寫呢?
就是設定:
2010年10月19日,早上09:00:00
macro1
這樣.

謝謝.
作者: oobird    時間: 2010-10-19 15:31

前面加一行if data <> "某某日" then exit sub
作者: 三寶    時間: 2010-10-19 16:25

感謝oobird版大,
你的意思是這樣嗎?
Sub auto_open()
If Data <> "2010,10,19" Then Exit Sub
Application.OnTime "16:11:50", "macro1"
End Sub
可是都不會動耶....
請問哪裡錯了?
謝謝.
作者: 三寶    時間: 2010-10-19 17:02

感謝oobird版大,
你的意思是這樣嗎?
Sub auto_open()
If Data <> "2010,10,19" Then exit sub
Application.OnTime "16:23:30", "macro1"
End Sub
可是這樣都不會動耶,
是哪裡寫錯了嗎?
謝謝.
作者: GBKEE    時間: 2010-10-19 17:17

本帖最後由 GBKEE 於 2010-10-19 21:11 編輯

回復 14# 三寶
你執行 Application.OnTime "16:23:30", "macro1"  時間有超過 "16:23:30" 嗎?
執行Ex() 後不要關閉Excel 明天再試試看
  1. Sub Ex()
  2. Application.OnTime "2010/10/20 09:00", "Macro1"
  3. End Sub
  4. Sub Macro1()
  5. MsgBox Format(Now, "YYYY/M/D  H:M:ss")
  6. End Sub
複製代碼

作者: 三寶    時間: 2010-10-19 19:39

感謝GBKEE版大回覆
我在執行Application.OnTime "16:23:30", "macro1"  的時候沒有超過 "16:23:30"
因為我有一直改時間,然後等它執行.
我把你的VBA語法貼在Module 2
然後執行
它說....編譯錯誤,必須是:=.....
不好意思,還是我放錯地方了?
麻煩你了,謝謝.
作者: oobird    時間: 2010-10-19 20:35

第一行:
Sub Ex()
顯示不完全。我試了完全ok。
作者: GBKEE    時間: 2010-10-19 21:16

回復 17# oobird
多謝指正 已修正
回復 16# 三寶
貼在Module2  注意 如Module1裡還有相同名稱 Sub Macro1() 時
需指明是哪一個模組  Application.OnTime "2010/10/20 09:00", "Module2.Macro1"
作者: 三寶    時間: 2010-10-19 23:06

感謝oobird,GBKEE版大熱心解惑,
Sub Ex()
Application.OnTime "2010/10/20 09:00", "Macro1"
End Sub
已經試過完全可行了,
Sub auto_open()也可以,
我發現隨便Sub什麼都行,sub aa()也可以
重點是日期的表示方法,要用2010/10/19
我之前一直用2010,10,19....所以不行
不過Application這一句不能直接放在macro1裡
它說....編譯錯誤,引數不為選擇性(optional).....
嗯...還有很多要學的,
謝謝你們.
作者: GBKEE    時間: 2010-10-20 06:55

回復 19# 三寶
不過Application這一句不能直接放在macro1裡
你如何寫 PO 上看看
作者: 三寶    時間: 2010-10-20 14:41

感謝GBKEE版大,我是這樣寫啦:
Sub macro1()
Application.OnTime "2010/10/19 22:55:30"
MsgBox Format(Now, "YYYY/M/D  H:M:ss")
End Sub
然後我直接執行macro1,
這樣沒辦法執行...
不過沒關係,我就放在Sub EX()就可以了,
謝謝.
作者: Hsieh    時間: 2010-10-20 14:56

回復 21# 三寶
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
OnTime必要引數
EarliestTime觸發時間
Procedure程序名稱
作者: 三寶    時間: 2010-10-20 17:46

不好意思,我發現一個問題,我的VBA是這樣寫:
Sub EX()
Application.OnTime "2010/10/19 17:26:00", "macro1"
Application.OnTime "2010/10/20 17:26:00", "macro2"
Application.OnTime "2010/10/21 17:26:00", "macro3"
End Sub
我昨天執行正常,因為昨天是10月19日,10月20日還沒到,所以macro2跟macro3不會觸發,
可是今天再打開檔案,再執行EX,
結果發現昨天的macro1又再執行了一次,
而把今天的資料都蓋掉了,
這....這.....這該怎麼辦?
要怎麼寫才表示過了10月19日之後,就不會再次執行macro1呢?
謝謝.....
作者: GBKEE    時間: 2010-10-20 19:54

回復 23# 三寶
遇到資料刪除無法復原時 關閉檔案時選擇 不要存檔 重新開啟檔案 就可以
  1. Sub Ex()
  2.     Dim Macro$
  3.     If Date = "2010/10/19" Then
  4.         Macro = "Macro1"
  5.     ElseIf Date = "2010/10/20" Then
  6.         Macro = "Macro2"
  7.     ElseIf Date = "2010/10/21" Then
  8.         Macro = "Macro3"
  9.     End If
  10.     Application.OnTime "17:26:00", Macro
  11. End Sub
複製代碼

作者: 三寶    時間: 2010-10-20 21:29

感謝GBKEE版大熱心回覆,
我試過,可以解決了
不過我改成:
Sub EX()
If Date = "2010/10/20" Then
Application.OnTime "2010/10/20 21:15:00", "macro1"

ElseIf Date = "2010/10/21" Then
Application.OnTime "2010/10/21 21:17:20", "macro2"

ElseIf Date = "2010/10/22" Then
Application.OnTime "2010/10/22 21:26:00", "macro3"

End If
End Sub
這樣也行,重開檔案之後,不會再去執行昨天的macro了(我有改系統日期測試過),
因為我很多時間是不一樣的,這樣比較好改,
謝謝你,又多學了一招......
作者: GBKEE    時間: 2010-10-20 22:31

回復 25# 三寶
  1. Sub EX()
  2. If Date = "2010/10/20" Then
  3. Application.OnTime "21:15:00", "macro1"
  4. ElseIf Date = "2010/10/21" Then
  5. Application.OnTime "21:17:20", "macro2"
  6. ElseIf Date = "2010/10/22" Then
  7. Application.OnTime "21:26:00", "macro3"
  8. End If
  9. End Sub
複製代碼

作者: 三寶    時間: 2010-10-21 10:27

感謝GBKEE版大提供更簡潔的寫法,
這樣可以少打很多字了,
謝謝.....
作者: basarasy    時間: 2010-10-21 19:28

回復 26# GBKEE


    請問大大.
如果時間過了再run都是可行的.
可以set定只有特定時間才run嗎?
作者: GBKEE    時間: 2010-10-21 19:37

回復  GBKEE
    請問大大.
如果時間過了再run都是可行的.
可以set定只有特定時間才run嗎?
basarasy 發表於 2010-10-21 19:28

Application.OnTime  "指定特定的時間","執行的程式"
"指定特定的時間"-> ,必須是執行此程式碼的時間之後才行的.
請詳看VBA的說明
作者: basarasy    時間: 2010-10-21 19:47

回復 29# GBKEE


    那麼請問要指定時間才run,不到時間和過了時間不會run 如果寫?
作者: Hsieh    時間: 2010-10-21 20:39

回復 30# basarasy


    因為ONTIME是為將來設定執行程序
所以應該用帶參數的程序來判斷時間是否超過
在程序nn的第一行程序If Now > T Then Exit Sub
設置中斷點
執行test即可了解
  1. Sub test()
  2. mytime = Now
  3. mystr = "'nn " & Chr(34) & mytime & Chr(34) & "'"
  4. Application.OnTime mytime, mystr
  5. End Sub
  6. Sub nn(T As Date)
  7. If Now > T Then Exit Sub
  8. MsgBox "執行"
  9. End Sub
複製代碼

作者: GBKEE    時間: 2010-10-21 21:04

回復 30# basarasy
是不是如此
  1. Sub Ex()
  2.     If Time > TimeValue("09:00") And Time < TimeValue("13:30") Then
  3.         Application.OnTime Time + TimeValue("00:00:10"), "????"
  4.     End If
  5. End Sub
複製代碼

作者: 三寶    時間: 2010-10-21 23:20

本帖最後由 三寶 於 2010-10-21 23:23 編輯

回復 30# basarasy

我按照GBKEE版大的寫法,
就會達成你的要求啦
時間沒到不會RUN
時間過了也不會RUN
應該沒錯,你再試試看吧...
作者: basarasy    時間: 2010-10-22 00:11

謝謝大大.
但我是想問  
指定時間(9:00:10)
在8:59:59 RUN EX
等到9:00:10  自動RUN "????"

9:00:11  RUN EX  不會RUN "????"
作者: 三寶    時間: 2010-10-22 00:44

回復 30# basarasy
嗯,對啊,目前我試了是這樣沒錯,
不過要指定日期
If Date="2010/10/21"  Then
這樣的話,只有在指定那一天的那個時間才會RUN
過了那個時間再RUN EX,它也不會RUN
可是沒有指定日期的話,那過了那個時間它還是會再RUN一次,
因為Hsieh版大寫的VBA我看不懂,
所以我還是用GBKEE版大的方法做,
到現在試起來是OK的,
你試試看吧,如果有發現什麼行不通的地方,
再通知一下,
說不定我沒發現到,
謝謝.
作者: GBKEE    時間: 2010-10-22 07:55

回復 35# 三寶
Hsieh版主的程式碼Application.OnTime時所執行的程序要加上引數
程序有引數時 呼叫此程式 必須在空一格後加上引數 程序的引數有指定型態時 引數要是同型態
複製程式碼 執行看看
Sub test()
mytime = Now
mystr = "'nn " & Chr(34) & mytime & Chr(34) & "'"
MsgBox  mystr
Application.OnTime mytime, mystr
End Sub
Sub nn(T As Date)     '引數型態是日期
MsgBox "執行時間"&t
End Sub




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