计划的VBA任务和“Application.OnTime”

我有以下VBA代码运行良好。 这是调用另一个VBA Sub没有任何麻烦:

 Public Sub AutoPrintMissingHistoric() Dim qdf As DAO.QueryDef Dim rcs As DAO.Recordset Dim db As DAO.Database Dim j As Integer Dim flag As Boolean Dim i As Long Dim value_start, value_end As String Dim tmp As Date Dim wbRiskedge As Workbook Dim wsAccueil As Worksheet Dim wsHistoric As Worksheet Set wbRiskedge = Workbooks(StrWbRiskedge) Set wsAccueil = wbRiskedge.Worksheets(StrWsAccueil) Set wsHistoric = wbRiskedge.Worksheets(StrWsHistoricMissing) If FistTime = True Then Call Initialisation.CleanTab Else FistTime = True Call Initialisation.Initialisation End If vDelay = 5 Cpt = Cpt + 1 Set db = DBEngine.OpenDatabase(strDB) Set qdf = db.QueryDefs("Get_missing_fixings") If Cpt <= wsAccueil.Range(ManualListLetter & "1").End(xlDown).Row Then Application.StatusBar = wsAccueil.Cells(Cpt, ManualListLetter).Text qdf.Parameters("arg1") = wsAccueil.Cells(Cpt, ManualListLetter).Value Set rcs = qdf.OpenRecordset j = 0 i = 1 flag = False If Not rcs.EOF Then rcs.MoveLast rcs.MoveFirst While Not rcs.EOF j = 0 While j < rcs.Fields.Count If flag = False Then With Cells(i, j + 1) If .Value = "" Then .Value = rcs(j).Name .Font.Bold = True .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom End If End With Else Cells(i, j + 1).Value = rcs(j).Value End If j = j + 1 Wend If flag = False Then flag = True End If i = i + 1 rcs.MoveNext Wend Call ChangeMinMax(rcs.RecordCount, CellMinDate, CellMaxDate, wsHistoric) Call ParseParameters Call SetReutersFunction End If rcs.Close qdf.Close db.Close wsHistoric.Calculate Application.StatusBar = wsAccueil.Cells(Cpt, ManualListLetter).Text & " - Next Function: FindMissingValue.AutoFindMissingValue" sToCall = "FindMissingValue.AutoFindMissingValue" MTimeGT = Time + TimeValue("00:00:" & vDelay) Application.OnTime MTimeGT, sToCall End If End Sub 

我把这个过程的执行放在一个计划任务中。 但显然我的代码没有很好的执行: FindMissingValue.AutoFindMissingValue子不被调用,因为Excel只是closures。

我认为这是因为Application.OnTime MTimeGT, sToCall …可能是什么原因?

在这里你已经有了FindMissingValue.AutoFindMissingValue的代码

 Sub AutoFindMissingValue() Dim wbRiskedge As Workbook Dim wsAccueil As Worksheet Dim wsHistoric As Worksheet Dim i, nbResult As Long Set wbRiskedge = Workbooks(StrWbRiskedge) Set wsAccueil = wbRiskedge.Worksheets(StrWsAccueil) Set wsHistoric = wbRiskedge.Worksheets(StrWsHistoricMissing) If Left(wsHistoric.Range(ReutersFormula).Text, 13) Like "Retrieving...*" = True Then sToCall = "FindMissingValue.AutoFindMissingValue" MTimeGT = Time + TimeValue("00:00:05") Application.OnTime MTimeGT, sToCall Exit Sub End If i = WorksheetFunction.CountA(Columns(DateColumn & ":" & DateColumn)) If WorksheetFunction.CountA(Columns(ColumnResearchVResult & ":" & ColumnResearchVResult)) > 0 Then wsHistoric.Range(FirstCellResearchVResult & ":" & ColumnResearchVResult & WorksheetFunction.CountA(Columns(ColumnResearchVResult & ":" & ColumnResearchVResult))).ClearContents End If nbResult = wsHistoric.Range(FirstResult).End(xlDown).Row wsHistoric.Range(ColumnResearchVResult & LineResearchVResult - 1).Value = "Results" If WorksheetFunction.CountA(Columns(DateColumn & ":" & DateColumn)) > 1 Then wsHistoric.Range(FirstCellResearchVResult & ":" & ColumnResearchVResult & i).FormulaLocal = "=RECHERCHEV($" & DateColumn & "$" & LineResearchVResult & ":$" & DateColumn & "$" & i & ";" & FirstLockResult & ":$" & ValueResultColumn & "$" & nbResult & ";2;0)" End If Application.StatusBar = wsAccueil.Cells(Cpt, ManualListLetter).Text & " - Next Function: FindMissingValue.AutoPutResultInDb" sToCall = "FindMissingValue.AutoPutResultInDb" MTimeGT = Time + TimeValue("00:00:01") Application.OnTime MTimeGT, sToCall End Sub 

Application.OnTime部分是正确的,应该调用FindMissingValue.AutoFindMissingValue没有任何问题(5秒后)。 可能发生的情况是,在这5秒的时间内,代码会继续运行,返回到AutoPrintMissingHistoric被调用的位置,并且在这5秒钟之前可能会closures工作簿(尽pipe取决于您的确切条件,函数应该即使工作簿已closures,也会被调用)。

您可以缩短等待时间(例如vDelay = 1 ),或者直接调用函数( Call FindMissingValue.AutoFindMissingValue )。 实际上,我不确定你为什么依靠Application.OnTime来调用函数。 使用这个方法对于“启动过程”(例如,“我希望我的macros在每天00:00执行”)是很好的,但是在定期使用的情况下,可能会驱动到“混乱的情况”。

如果没有这个工作,请提供FindMissingValue.AutoFindMissingValue的代码来看看它。

注意:经过一些进一步的testing/讨论后,我可以证实OnTime在这些特定条件下的行为是“太不正常”的。 你应该想出一个不同的方法来允许你需要等待的时间,或者在不得不依赖OnTime情况下,做一个密集的反复试验来确保它的行为完全被控制。 这个函数预计会被调用一次(例如,在某个时间打开电子表格),因此在不同的上下文中使用它(比如:在一个函数中调用它)时,需要特别注意。