原本的准备把用户接口(菜单、工具条、定制窗口等)在xll中实现,后来发现这样也不是很方便,最后就决定采用xla+xll混合方式。用户接口用xla,核心计算用xll。office自带的ANALYSIS TOOLPAK也是这种方式(ATPVBACS.XLA+ANALYS32.XLL)。
xla当然是在Excel中用VBA来实现。在xla创建菜单、工具条、定制窗口都非常的容易。但设计与xll混合使用是,就涉及两个关键的问题:
(1)xllL和xla的加载问题
当然应是先加载xll,然后再加载xla。这需要加载两个加载宏。如果只加载了xla会怎么样?可能就会出错。最好能让xla自动判断,如果已加载过xll则好,否则在VBA中动态加载xll。
Dim WASPCNPath As String
Sub auto_open()
VerifyOpen \'验证xll是否注册,如果没有注册就注册它
End Sub
\'验证xll是否注册,如果没有注册就注册它
Private Sub VerifyOpen()
Dim XLLName As String, Quote As String
Dim theArray As Variant
Dim i As Integer
Dim XLLFound As Boolean
XLLName = "WASPCN.XLL" \'XLL文件名称
\'Application.RegisteredFunctions 属性返回包含所有已登记函数列表的数组
theArray = Application.RegisteredFunctions
If Not (IsNull(theArray)) Then
For i = LBound(theArray) To UBound(theArray)
If (InStr(theArray(i, 1), XLLName)) Then \'列1 动态链接库或代码资源的名称
Exit Sub \'需要配套的xll已经注册或加载
End If
Next i
End If
Quote = String(1, 34)
WASPCNPath = ThisWorkbook.Path
WASPCNPath = WASPCNPath & "\\"
XLLFound = Application.RegisterXLL(WASPCNPath & XLLName) \'载入 XLL 代码源,并自动登记该代码源中包含的函数和命令。
If (XLLFound) Then \'如果指定代码源载入成功则本方法返回 True;否则本方法返回 False。
Exit Sub
End If
WASPCNPath = "" & "\\"
XLLFound = Application.RegisterXLL(WASPCNPath & XLLName) \'载入 XLL 代码源,并自动登记该代码源中包含的函数和命令。
If (XLLFound) Then \'如果指定代码源载入成功则本方法返回 True;否则本方法返回 False。
Exit Sub
End If
WASPCNPath = "\\LIBRARY\\WASPCN" & "\\"
XLLFound = Application.RegisterXLL(WASPCNPath & XLLName) \'载入 XLL 代码源,并自动登记该代码源中包含的函数和命令。
If (XLLFound) Then \'如果指定代码源载入成功则本方法返回 True;否则本方法返回 False。
Exit Sub
End If
\'出错信息
MsgBox ("Cannot find WASPCN.XLL")
ThisWorkbook.Close (False)
End Sub