重复步骤3依次添加一个“Splitter”控件(展开“所有 Windows 窗体”前+号可找到该控件),在属性窗口设置其“Dock”属性为“Top”、 “Size”属性中的“Height”为5。再添加一个ListBox控件(用于显示活动工作薄中的所有表),设置其“Dock”属性为“Fill” “Font”属性为“小四”,并适当调整大小。(也可以使用Listview控件代替ListBox控件,再配合ImageList控件,这样可以让列表中的每一项都带上图标,视觉效果更好)最终效果如图6。
窗格做好了,上图就是excel里要显示的窗格的样子,但仅仅是一个没有任何功能界面。下面添加相应的代码让窗格实现一定的功能。
4、单击项目—选择“添加模块”—在出现的窗口里选择“模块”项,单击“添加”。添加如下代码:
Module Module1
Public XlApp As Excel.Application
Public bOpen As Boolean
End Module
为了能把打开的工作薄添加到ListBox1,判断哪个是活动工作薄,并且把活动工作薄对应的项选中。在“解决方案资源管理器”里右击“PaneControl.vb”—选择“查看代码”,添加以下过程(代码添加到Public Class PaneControl和End Class之间,后面其他模块里添加代码也是如此):
Public Sub FillBook()
Dim Wb As Microsoft.Office.Interop.Excel.Workbook
With ListBox1
.Items.Clear()
For Each Wb In XlApp.Workbooks
If bOpen Then
If Wb.Name <> "工作簿1" And Wb.Name <> "Book1" Then .Items.Add(Wb.Name)
Else
.Items.Add(Wb.Name)
End If
Next
If .Items.Count = 0 Then
.SelectedIndex = -1
Else
For i = 0 To .Items.Count - 1
If XlApp.ActiveWorkbook.Name = .Items(i) Then
.SelectedIndex = i
Exit For
End If
Next
End If
End With
bOpen=False
End Sub
为了能把活动工作薄的表(ListBox1当前选中的项对应的工作薄)添加到ListBox2,判断哪个是活动工作表,并且把活动工作表对应的项选中。添加以下过程:
Public Sub FillSheet()
Dim Ws As Object
With ListBox2
.Items.Clear()
For Each Ws In XlApp.Workbooks(ListBox1.Text).Sheets
.Items.Add(Ws.Name)
Next
For i = 0 To .Items.Count - 1
If XlApp.ActiveSheet.Name = .Items(i) Then
.SelectedIndex = i
Exit For
End If
Next
End With
End Sub
5、添加如下两个过程,第一个过程用于在窗格里单击不同工作薄时,在excel界面激活并显示该工作薄的内容,然后在ListBox2中显示该工作薄的所有表。第二个过程用于在窗格里单击不同工作表时,在excel界面激活并显示该工作表的内容。
Private Sub ListBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.Click
XlApp.Workbooks(ListBox1.Text).Activate()
Call FillSheet()
End Sub
Private Sub ListBox2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox2.Click
XlApp.Workbooks(ListBox1.Text).Sheets(ListBox2.Text).Activate()
End Sub
在窗格加载时连接正在使用的excel应用程序对象,并填充列表框
Private Sub PaneControl_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
XlApp = Globals.ThisAddIn.Application
Call FillBook()
Call FillSheet()
End Sub
6、单击项目—选择“添加新项”,出现如图7窗口,选择“Office”项,选择“功能区(可视化编辑器)”项,修改名称为“PaneRibbon”,单击“添加”。(如果选择“功能区 (XML)”选项,编写XML代码也可以实现上面功能区。)
7、在出现的新窗口里单击“TabAddIns (内置)”选项卡,在属性窗口按图9修改,单击“Group1”组,在属性窗口清空“Label”属性的内容(也可以输入你想要的内容),按图10修改。
重复步骤3在组内添加一个“ToggleButton”控件(展开“Office 功能区控件”前+号可找到该控件),设置其“ControlSize”属性为“RibbonControlSizeLarge”,设置其“Label”属性为“任务管理”,设置其“Image”属性,出现如图11窗口,选择“本地资源”—“导入”—选择准备好的文件(最好使用PNG格式的文件)—单击“确定”。最终效果如图8。
至此功能区也做好了,下面添加代码实现一定的功能
9、在“解决方案资源管理器”里双击“ThisAddIn.vb”,在模块顶部声明区添加如下声明:
Private MyControl As PaneControl
Private WithEvents FilePane As Microsoft.Office.Tools.CustomTaskPane
在插件加载时设置窗格并调整位置,卸载时清空。添加如下代码:
Private Sub ThisAddIn_Startup() Handles Me.Startup
MyControl = New PaneControl()
FilePane = Me.CustomTaskPanes.Add(MyControl, "任务管理")
FilePane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft
End Sub
Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
MyControl = Nothing
FilePane = Nothing
End Sub
窗格显示状态改变时功能区按钮的状态应随着变化,例如,单击任务窗格上的关闭按钮,功能区的按钮状态应该变为未选中状态。添加如下代码:
Private Sub FilePane_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles FilePane.VisibleChanged
Globals.Ribbons.PaneRibbon.ToggleButton1.Checked = FilePane.Visible
End Sub
Public ReadOnly Property TaskPane() As Microsoft.Office.Tools.CustomTaskPane
Get
Return FilePane
End Get
End Property
当我们在excel界面选择不同工作薄和工作表时应该在窗格里的两个列表框里选中活动工作薄和活动工作表对应的项。同样的道理。打开、新建、关闭工作薄,新建、删除工作表时应该实时更新窗格里的列表框,并且选中对应的项,所以添加如下代码:
Private Sub Application_SheetActivate(ByVal Sh As Object) Handles Application.SheetActivate
Call MyControl.FillSheet()
End Sub
Private Sub Application_WorkbookActivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookActivate
Call MyControl.FillBook()
Call MyControl.FillSheet()
End Sub
当只有一个工作薄时,再关闭工作薄应该清空列表框
Private Sub Application_WorkbookDeactivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookDeactivate
If XlApp.Workbooks.Count = 1 Then
MyControl.ListBox1.Items.Clear()
MyControl.ListBox2.Items.Clear()
End If
End Sub
打开excel时会默认新建一个工作薄,如果继续打开其他工作薄,默认新建的工作薄会消失,因此在xlApp_WorkbookOpen事件里利用bOpen全局变量(已经在模块里声明)配合“PaneRibbon.vb”里的Public Sub FillBook过程来实现打开工作薄时在窗格列表里清除默认新建的工作薄对应的项
Private Sub Application_WorkbookOpen(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookOpen
bOpen = True
End Sub
9、单击功能区上我们添加的ToggleButton按钮应该控制窗格显示或隐藏,在“解决方案资源管理器”里右击“PaneRibbon.vb”—选择“查看代码”,添加如下代码:
Private Sub ToggleButton1_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles ToggleButton1.Click
Globals.ThisAddIn.TaskPane.Visible = _
TryCast(sender, Microsoft.Office.Tools.Ribbon.RibbonToggleButton).Checked
End Sub
10、保存项目,单击“生成”—选择“生成 任务管理”,打开excel可以看到效果。再次单击“生成”—选择“发布 任务管理”,在出现的窗口里单击“浏览”,选择保存位置,单击“完成”,生成的文件可以安装,在控制面板中可以卸载。(计算机上必须要安装有.net framework 4.0),保存项目。
上面的安装程序制作是简单方法,是部署功能的简化,采用部署功能制作安装程序更正规一些。由于vs的部署牵扯的东西较多,比如安全,版本等,是一个很复杂的功能,下面只是简单演示如何制作加载项的安装程序。先上安装程序,稍后上源码。