VBA每天运行一次宏

时间:2012-11-28 07:50:01

标签: vba time excel-vba excel

我需要一些代码才能每天运行一次宏,无论你打开文件的次数与宏有多少都无关紧要。

如果文件有一天没有打开,则不必运行宏,只需在打开时执行。

它必须有一个“内部”变量或类似的东西,我想,它保存了这个宏是否已经运行的信息。

此外,为了使其变得更加困难,我想,宏每天都会打开一个不同的工作簿。

任何想法。

我是新手,请原谅我,如果那么清楚的话。提前谢谢。

已编辑:我找到了一些代码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

4 个答案:

答案 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

为了打开一个不同的文件,每次你必须更加具体,因为到目前为止我们提供的信息,我们无法帮助那里。问自己以下几点:

  1. 文件属性中是否有任何逻辑?
  2. 除了时间戳之外每次都有相同的名称(例如 Input20121128.xls Input20121127.xls
  3. 文档名称是否在可能名称的有限池中?
  4. 是否始终在同一个文件夹中?
  5. 是否有特定的创作者,日期,时间......
  6. 提供信息后,您的文件查找将是:

    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