我需要一些代码才能每天运行一次宏,无论你打开文件的次数与宏有多少都无关紧要。
如果文件有一天没有打开,则不必运行宏,只需在打开时执行。
它必须有一个“内部”变量或类似的东西,我想,它保存了这个宏是否已经运行的信息。
此外,为了使其变得更加困难,我想,宏每天都会打开一个不同的工作簿。
任何想法。
我是新手,请原谅我,如果那么清楚的话。提前谢谢。
已编辑:我找到了一些代码here:
似乎这样做,但你必须创建一个额外的工作表,我不想这样做。
以下是代码:
Private Sub Workbook_Open()
Dim rngFindTodaysDate As Range
With ThisWorkbook.Worksheets("Status")
On Error GoTo X
Set rngFindTodaysDate = .Range("A1").End(xlDown).Find(Date)
If rngFindTodaysDate Is Nothing Then
.Range("A" & .Range("A" & Rows.Count).End(xlUp).Row + 1) = Date
''''' your Code Here
End If
End With
X:
End Sub
答案 0 :(得分:2)
您可以使用Windows任务计划程序每天自动打开一次文件。有一个非常好的step-by-step tutorial here包含所需的VB脚本代码。
如果用户也可能手动打开文件,则需要一个状态变量来记录宏当天是否已经运行。最好的选择可能是有一张专门用于录制此内容的工作表。也许叫它RunTimes
。然后,您可以在Workbook_Open
事件中添加以下行:
If Date > Application.Max(Sheets("RunRecords").Range("A:A")) Then
Call YourMacroName
Sheets("RunRecords").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = Date
End If
答案 1 :(得分:2)
在工作簿中使用(命名)范围,单个单元格,最后一次和运行宏的日期由宏本身存储:
Sheetx.Range("rLastRun").Value2 = Now()
将其添加到宏的末尾,或者至少 以下检查后,宏检查上次运行单元格值是否在今天之前。总计看起来像是:
If Sheetx.Range("rLastRun").Value2 < Date Then
<your macro>
Sheetx.Range("rLastRun").Value2 = Now()
End If
为了打开一个不同的文件,每次你必须更加具体,因为到目前为止我们提供的信息,我们无法帮助那里。问自己以下几点:
提供信息后,您的文件查找将是:
Dim strInputfile As String
<other code>
strInputfile = "<standardfolderstring>" & Format(Date, "dd/mm/yyyy") & " Test.xlsx"
答案 2 :(得分:1)
这是逻辑,请仔细研究。
存储值:例如在工作表目标中的单元格中运行宏。然后,当触发宏时,将该值更改为: 1.然后无论工作表打开多少次并调用宏,sicne单元格值为1,宏将退出并且不完成整个过程
答案 3 :(得分:1)
就我个人而言,我更喜欢其他人提出的解决这个问题的想法...可能使用单个单元格,填充当前日期和颜色白色日期以隐藏它...如果不试试这个:
如果您不想拥有工作表,则可以在同一目录中使用外部文本文件。当XLS打开时,它将读取文本文件以查看当前日期,如果它与今天不匹配,则运行您每天一次的代码并将文本文件更新为今天的日期,否则什么都不做。
Public txt_file_location As String
Public txt_file_name As String
Private Sub Workbook_Open()
txt_file_location = "C:\Documents and Settings\Chris\Desktop"
txt_file_name = "test.txt"
Dim dateToday As Date
Dim dateInFile As Date
dateToday = Date ' will be used for both comparison and for writing to txt file if need be
dateInFile = txtfile_read(txt_file_location, txt_file_name) ' On open - read the text file to check what the current date is.
If (dateToday <> dateInFile) Then
' ok the date in the text file is different to today's date, so your script needs to be called here
Call do_some_work ' a function that runs once a day...
' Now we need to update the textfile to todays date to prevent rerunning
Call save_to_text_file(txt_file_location, txt_file_name, dateToday)
Else
MsgBox ("The script has already ran today")
End If
End Sub
Sub do_some_work()
' here could be one of the functions that needs to run once a day
MsgBox ("Some work was done!")
End Sub
Function txtfile_read(txt_file_dir, file_name)
Dim iFileNumber As Long
Dim strFilename As String
strFilename = txt_file_dir & "\" + file_name
iFileNumber = FreeFile()
Open strFilename For Input As #iFileNumber
Dim txt As Variant
Do While Not EOF(iFileNumber)
Line Input #iFileNumber, myLine
txtfile_read = myLine
Loop
Close #iFileNumber
End Function
Function save_to_text_file(txt_file_dir, file_name, content_to_be_written)
Dim iFileNumber As Long
Dim strData As String
Dim strFilename As String
strFilename = txt_file_dir & "\" + file_name
iFileNumber = FreeFile()
Open strFilename For Output As #iFileNumber
Print #iFileNumber, content_to_be_written
Close #iFileNumber
End Function