在将Excel VBA应用程序转换为VB.NET的过程中,我理解我不能在DLL中使用End
语句,因为它只能由启动它的进程停止。相反,似乎DLL必须引发一个由Excel中的VBA代码处理的事件。
我认为大部分工作除了应该检测到引发事件的部分,以便中止执行。这是我到目前为止所得到的:
VBA调用的DLL程序:
Public Class Class1
Sub DLLentry()
Dim ClStop As New ClassStop
AddHandler StopExecution, AddressOf ClStop.stopExec
DLLprocedure1()
End Sub
End Class
执行大部分操作的过程:
Module Module1
Public Event StopExecution()
Sub DLLprocedure1()
'Operations that in certain circumstances must stop the execution
RaiseEvent StopExecution()
End Sub
End Module
应该将引发的事件通告给Excel的类:
Imports System.Runtime.InteropServices
<ComVisible(True)>
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>
<Guid("28C7DCE1-90EF-4a30-AF7F-4187F9FFFDEB")>
Public Interface ICoreEvents
<DispId(1)>
Sub StopExecutionCl()
End Interface
<ComVisible(True)>
<InterfaceType(ComInterfaceType.InterfaceIsDual)>
<Guid("86CE5E8D-777D-4cd5-8A7D-7F58737F1DB4")>
Public Interface ICore
Sub stopExec()
End Interface
<ComVisible(True)>
<ClassInterface(ClassInterfaceType.None)>
<ComDefaultInterface(GetType(ICore))>
<ComSourceInterfaces(GetType(ICoreEvents))>
<Guid("C58721B1-15B3-4eeb-9E1E-BCDA33D38EE6")>
Public Class ClassStop
Implements ICore
<ComVisible(False)>
Public Delegate Sub OnStopExecutionCl()
Public Event StopExecutionCl As OnStopExecutionCl
Sub stopExec() Implements ICore.stopExec
MsgBox("Checkpoint 1")
RaiseEvent StopExecutionCl()
End Sub
End Class
在Excel的VBA中,我在程序中有一个模块开始执行:
Sub StartingProcedure()
Dim oMyApp1 As New Class1
Call oMyApp1.activateEvent
Dim oMyApp2 As New DLLname.Class1
Call oMyApp2.DLLentry
End Sub
应该捕获事件并停止执行的类模块:
Public WithEvents cls1 As DLLname.ClassStop
Private Sub cls1_StopExecutionCl()
MsgBox "Checkpoint 2"
End
End Sub
Public Sub activateEvent()
Set cls1 = New DLLname.ClassStop
End Sub
DLL&#34; DLLname.dll&#34;注册为COM并在Excel中引用。我知道DLL中的事件声明已被Excel正确检测,因为我可以从类模块的下拉菜单中选择它。
问题在于,即使&#34; Checkpoint 1&#34;达到几次(事件被提出),&#34;检查站2&#34;没有达到。
我错过了什么?这是完成我想要的最佳方式吗?
P.S。我不确定,但是我不能压制Guid
定义和Interface
ICore
?
答案 0 :(得分:0)
在评论中使用@Tim Williams指导实现了工作代码。
在DLL中:
User
在一个模块中:
Imports System.Runtime.InteropServices
<ComVisible(True)>
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>
<Guid("28C7DCE1-90EF-4a30-AF7F-4187F9FFFDEB")>
Public Interface ICoreEvents
<DispId(1)>
Sub StopExecutionCl()
End Interface
<ComVisible(True)>
<InterfaceType(ComInterfaceType.InterfaceIsDual)>
<Guid("86CE5E8D-777D-4cd5-8A7D-7F58737F1DB4")>
Public Interface ICore
Sub DLLentry()
End Interface
<ComVisible(True)>
<ClassInterface(ClassInterfaceType.None)>
<ComDefaultInterface(GetType(ICore))>
<ComSourceInterfaces(GetType(ICoreEvents))>
<Guid("C58721B1-15B3-4eeb-9E1E-BCDA33D38EE6")>
Public Class Class1
Implements ICore
Public Event StopExecutionCl()
Sub stopExec()
MsgBox("Checkpoint 1")
RaiseEvent StopExecutionCl()
End Sub
Sub DLLentry() Implements ICore.DLLentry
AddHandler StopExecution, AddressOf stopExec
DLLprocedure1()
End Sub
End Class
在Excel的VBA中 - 类模块Module Module1
Public Event StopExecution()
Sub DLLprocedure1()
'Operations that in certain circumstances must stop the execution
RaiseEvent StopExecution()
End Sub
End Module
:
Class1
在一个模块中:
Public WithEvents cls1 As DLLname.Class1
Private Sub cls1_StopExecutionCl()
MsgBox "Checkpoint 2"
End
End Sub