重復步驟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當前選中的項對應的工作?。┨砑拥絃istBox2,,判斷哪個是活動工作表,并且把活動工作表對應的項選中,。添加以下過程:
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”項,,選擇“功能區(qū)(可視化編輯器)”項,,修改名稱為“PaneRibbon”,單擊“添加”,。(如果選擇“功能區(qū) (XML)”選項,,編寫XML代碼也可以實現上面功能區(qū),。)
7,、在出現的新窗口里單擊“TabAddIns (內置)”選項卡,在屬性窗口按圖9修改,,單擊“Group1”組,,在屬性窗口清空“Label”屬性的內容(也可以輸入你想要的內容),按圖10修改,。
重復步驟3在組內添加一個“ToggleButton”控件(展開“Office 功能區(qū)控件”前+號可找到該控件),,設置其“ControlSize”屬性為“RibbonControlSizeLarge”,設置其“Label”屬性為“任務管理”,,設置其“Image”屬性,,出現如圖11窗口,選擇“本地資源”—“導入”—選擇準備好的文件(最好使用PNG格式的文件)—單擊“確定”。最終效果如圖8,。
至此功能區(qū)也做好了,,下面添加代碼實現一定的功能
9、在“解決方案資源管理器”里雙擊“ThisAddIn.vb”,,在模塊頂部聲明區(qū)添加如下聲明:
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
窗格顯示狀態(tài)改變時功能區(qū)按鈕的狀態(tài)應隨著變化,,例如,,單擊任務窗格上的關閉按鈕,功能區(qū)的按鈕狀態(tài)應該變?yōu)槲催x中狀態(tài),。添加如下代碼:
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時會默認新建一個工作薄,,如果繼續(xù)打開其他工作薄,默認新建的工作薄會消失,,因此在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,、單擊功能區(qū)上我們添加的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可以看到效果,。再次單擊“生成”—選擇“發(fā)布 任務管理”,在出現的窗口里單擊“瀏覽”,,選擇保存位置,,單擊“完成”,生成的文件可以安裝,,在控制面板中可以卸載,。(計算機上必須要安裝有.net framework 4.0),保存項目,。
上面的安裝程序制作是簡單方法,,是部署功能的簡化,,采用部署功能制作安裝程序更正規(guī)一些。由于vs的部署牽扯的東西較多,,比如安全,,版本等,是一個很復雜的功能,,下面只是簡單演示如何制作加載項的安裝程序,。先上安裝程序,稍后上源碼,。