【问题标题】:Procedure breaks/stops at Application.WorksheetFunction.Average()程序在 Application.WorksheetFunction.Average() 处中断/停止
【发布时间】:2023-02-21 01:52:16
【问题描述】:

Windows 10 专业版

版本 21H2
操作系统版本 19044.1586
Excel 2007,VBA:零售 6.5.1057 - Forms3:12.0.6723.500

关注点:

Sheets("SUMMARY").Cells(Rows.Count, 3).End(xlUp).Offset(1, 0) = _
                        Application.WorksheetFunction.Average(irng)

当上面的代码在下面的模块中“手动”(F5) 使用时,它可以工作。但是,当“计时器”触发/启动时,程序会在该行中断/停止。

我已将代码分散到多个过程中以进行故障排除;没有帮助我的事业。

Option Explicit
Public RunWhen As Double
Public Const cRunWhat = "kcal"  ' the name of the procedure to run
Sub StartTimer()
RunWhen = TimeSerial(23, 45, 0)
Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
    Schedule:=True
End Sub

Private Sub kcal()
Sheets("SUMMARY").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Date
Sheets("SUMMARY").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Sheets("TODAY_(24hr)").Range("E40").Value

kcal2
End Sub

Sub kcal2()
Dim i As String
Dim irng As Range
i = Sheets("SUMMARY").Cells(Rows.Count, 2).End(xlUp).Address
Set irng = Range("B2:" & i)

Sheets("SUMMARY").Cells(Rows.Count, 3).End(xlUp).Offset(1, 0) = Application.WorksheetFunction.Average(irng)
 
ActiveWorkbook.SaveCopyAs Filename:=ActiveWorkbook.Path & "\Back_Up\Bak-Up_" & Format(Now, "yyyymmdd") & "_m" & ActiveWorkbook.Name

StartTimer

End Sub

【问题讨论】:

  • Set irng = Range("B2:" & i) 是一个不合格的范围,因此它假定为 ActiveSheet - 并且可能应该是 Set irng = Range("B2:B" & i)
  • 我能理解的最好的意思是 = 它坏了。我不明白的是,为什么,如果它是不合格的——以及——代码在手动运行 (F5) 时有效的事实,我会得到两个不同的结果吗? IE。我认为如果“i”不合格,无论计时器运行它还是从 F5 运行,它都会保持这种状态。请赐教。
  • @ braX,我最初误读了你的 ...Set irng = Range("B2:B" & i)... 使用该代码,我想到了两件事:当原始代码失败并且我选择“调试”时,然后将鼠标悬停在将鼠标悬停在“i”上,它会正确计算出 $col$num(地址);但不会计算平均值。如果我听从您的建议,结果“var”似乎是 B2:BB118。我说/假设是因为在调试中并将鼠标悬停在“i”上 <-- 它填充了 $B$118.. 此外,该代码使用 F5 工作。请进一步解释。

标签: excel vba excel-2007


【解决方案1】:

应用.OnTime

  • 如果在包含此代码的工作簿中不应发生这种情况,请将所有出现的 ThisWorkbook 替换为正确的工作簿,例如ActiveWorkbook
Option Explicit

Public RunWhen As Double
Public Const cRunWhat = "kcal"  ' the name of the procedure to run

Sub StartTimer()
    RunWhen = TimeSerial(23, 45, 0)
    Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
        Schedule:=True
End Sub

Private Sub kcal()
    Dim sws As Worksheet: Set sws = ThisWorkbook.Worksheets("TODAY_(24hr)")
    Dim dws As Worksheet: Set dws = ThisWorkbook.Worksheets("SUMMARY")
    dws.Cells(dws.Rows.Count, "A").End(xlUp).Offset(1, 0).Value = Date
    dws.Cells(dws.Rows.Count, "B").End(xlUp).Offset(1, 0).Value _
        = sws.Range("E40").Value
    kcal2
End Sub

Sub kcal2()
    Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("SUMMARY")
    Dim lRow As Long: lRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    Dim irng As Range: Set irng = ws.Range("B2:B" & lRow)

    ws.Cells(ws.Rows.Count, "C").End(xlUp).Offset(1, 0).Value _
        = Application.WorksheetFunction.Aggregate(1, 6, irng)
    
    Dim FolderPath As String: FolderPath = ThisWorkbook.Path & "Back_Up"
    If Len(Dir(FolderPath, vbDirectory)) = 0 Then MkDir FolderPath
    
    ThisWorkbook.SaveCopyAs Filename:=FolderPath & "Bak-Up_" _
        & Format(Now, "yyyymmdd") & "_m" & ThisWorkbook.Name

    StartTimer

End Sub

【讨论】:

  • @ VBasic2008,我的原始代码仅在该特定行失败——当它从计时器调用时。它运行完美——如果它作为宏运行,或手动运行 (F5)。
  • 完美的可能纯属偶然。你试过这个解决方案吗?这有什么不同吗?
  • @ VBasic2008,“完美”并非偶然。在过去的三个星期里,它一直表现得像这样。代码唯一失败的时间是“计时器”调用它的时候。否则代码工作正常。我没有使用你的代码,也没有使用 Williams 先生的贡献;然而。我真的很想/需要知道——是什么破坏了这个简单的单行代码,只有当它被“计时器”调用时。尊敬。
  • 那么我建议您首先尝试 Tim 的解决方案,因为它的更改较少,然后才是我的。如果其中任何一个有效,只需逐一删除每个更改,您就会发现究竟是什么导致了这种行为。非常欢迎您的反馈。
  • @ VBasic2008,我希望了解如何解决原始的单行问题——当使用“F5”运行时,它可以从模块中工作,但当从计时器调用时将无法工作——而不是使用捐赠的替代品。但是,如果这就是我必须与之合作的全部;就这样吧。
【解决方案2】:

尝试这个:

Sub kcal2()
    
    Dim irng As Range
    
    With Sheets("SUMMARY")  'make sure all ranges are tied to a specific sheet
         Set irng = .Range("B2:B" & .Cells(.Rows.Count, 2).End(xlUp).Row)
         .Cells(.Rows.Count, 3).End(xlUp).Offset(1, 0) = _
                        Application.WorksheetFunction.Average(irng)
    End With
    ActiveWorkbook.SaveCopyAs Filename:=ActiveWorkbook.Path & _
        "Back_UpBak-Up_" & Format(Now, "yyyymmdd") & "_m" & ActiveWorkbook.Name

    StartTimer

End Sub

【讨论】:

  • 我必须研究你的贡献才能真正理解。该代码/项目位于该特定工作表的模块中这一事实表明您推荐的“特定工作表”关联已经完成。我错了吗?
  • 不确定我们如何知道您的代码在工作表模块中 - 提及这样的细节很有用......
  • @ Tim Williams,我确实提到过它,看看最初的帖子——直接在代码的第一行下面——>“当上面的代码‘手动’(F5) 使用时,在下面的模块中,它工作每次都很完美。”如果我的措辞不清楚,我深表歉意。
  • 仅供参考,“模块”可以表示工作表模块、工作簿模块、常规模块,甚至是类模块。它只是一个放置代码的地方。这里发布的大多数代码都在常规模块中,因为这是人们通常开始的地方(可能是因为宏记录器将它生成的代码放在那里)。
  • @ Tim Williams,谢谢你的信息;我不知道。关于我使用的模块;老实说,我不知道。从编辑器的菜单 --> Insert |模块,然后输入代码。明确地说——我插入了“模块”;不是“类模块”。正如我在上面发布到 VBasic2008 时,我可能已经发现“我”破坏了什么;我将在接下来的 48 小时内对其进行测试以进行确认,同时我还将深入研究(理解)你们这些好人所捐赠的代码。除非出现故障,否则我将在大约48小时。尊敬。
【解决方案3】:

对原始“postedroken”代码的实际修复是改变——

Set irng = Range("B2:" & i)

- 到 -

 Set irng = Sheets("SUMMARY").Range("B2:" & i)    

而当使用错误行时

Set irng = Range("B2:" & i)    

如果以及何时 ActiveSheet - 是任何其他工作表

Sheets("SUMMARY")    

该项目/程序将尝试并应用

Sheets("SUMMARY").Cells(Rows.Count, 3).End(xlUp).Offset(1, 0) = Application.WorksheetFunction.Average(irng)   

到那个 ActiveSheet,而不是

Sheets("SUMMARY")    

当 ActiveSheet 不是 Sheets("SUMMARY") 时,它在指定的 [irng] 中没有 [Average()] 可以处理的数据。 <--这就是代码失败的原因.通过改变

Set irng = Sheets("SUMMARY").Range("B2:" & i)    

这是指定“确切”的工作表[ 恩 ]应该[ 放 ]到。一些东西

Set irng = Range("B2:" & i)    

没有完成。

谢谢大家的贡献。

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 2016-05-22
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多