【发布时间】:2020-03-20 13:29:18
【问题描述】:
我一直在考虑允许应用程序使用 COM 互操作或 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?
模拟项目代码:
表 1:
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
模块 1:
Private mAppEvents As clsAppEvents
Public Sub Setup()
If mAppEvents Is Nothing Then
Debug.Print ("Setup initialized")
Set mAppEvents = New clsAppEvents
End If
End Sub
【问题讨论】:
标签: excel vba com-interop excel-dna