【问题标题】:VBA stops printing values in excelVBA停止在excel中打印值
【发布时间】:2012-11-23 06:40:30
【问题描述】:

我编写了一个宏来从外部模拟工具中获取值并将结果打印到 excel 中。模拟工具将仅每 30 秒提供一次值,并将运行数天。因此,我在 VB 中给出了 30 秒的循环延迟。我让它通宵运行。第二天早上,我可以看到在某些行之后没有更新任何结果。但是 VBA 编辑器标题显示宏正在运行,并且外部模拟工具也在运行。 excel中最后更新的行并非每次都保持不变。为什么 VBA 停止在 excel 中打印结果?任何帮助将不胜感激。

示例代码:

For l = 3 To lastrow1_mul + 2
Module4.Wait 30
nv = send_data.Call
Sheets(SecondSheetName).Range(SecondSheetCol_9 & l) = Hex(nv)
dv = DT.Call
If dv = 44 Then
Sheets(SecondSheetName).Range(SecondSheetCol_10 & l) = "A"
ElseIf dv = 54 Then
Sheets(SecondSheetName).Range(SecondSheetCol_10 & l) = "B"
Else
Sheets(SecondSheetName).Range(SecondSheetCol_10 & l) = "C"
End If
Next l

模块 4:

Function Wait(PauseTime As Single)
Dim StartTime As Single 
StartTime = Timer
While Timer < StartTime + PauseTime
DoEvents
Wend  
End Function

Send_data 和 DT 是外部模拟工具的功能。变量 lastrow1_mul 的值在 7000 左右更新,但 excel 中的行本身在 500 左右停止打印(并非始终不变)。

【问题讨论】:

  • 我尝试使用错误捕获块,但没有捕获任何错误。
  • 你需要提供一些代码/例子
  • @PhilipABarnes 很抱歉问这个问题.. 我怎样才能在这里添加一段代码。我在这里尝试复制粘贴,但代码就像一个段落。
  • 编辑您的原始帖子,不要添加 cmets。然后,您也可以从其中一个图标中格式化为代码
  • @PhilipABarnes 谢谢巴恩斯。示例代码已更新。

标签: excel vba


【解决方案1】:

看起来不错,但看看使用如下所示的 Application.OnTime。另外,如果模拟没有返回数据会发生什么,您是否应该以更大的间隔构建,可能是 45 秒?

Application.OnTime Now + TimeValue("00:00:30"), "RunProcess"

【讨论】:

  • 感谢您的回复。这里的 RunProcess 有什么作用。它不等待 30 秒并点击 Send_data.Call 并引发运行时错误 424-Object required。模拟工作正常。我可以在它的窗口中看到它。通过引入更多延迟,我往往会丢失第 3 次调用本身的值。(在 90 秒时,我应该从模拟中得到 3 个值,但通过使用 45 秒延迟,我只会得到 2 个值。)
  • 您的代码运行良好,如果没有看到全局,我很难提出建议。什么是外部仿真工具?无论如何,您都会丢失值,就好像该过程在 15 分钟后需要 1 秒,这会使您的经过时间再增加 30 秒。我会查看 simul 工具,看看消息是否可以排队,或者您可以响应该工具触发的事件。
  • 它的 Vector CANalyzer 工具。主要用于汽车行业。您能否解释一下我将如何使用确切的延迟在 15 分钟后失去价值?我没有明白您的意思。
  • simul 工具每 30 秒提供一次值,但您的进程需要 30 多秒才能运行,因为它需要 30 秒 + 代码运行时间。因此,如果“代码运行”需要 1 秒,那么每 15 分钟您将延迟 30 秒并错过一个值。不幸的是,这不是一个 SO 问题,对我来说太具体了,无法提供合适的答案
  • 谢谢巴恩斯。我将尝试在模拟工具中使用一个数组来接收所有值,并尝试每 3 分钟从 vb 调用该数组(对于 5 个值)。在这种情况下,我猜缺失值的概率会更小。还有其他更好的建议吗?
【解决方案2】:

我在代码中使用的“计时器”是罪魁祸首。计时器计算自午夜以来经过的秒数(以分数为单位)。所以当时间变成 00.00.00 时它不会更新。所以我写的等待函数会一直等待! 这是解决方案

Function Wait()
Dim StartSecond As Single
Dim EndSecond
StartSecond = Now

EndSecond = DateAdd("s", 30, Now)

While Now < EndSecond
DoEvents
Wend

End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2021-05-01
    相关资源
    最近更新 更多