我一直在考虑允许应用程序使用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的计算图,并且它们将始终同步执行...您无法可靠地预测100%的时间。