应用程序事件,确定何时真正准备好从中读取Excel

问题描述 投票:0回答:1

我一直在考虑允许应用程序使用COM interop或Excel-dna与Excel链接。理想情况下,用户可以链接可能包含或不包含VBA代码的任何Excel工作簿。通常,操作将是

i)C#写入Excel工作表

ii)Excel重新计算

iii)(可选)如果用户包含任何Worksheet_Change或Worksheet_Calculate事件,则Excel可以运行VBA。>

iv)C#然后从Excel表格中读取,该表格将包含calcs / VBA中的更新数据

是否有FINAL Application事件通知所有事情完成?

例如,应用程序级别的事件包括AfterCalculate()SheetChange,但一个或两个都可能触发,这使得很难知道对iv)的哪个对象做出反应。

我在VBA中设置了一个小型模拟项目,在更改工作表时,应用程序级事件将按以下顺序触发

Worksheet_Calculate
mApp_AfterCalculate Calc ended at: 20/03/2020 13:23:29
Worksheet_Change Started
Worksheet_Change Ended
mApp_SheetChange Calc ended at: 20/03/2020 13:23:29 --> New Value: 20/03/2020 13:23:29

如果有一种简单的方法可以知道mApp_AfterCalculate是最终事件还是mApp_SheetChange?

模拟项目代码:

Sheet1:

Private Sub Worksheet_Calculate()
    Debug.Print ("Worksheet_Calculate")
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

    Debug.Print ("Worksheet_Change Started")
    Call Setup

    Application.EnableEvents = False
    Sheet1.Range("F1").Value = Now
    Application.EnableEvents = True

    Debug.Print ("Worksheet_Change Ended")
End Sub

类模块:clsAppEvents

Option Explicit

Private WithEvents mApp As Application

Private Sub Class_Initialize()
    Set mApp = Application
End Sub

Private Sub mApp_AfterCalculate()
    Debug.Print "mApp_AfterCalculate Calc ended at: " & Now
End Sub

Private Sub mApp_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Debug.Print "mApp_SheetChange Calc ended at: " & Now & " --> New Value: " & Sh.Range("F1").Value

End Sub

Module1:

Private mAppEvents As clsAppEvents

Public Sub Setup()
    If mAppEvents Is Nothing Then
        Debug.Print ("Setup initialized")
        Set mAppEvents = New clsAppEvents
    End If
End Sub

我一直在考虑允许应用程序使用COM interop或Excel-dna与Excel链接。理想情况下,用户可以链接可能包含或不包含VBA代码的任何Excel工作簿。通常...

excel vba com-interop excel-dna
1个回答
0
投票

据我对您的问题的了解,根本的问题是,您试图通过假设事件将按一定顺序执行来预测Excel的计算图,并且它们将始终同步执行...您无法可靠地预测100%的时间。

© www.soinside.com 2019 - 2024. All rights reserved.