2012-11-28 186 views
1

我需要一些代码来每天运行一次宏,无论打开文件的次数是多少次都无关紧要。VBA每天运行一次宏一次

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

它必须有一个内部的”变量或类似的东西,我想,是保持信息的宏是否alredy运行不了这一天。

此外,使其更困难,我想,宏提前打开不同的工作簿中的每一天

任何想法

我是新手,所以请原谅我,如果是这样的话清晰感谢

编辑:。。我发现了一些代码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

你期望你的宏做什么?如果你需要运行任何一天一次,把一个按钮,告诉别人一下就可以每天一次,连他们打开该文件,100倍...... OMG目前还不清楚有什么需要后悔:( – bonCodigo

+0

我需要我的宏运行每天只有一次,打开文件的次数并不重要,因为它必须自动执行,所以我不能告诉用户这么做,如果你需要更多信息,请让我知道 – themolestones

+0

我会说你保持一个值:如0在这片单元然后运行宏时,更改该值:如1那么无论多少次单开和宏被调用,sicne细胞衣被合计为1,宏将退出,而不是完成全过程。 – bonCodigo

回答

1

在您的单元格中使用(命名)范围在宏运行最后时间&日期是由宏本身保存工作簿:

Sheetx.Range("rLastRun").Value2 = Now() 

它添加到您的宏或至少以下检查,结束您的宏检查,如果最后时间运行单元值是在今天之前。那么总的看起来像:

If Sheetx.Range("rLastRun").Value2 < Date Then 

    <your macro> 

    Sheetx.Range("rLastRun").Value2 = Now() 

End If 

对于打开不同的文件,你必须更加具体与设置到目前为止,我们不禁有信息,每次。询问以下事项:

  1. 在文件属性中是否有任何逻辑?
  2. 它是否每次都有相同的名称,除了时间戳(例如,Input20121128.xlsInput20121127。xls
  3. 文档名称是否在可能名称的有限池中?
  4. 它总是在同一个文件夹中吗?
  5. 它有特定的创作者,日期,时间,...?

随着信息提供文件的查找是:

Dim strInputfile As String 

<other code> 

strInputfile = "<standardfolderstring>" & Format(Date, "dd/mm/yyyy") & " Test.xlsx" 
+0

嗨,是的,就是这样。 1 - >这些文件有一个逻辑名称。 2 - >只是改变日期。 4 - >始终在同一个文件夹中。该名称将会像“2012年11月28日Test.xlsx”和日期更改dialy。如果我需要提供更多信息,请让我知道。谢谢。 – themolestones

+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 
+0

我发现你并不热衷于有额外的纸张。你可以隐藏它,或者如果你的宏在每次运行时都可以预测地改变它,那么你可以在If语句中用它作为你的条件。 –

+0

谢谢,我想我会去找那个解决方案来隐藏工作表,但我认为它会有一个“内部变量”来保持这种信息,而不必向表单中添加额外的数据或类似的东西。 – themolestones

1

这里是逻辑,请调查一下。

存储值:例如0在工作表目标中的单元格中运行宏。然后,当触发宏时,将该值更改为:例如1.然后,无论工作表打开多少次并调用宏,单元格值为1,宏将退出并且不会完成整个过程。

+0

谢谢,但就像我说过的,我正在寻找一些不会涉及细胞变化的东西,但无论如何,我会感谢您的努力。 – themolestones

+0

如果你会保留一张隐藏的纸张:)这是值得的做最简单/有效的方式,如果这样做的工作。您可以在Worksheet打开事件中调用宏。但是,如果有更多的选择,您应该选择相应的选项,我会把它留给你。 ;) – bonCodigo

+0

好的,我会尝试这种方式。谢谢 – themolestones

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 
+0

谢谢,我真的很感谢你的时间和精力。问候 – themolestones

+0

无后顾之忧 - 在咖啡酿造过程中燃烧一段时间是一种不错的方式!快乐编码:) – Chris