这里为大家演示一个使用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 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|