这里为大家演示一个使用VB.Net为Excel开发COM AddIn的示例。本实例可以实现工作簿中隐藏与取消隐藏工作表。该功能原来是我采用Excel加载宏.xla开发的。废话少说,进入正题。
(1)首先开启VB.Net然后新建一个项目。依次选择“其他项目类型”--“扩展性”--“共享的外接程序”。修改好名称、位置后,选择确定按钮。如下图所示。
(2)在随后的连续设置对话框中1号对话框选择“使用VB创建外接程序”。二号对话框选择“Microsoft Excel”。三号对话框中设置外接程序名称和说明。四号对话框勾选两个复选框。五号对话框选择完成按钮。
(3)在资源管理器窗口中右击工程,然后选择属性。选择引用栏,查看是否引用了以下内容。如果没有选择添加按钮,然后依次将这些引用添加进来。所有引用内容可以见图。
Extensibility(V7.0.3300.0)
Microsoft Excel 12.0 Object Library(ActiveX V1.6.0.0)
Microsoft Office 12.0 Object Library(ActiveX V2.4.0.0)
Microsoft Visual Basic for Applications Extensibility 5.3(ActiveX V5.3.0.0)
System
System.Data
System.Drawing
System.Windows.Forms
System.Xml
(4)在资源管理器窗口中找到connect.vb并打开其代码窗口。然后在该其中输入以下代码。部分代码是VB.Net自动生成的,我只对加进去的代码作解释,另外各个过程与事件过程的作用略作说明。
Imports Extensibility '这里是名称空间
Imports System.Runtime.InteropServices
Imports Microsoft.Office.Core
Imports Microsoft.Office.Core.MsoControlType
<GuidAttribute("4C1CFBC7-551D-4B81-B282-7E4A7D9D71DD"),ProgIdAttribute("MyCOMAddin.Connect")> _
Public Class Connect
Implements Extensibility.IDTExtensibility2 'IDTExtensibility2接口
Dim WithEvents MyButton As CommandBarButton '菜单条按钮。注意带了WithEvents关键哦,是带有事件的!
Dim applicationObject As Object '表示应用程序对象,运行后对应Excel应用程序
Dim addInInstance As Object '加载宏实例对象
'当开始关闭加载宏时,执行该事件过程
Public Sub OnBeginShutdown(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnBeginShutdown
On Error Resume Next
MyButton.Delete() '删除加载宏建立的菜单条按钮
MyButton = Nothing '清除菜单条按钮内存空间
End Sub
'当有COM加载宏卸载或添加时执行以下代码
Public Sub OnAddInsUpdate(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
End Sub
'程序启动完毕后执行该过程
Public Sub OnStartupComplete(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnStartupComplete
Dim oCommandBars As CommandBars
Dim oStandardBar As CommandBar
Dim oBarPopup As CommandBarPopup
On Error Resume Next
oCommandBars = applicationObject.CommandBars '获取Excel应用程序的CommandBars对象
oStandardBar = oCommandBars.Item("Standard") '获取“标准”CommandBar对象
oBarPopup = oStandardBar.Controls.Add(Type:=msoControlPopup,Temporary:=True)'添加弹出菜单栏
oBarPopup.Caption = "COMAddIn" '设置弹出菜单栏Caption属性
MyButton = oBarPopup.Controls.Add(Type:=msoControlButton) '为菜单栏添加按钮
With MyButton
.Caption = "隐藏与取消隐藏工作表" '设置菜单按钮的Caption属性
.Style = MsoButtonStyle.msoButtonCaption '指定按钮的style属性
.Tag = "My Custom Button" '该行可省略,指定Tag属性
. '直接使用这个结果就可以了
.Visible = True '设置按钮可见
End With
oStandardBar = Nothing
oCommandBars = Nothing
End Sub
'加载宏断开时执行该过程
Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode,ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnDisconnection
On Error Resume Next
If RemoveMode <> Extensibility.ext_DisconnectMode.ext_dm_HostShutdown Then _
OnBeginShutdown(custom)
applicationObject = Nothing
End Sub
'连接加载宏时执行以下过程
Public Sub OnConnection(ByVal application As Object,ByVal connectMode As Extensibility.ext_ConnectMode,ByVal addInInst As Object,ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection
applicationObject = application ' 获取Excel应用程序对象
addInInstance = addInInst '获取加载宏示例对象
If (connectMode <> Extensibility.ext_ConnectMode.ext_cm_Startup) Then _
OnStartupComplete(custom)
End Sub
'菜单按钮的单击事件过程
Private Sub MyButton_Click(ByVal Ctrl As Microsoft.Office.Core.CommandBarButton,ByRef CancelDefault As Boolean) Handles MyButton.Click
Dim fm As New frmHide '实例化frmHide窗体
fm.m_appObject = applicationObject '指定窗体的m_appObject属性值
fm.Show() '显示窗体
End Sub
End Class
(5)在资源管理器中右击项目,然后依次选择“添加”--“Windows窗体”。插入一个窗体并为该窗体添加控件如下图所示。
该窗体的控件类型以及控件名称如下表所示:
控件类型 | 控件名称 |
窗体 | frmHide |
标签 | label1 |
复合框 | cmb表类型 |
列表框 | lst表名 |
复选框 | chk深度隐藏 |
按钮 | btnOK |
按钮 | btnClose |
Imports Microsoft.Office.Interop.Excel '名称空间声明段
Public Class frmHide
Enum XlSheetVisibility '定义工作表可见性枚举
xlSheetVisible = -1 '可见时的值
xlSheetHidden = 0 '隐藏时的值
xlSheetVeryHidden = 2 '深度隐藏的值
End Enum
Public WithEvents m_appObject As Application '带应用程序事件的Excel应用程序对象
'关闭按钮单击事件
Private Sub btnClose_Click(ByVal sender As Object,_
ByVal e As System.EventArgs) Handles btnClose.Click
Me.Close() '关闭窗口
End Sub
'窗体装载事件
Private Sub frmHide_Load(ByVal sender As Object,_
ByVal e As System.EventArgs) Handles Me.Load
With cmb表类型 '初始化表类型复合框
.Items.Add("可见表") '为复合框添加第一个项目
.Items.Add("隐藏表") '为复合框添加第二个项目
.SelectedIndex = 0 '设置复合框初始显示项目
End With
chk深度隐藏.Checked = False '设置复选框的勾选状态
End Sub
'自定义Sub过程,用于刷新列表框的项目
Private Sub 刷新表列表()
Dim st As worksheet
lst表名.Items.Clear() '清除列表框所有项目
For Each st In m_appObject.ActiveWorkbook.Worksheets '循环工作簿中所有工作表
If cmb表类型.Text = "可见表" Then '检查当前设置的表类型
If st.Visible = XlSheetVisibility.xlSheetVisible Then
lst表名.Items.Add(st.Name) '表可见时,添加工作表名称
End If
Else
If chk深度隐藏.Checked Then '检查深度隐藏复选框勾选状态
If st.Visible <> XlSheetVisibility.xlSheetVisible Then
lst表名.Items.Add(st.Name) '工作表不可见时,添加工作表名称
End If
Else
If st.Visible = XlSheetVisibility.xlSheetHidden Then
lst表名.Items.Add(st.Name) '工作表隐藏时,添加工作表名称
End If
End If
End If
Next
End Sub
'复合框改变事件
Private Sub cmb表类型_TextChanged(ByVal sender As Object,_
ByVal e As System.EventArgs) Handles cmb表类型.TextChanged
刷新表列表() '刷新列表框控件
If cmb表类型.Text = "可见表" Then '检测当前表类型
btnOK.Text = "隐藏" '修改确定按钮的Caption
chk深度隐藏.Text = "深度隐藏工作表" '修改复选框的Caption
Else
btnOK.Text = "取消隐藏" '修改确定按钮的Caption
chk深度隐藏.Text = "包含深度隐藏工作表" '修改复选框的Caption
End If
End Sub
'复选框单击事件
Private Sub chk深度隐藏_Click(ByVal sender As Object,_
ByVal e As System.EventArgs) Handles chk深度隐藏.Click
刷新表列表() '刷新列表框项目
End Sub
'确定按钮单击事件,该按钮可能是隐藏,也可能是取消隐藏工作表。
Private Sub btnOK_Click(ByVal sender As Object,_
ByVal e As System.EventArgs) Handles btnOK.Click
Dim HideType As XlSheetVisibility,sheetCount As Integer,i As Integer
If chk深度隐藏.Checked Then '检测深度隐藏复选框状态
HideType = XlSheetVisibility.xlSheetVeryHidden '深度隐藏
Else
HideType = XlSheetVisibility.xlSheetHidden '浅度隐藏
End If
For i = 0 To lst表名.Items.Count - 1 '遍历列表框中所有项目
If lst表名.GetSelected(i) Then '检测索引号为i的项目是否选中
If btnOK.Text = "取消隐藏" Then '确定操作类型
m_appObject.ActiveWorkbook.Sheets( _
lst表名.Items.Item(i)).Visible = True '取消隐藏工作表
Else
If lst表名.Items.Count - 1 = sheetCount Then Exit Sub '只有一个可见表时退出过程
m_appObject.ActiveWorkbook.Worksheets(lst表名.Items.Item(i)).Visible = HideType '浅度或深度隐藏工作表
sheetCount = sheetCount + 1 '统计被隐藏表的数目 End If End If Next 刷新表列表() '刷新列表框 End Sub '应用程序的工作簿激活事件,该事件可以保证用户激活其他工作簿时,窗口可以随之刷新列表框 Private Sub m_appObject_WorkbookActivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles m_appObject.WorkbookActivate 刷新表列表() '刷新列表框项目 End SubEnd Class