【问题标题】:Excel VBA macro completes before cells on worksheet are refreshedExcel VBA 宏在工作表上的单元格刷新之前完成
【发布时间】:2018-06-07 00:59:43
【问题描述】:

我在使用某些 Excel 自动化来创建仪表板时遇到了问题。我有一个启用 Excel 宏的工作簿,它还具有与 Access 数据库的数据连接。每天早上(周一至周五),另一个进程会自动将数据导出到 Access 数据库,然后 Excel 会连接到必要的表格以在图表和图形中显示该数据。

我的问题: 我正在使用 VBA 对其中一个图表执行计算,该图表从 Access 和 Excel 之间的数据连接生成的表中检索新数据。这个想法是将新一天的数据包含在使用前一天数据的计算中。新一天的数据始终是该列中包含数据的最后一个单元格,而前一天的数据在同一列的正上方。由于某种原因,直到下面的代码完成执行之后,新一天的数据才会被填充。我尝试使用 Worksheets("Worksheet'sName").Calculate,因为图表使用 IF 语句从数据连接生成的表中获取数据,但它仍然不起作用。我也尝试过使用延迟,认为代码运行得太快但结果是一样的。有没有其他人遇到过这个问题?

我的计算代码:

Sub Differences(ByVal column As String)

Dim i As Integer
Dim ws As Sheets
Dim wks As Worksheet
Dim dailyDiff As Double
Dim busDayDiff As Double
Dim mtdDiff As Double

Set ws = ThisWorkbook.Worksheets
Set wks = ws("Charts") 
wks.Activate

i = 4

wks.Range(column & i).Select

Do While Selection.Offset(1, 0).Value <> ""
    i = i + 1
    wks.Range(column & i).Select
Loop

**dailyDiff = Selection.Value - Selection.Offset(-1, 0).Value** '<---The Calculation i'm referring to
busDayDiff = Selection.Value - Selection.Offset(0, 1).Value
mtdDiff = Selection.Value - wks.Range(column & "3").Value

ws.Range(column & "28") = busDayDiff
ws.Range(column & "29") = dailyDiff
ws.Range(column & "30") = mtdDiff

End Sub



Sub AllDifferences()

Differences ("b")
Differences ("d")
Differences ("f")
Differences ("h")
Differences ("j")
Differences ("l")

End Sub


Sub RefreshAll()

Application.ScreenUpdating = False
ActiveWorkbook.RefreshAll
Application.ScreenUpdating = True

End Sub


Sub test()

Call RefreshAll
Call AllDifferences

End Sub

【问题讨论】:

  • 我希望 column 应该是一个字母。它也是一个保留字,可以引用当前 Selection 的列索引号。
  • @Jeeped 它应该是他的主要子 Sub Differences(ByVal column As String) 的参数。也就是说,我不知道当它是关键字时它是如何解决的
  • @Marcucciboy2 没错。同样,老实说,我并没有考虑将其作为保留字。我会换成别的!

标签: vba excel


【解决方案1】:

解决此问题的一种方法是在将 Access/Database 数据拉入不同的子目录后,将要运行的所有子目录等放入。每次调用 Access 信息时都必须这样做。如果您在 Application.OnTime Now +TimeValue("00:00:15") 之后调用“主”子中的另一个子,它将失败 - 您必须将所有子跟随到一个新的主子中。

【讨论】:

  • 谢谢@madrac。因此,如果我在我的主 sub test() 中理解正确,我只能在这种情况下调用 RefreshAll 吗? (或任何不需要使用访问信息的子)?
猜你喜欢
  • 2020-07-04
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
相关资源
最近更新 更多