【问题标题】:How to wait for another macro to finish generating values?如何等待另一个宏完成生成值?
【发布时间】:2020-01-19 04:32:40
【问题描述】:

在我的主宏中运行的宏会生成我需要复制到另一个 Excel 文件的值。

我的主宏不等待生成完成并将空单元格粘贴到另一个文档中。

如果我单步执行,代码会按预期工作,但按“运行”时不会。

Set wbThis = ActiveWorkbook
strName = ActiveSheet.Name
Set wbTarget = Workbooks.Open("D:\Users\user37\Desktop\exportas\Information.xlsm")
wbTarget.Worksheets("Information").Activate
ActiveSheet.Range("B2").Value = myValue
Application.Run ("'Information.xlsm'!ExportData")
wbTarget.Worksheets("SO Lines").Activate
ActiveSheet.Range("E4").Copy

Set wbTarget = Workbooks.Open("D:\Users\user37\Desktop\exportas\Sablonai.xlsm")
wbTarget.Worksheets("Duomenys").Activate
ActiveSheet.Range("A1").Select
activeSheet.PasteSpecial

我找到了这个问题的几个答案,但似乎没有一个对我有用。

我尝试了睡眠和等待方法。它们会停止整个宏,甚至是生成值的宏。

我尝试在生成宏的末尾或在主宏中调用生成宏之后添加 DoEvents。更改无效。

建议的重复 Excel waiting for one macro to finish before calling another 没有帮助。

【问题讨论】:

  • 你能举一个你尝试过的“这个问题的几个答案”的例子,并扩展“他们没有用”吗?
  • 那里的链接没有帮助...
  • 我已经尝试过 sleep 和 wait 方法,它们只会停止整个宏,甚至是生成值的宏。还尝试在生成宏的末尾或在我在主宏中调用生成宏之后添加 DoEvents。更改没有任何效果,所以代码仍然不会等待生成完成

标签: excel vba


【解决方案1】:

由于性能问题,请尽量避免使用 ActivateSelect。当您逐步执行代码时,它应该按预期工作,因为选择/激活能够在执行下一行之前完成。 还没有测试过下面的代码,但我希望你能理解With 的原理。

更多的选择例子可以在How to avoid using Select in Excel VBA看到

Set wbThis = ActiveWorkbook
strName = ActiveSheet.Name
Set wbTarget = 
Workbooks.Open("D:\Users\user37\Desktop\exportas\Information.xlsm")
With wbTarget.Worksheets("Information")
    ActiveSheet.Range("B2").Value = myValue
    Application.Run ("'Information.xlsm'!ExportData")
With wbTarget.Worksheets("SO Lines")
    .Range("E4").Copy
End With

Set wbTarget = Workbooks.Open("D:\Users\user37\Desktop\exportas\Sablonai.xlsm")
With wbTarget.Worksheets("Duomenys")
    With ActiveSheet.Range("A1")
        .PasteSpecial
    End With
End With

更新:

'In case of multiple columns we create an array
Dim dData(1) as Variant 
Set wbThis = ActiveWorkbook
strName = ActiveSheet.Name
Set wbTarget = 
Workbooks.Open("D:\Users\user37\Desktop\exportas\Information.xlsm")
With wbTarget.Worksheets("Information")
'Copies column 1 and 2
    data(0) = Application.Transpose(Range(Cells(1,1),Cells(1,1).End(xlDown)).Value2)
    data(1) = Application.Transpose(Range(Cells(2,1), Cells(2,1).End(xlDown)).Value2)
End With

'Once again we copy the data from column 1 and 2
With wbTarget.Worksheets("SO Lines")
    data(0) = Application.Transpose(Range(Cells(1,1),Cells(1,1).End(xlDown)).Value2)
    data(1) = Application.Transpose(Range(Cells(2,1),Cells(2,1).End(xlDown)).Value2)
End With

【讨论】:

  • 感谢您的回答,但宏仍然会在宏完成生成值之前打开文件 Sablonai.xlsm
  • 你能展示一下excel文档是如何排列的吗?之前和之后,我做了一个程序,如果我能更清楚地理解当前的结果,可能会解决你的问题。
  • 这部分代码是错误的,你使用 With wbTarget.Worksheets("SO Lines") 但是在 With 语句之后你有这个:ActiveSheet.Range("E4").Copy,它不一定指向 wbTarget.Worksheets("SO Lines")。要让它以这种方式工作,请更改为:.Range("E4").Copy
  • 你是指数据生成excel文档还是最终文档?因为最终文档只是一个可以粘贴的空白区域
  • @jkpieterse 我是这么认为的,这也应该包含在 activesheet.pasteSpecial 中吗?
【解决方案2】:

问题已通过转到生成宏 -> 数据 -> 连接并禁用每个查询的后台刷新来解决

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多