楼主 xtanuihazfh |
装了VSTO也很久了,但是因为时间关系,没有进行研究,这个任务窗格是很久以前就做了,但是查找功能是今天才补上的,不得不说,我确实太懒了 它的主要用途是用来习惯一下VB.NET的语法与熟悉它的控件,treeview与listview啥的, 通过这个东西确实体会到了vsto的强大,远超VBA的强大,起码好看是能够看到的 废话不多说,我喜欢用动画来说明问题
------------------------------------------------------------------- 补充:大家安装以前可能要看一下电脑上的.net framework的版本,因为我用的VS2010,所以只有4.0的版本才能支持,先装了这个东西装了加载项才能正常工作 还有,卸载要通过控制面板来删除程序
------------------------------------------------------------------- 再补充:这个.net framework4.0太大了,传不上来,给个传送门吧 http://dl.pconline.com.cn/download/54972-1.html ------------------------------------------------------------------- 安装加载项的程序
自定义任务窗格.zip |
2楼 xtanuihazfh |
1.新建项目 启动VS,我的版本是VS2010
进入启动界面
在左侧找到新建项目,点击它会弹出新建项目的对话框 选择.net framework4中的Excel2007Add-In(版本因人而异)项目
设置好它的名称与保存位置 |
3楼 xtanuihazfh |
2. 创建任务窗格 点击菜单项项目=>添加用户控件
然后会弹出下面的对话框,选择用户控件并设置其名称
调整到合适大小
|
4楼 xtanuihazfh |
3. 添加控件 然后在创建的这个用户控件上添加一个选项卡控件(TabControl)
画好控件,我们设置它的Dock属性为Fill
打开属性窗口,找到它的TabPages属性,点击后面的按钮将展开它的多页属性对话框
在此处可以添加或删除选项卡,我们只要一个就够了,设置其Text属性为:工作簿任务 然后在选项卡上添加一个TreeView控件,设置其Dock属性为Top, 然后在下面添加一个Spliter控件设置其Dock属性为Top, 再添加一个文本框控件(TextBox), 设置其Dock属性为Top, 最后添加一个ListView控件, 设置其Dock属性为Fill 完成后的布局如下图
|
5楼 xtanuihazfh |
4. 添加任务窗格代码
在ThisAddin模块顶部定义两个变量
- Private MyPane As Microsoft.Office.Tools.CustomTaskPane
- Private MyControl As MyTaskPane
然后在ThisAddin_AtartUp事件中加入以下代码
- Private Sub ThisAddIn_Startup() Handles Me.Startup
- MyControl = New MyTaskPane
- MyPane = Me.CustomTaskPanes.Add(MyControl, "测试任务窗格")
- MyPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft
- Call ShowPane()
- End Sub
在ThisAddin_Shutdown事件中加入以下代码
- Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
- MyControl = Nothing
- MyPane = Nothing
- End Sub
代码完成后如下图所示
接下来添加用于触发刷新TreeView 控件事件的代码
- Private Sub Application_WorkbookActivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookActivate
- Call MyControl.FillTvw()
- End Sub
-
- Private Sub Application_WorkbookDeactivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookDeactivate
- Call MyControl.FillTvw()
- End Sub
- Private Sub ShowPane()
- MyPane.Visible = True
- End Sub
到此,就完成了任务窗格的创建,下面我们将给它加入一些功能如:显示打开的工作簿与工作表列表,与多工作簿查找 |
6楼 xtanuihazfh |
5. 工作表列表功能的实现
在MyTaskPane模块项部添加以下代码
- Imports Microsoft.Office.Interop.Excel
- '导入Excel命名空间
- Imports System.Windows.Forms
- '导入窗体命名空间
然后在Class MyTaskPane的项部添加以下代码:- Private XlApp As Excel.Application
- '定义一个变量用于控制Excel.Application对象
接下来在MyTaskPane_Load事件中添加以下代码
- Private Sub MyTaskPane_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- With ListView1
- '初始化Listview
- .View = View.Details
- .GridLines = True
- .FullRowSelect = True
- .HotTracking = True
- .Columns.Add(text:="工作簿", width:=50, textAlign:=0)
- .Columns.Add(text:="工作表", width:=50, textAlign:=0)
- .Columns.Add(text:="单元格", width:=50, textAlign:=0)
- .Columns.Add(text:="值", width:=50, textAlign:=0)
- End With
- XlApp = Globals.ThisAddIn.Application
- '连接对象
- Call FillTvw()
- '刷新Treeview控件列表
- End Sub
这样就完成了任务窗格的初始化事件下面我们将添加填充TreeView 的过程
- Public Sub FillTvw()
- '刷新Treeview控件列表,在循环中将所有打开的工作簿与工作表添加到树型控件中
- Dim Tvw As TreeView = TreeView1
- Dim WB As Microsoft.Office.Interop.Excel.Workbook, WS As Microsoft.Office.Interop.Excel.Worksheet
- With Tvw.Nodes
- .Clear()
- For Each WB In XlApp.Workbooks
- .Add(WB.Name, WB.Name)
- For Each WS In WB.Sheets
- .Item(WB.Name).Nodes.Add(WS.Name, WS.Name)
- Next
- Next
- End With
- Tvw.Nodes(XlApp.ActiveWorkbook.Name).Expand()
- End Sub
在MyTaskPane控件布局中双击控件选取对应事件或在属性窗口中激活事件窗口 可以为控件设置对应的事件过程 以下是事件代码处理TreeView 与ListView 控件与用户交互的事件
- '点击树型控件的节点时激活对应工作簿中对应的工作表
- Private Sub TreeView1_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
- Dim Nd As New TreeNode
- Nd = e.Node
- XlApp.EnableEvents = False
- If Nd.Parent Is Nothing Then
- XlApp.Workbooks(Nd.Text).Activate()
- Else
- XlApp.Workbooks(Nd.Parent.Text).Worksheets(Nd.Text).Activate()
- Nd.Parent.Expand()
- End If
- XlApp.EnableEvents = True
- Nd = Nothing
- End Sub
|
7楼 xtanuihazfh |
6. 多工作簿查找功能的实现 以下是相关代码- '在文本框中按下回车键时查找文本框内容并填充Listview
- Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
- If e.KeyCode = 13 Then
- Dim Lvw As ListView = ListView1
- Dim WB As Microsoft.Office.Interop.Excel.Workbook
- Dim WS As Microsoft.Office.Interop.Excel.Worksheet
- Dim Rng As Microsoft.Office.Interop.Excel.Range
- Dim FindStr As String = TextBox1.Text
- Dim FirstAddress As String
- XlApp.ScreenUpdating = False
- With Lvw.Items
- .Clear()
- For Each WB In XlApp.Workbooks
- For Each WS In WB.Worksheets
- With WS.Cells
- Rng = .Find(What:=FindStr)
- If Not Rng Is Nothing Then
- FirstAddress = Rng.Address
- Do
- With Lvw.Items.Add(text:=WB.Name)
- .SubItems.Add(WS.Name)
- .SubItems.Add(Rng.Address)
- .SubItems.Add(Rng.Value())
- End With
- Rng = .FindNext(After:=Rng)
- Loop While Not Rng Is Nothing And Rng.Address <> FirstAddress
- End If
- End With
- Next
- Next
- End With
- XlApp.ScreenUpdating = True
- End If
- End Sub
- '点击Listview时选择对应单元格
- Private Sub ListView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.Click
- Dim Item As ListViewItem = ListView1.SelectedItems(index:=0)
- If Item Is Nothing Then Exit Sub
- With XlApp
- .Workbooks(Item.Text).Activate()
- .Worksheets(Item.SubItems(1).Text).activate()
- .ActiveSheet.range(Item.SubItems(2).Text).select()
- End With
- End Sub
此时,我们完成的自定义任务窗格中的所有代码
7. 调试项目 添加完所有代码后我们便可以调试我们的项目了,按下F5调试,期间出现问题,可以选相关代码下F1查找帮助
8. 发布项目 调试完所有的程序部分确认无误后便可以发布项目了
点击生成菜单下的 发布 <项目名称>命令便可以发布项目了
在发布项目对话框中指定发布的目录后,VS2010会自动生成所有项目完成的文件(包含安装程序),我们可以找到目录下运行安装程序确认 结束语:到此,我们完成了一个Excel中自定义任务窗格加载项的所有过程,虽然其间的代码不多,但是涉及到了程序中最常用的两个控件:Listview与Teeview,通过这个演示,可以熟悉VB.NET的语法结构,大家也可以不拘泥于我的演示中的功能,自己设计出属于自己的OFFICE加载项程序,在此分享一下我的学习方法,看到别人的代码例子之后,看几遍,记下它的相关代码与算法,然后关掉它,自己试着做出来,遇到不会的东西,再打开示例去学习,然后再关掉试着做,期间尽量少地去看别人的东西,或是抄写一遍他的代码,都可以使自己印象更加深刻.
|
8楼 xtanuihazfh |
源代码与WORD版本教程
自定义任务窗格.rar
VSTO开发Excel任务窗格的例子.rar |
9楼 wise |
不错,挺完整 |
10楼 nzkboy |
很好的东东,我喜欢,收下了 |
11楼 xtanuihazfh |
装了VSTO也很久了,但是因为时间关系,没有进行研究,这个任务窗格是很久以前就做了,但是查找功能是今天才补上的,不得不说,我确实太懒了 它的主要用途是用来习惯一下VB.NET的语法与熟悉它的控件,treeview与listview啥的, 通过这个东西确实体会到了vsto的强大,远超VBA的强大,起码好看是能够看到的 废话不多说,我喜欢用动画来说明问题
------------------------------------------------------------------- 补充:大家安装以前可能要看一下电脑上的.net framework的版本,因为我用的VS2010,所以只有4.0的版本才能支持,先装了这个东西装了加载项才能正常工作 还有,卸载要通过控制面板来删除程序
------------------------------------------------------------------- 再补充:这个.net framework4.0太大了,传不上来,给个传送门吧 http://dl.pconline.com.cn/download/54972-1.html ------------------------------------------------------------------- 安装加载项的程序
自定义任务窗格.zip |
12楼 xtanuihazfh |
1.新建项目 启动VS,我的版本是VS2010
进入启动界面
在左侧找到新建项目,点击它会弹出新建项目的对话框 选择.net framework4中的Excel2007Add-In(版本因人而异)项目
设置好它的名称与保存位置 |
13楼 xtanuihazfh |
2. 创建任务窗格 点击菜单项项目=>添加用户控件
然后会弹出下面的对话框,选择用户控件并设置其名称
调整到合适大小
|
14楼 xtanuihazfh |
3. 添加控件 然后在创建的这个用户控件上添加一个选项卡控件(TabControl)
画好控件,我们设置它的Dock属性为Fill
打开属性窗口,找到它的TabPages属性,点击后面的按钮将展开它的多页属性对话框
在此处可以添加或删除选项卡,我们只要一个就够了,设置其Text属性为:工作簿任务 然后在选项卡上添加一个TreeView控件,设置其Dock属性为Top, 然后在下面添加一个Spliter控件设置其Dock属性为Top, 再添加一个文本框控件(TextBox), 设置其Dock属性为Top, 最后添加一个ListView控件, 设置其Dock属性为Fill 完成后的布局如下图
|
15楼 xtanuihazfh |
4. 添加任务窗格代码
在ThisAddin模块顶部定义两个变量
- Private MyPane As Microsoft.Office.Tools.CustomTaskPane
- Private MyControl As MyTaskPane
然后在ThisAddin_AtartUp事件中加入以下代码
- Private Sub ThisAddIn_Startup() Handles Me.Startup
- MyControl = New MyTaskPane
- MyPane = Me.CustomTaskPanes.Add(MyControl, "测试任务窗格")
- MyPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft
- Call ShowPane()
- End Sub
在ThisAddin_Shutdown事件中加入以下代码
- Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
- MyControl = Nothing
- MyPane = Nothing
- End Sub
代码完成后如下图所示
接下来添加用于触发刷新TreeView 控件事件的代码
- Private Sub Application_WorkbookActivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookActivate
- Call MyControl.FillTvw()
- End Sub
-
- Private Sub Application_WorkbookDeactivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookDeactivate
- Call MyControl.FillTvw()
- End Sub
- Private Sub ShowPane()
- MyPane.Visible = True
- End Sub
到此,就完成了任务窗格的创建,下面我们将给它加入一些功能如:显示打开的工作簿与工作表列表,与多工作簿查找 |
16楼 xtanuihazfh |
5. 工作表列表功能的实现
在MyTaskPane模块项部添加以下代码
- Imports Microsoft.Office.Interop.Excel
- '导入Excel命名空间
- Imports System.Windows.Forms
- '导入窗体命名空间
然后在Class MyTaskPane的项部添加以下代码:- Private XlApp As Excel.Application
- '定义一个变量用于控制Excel.Application对象
接下来在MyTaskPane_Load事件中添加以下代码
- Private Sub MyTaskPane_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- With ListView1
- '初始化Listview
- .View = View.Details
- .GridLines = True
- .FullRowSelect = True
- .HotTracking = True
- .Columns.Add(text:="工作簿", width:=50, textAlign:=0)
- .Columns.Add(text:="工作表", width:=50, textAlign:=0)
- .Columns.Add(text:="单元格", width:=50, textAlign:=0)
- .Columns.Add(text:="值", width:=50, textAlign:=0)
- End With
- XlApp = Globals.ThisAddIn.Application
- '连接对象
- Call FillTvw()
- '刷新Treeview控件列表
- End Sub
这样就完成了任务窗格的初始化事件下面我们将添加填充TreeView 的过程
- Public Sub FillTvw()
- '刷新Treeview控件列表,在循环中将所有打开的工作簿与工作表添加到树型控件中
- Dim Tvw As TreeView = TreeView1
- Dim WB As Microsoft.Office.Interop.Excel.Workbook, WS As Microsoft.Office.Interop.Excel.Worksheet
- With Tvw.Nodes
- .Clear()
- For Each WB In XlApp.Workbooks
- .Add(WB.Name, WB.Name)
- For Each WS In WB.Sheets
- .Item(WB.Name).Nodes.Add(WS.Name, WS.Name)
- Next
- Next
- End With
- Tvw.Nodes(XlApp.ActiveWorkbook.Name).Expand()
- End Sub
在MyTaskPane控件布局中双击控件选取对应事件或在属性窗口中激活事件窗口 可以为控件设置对应的事件过程 以下是事件代码处理TreeView 与ListView 控件与用户交互的事件
- '点击树型控件的节点时激活对应工作簿中对应的工作表
- Private Sub TreeView1_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
- Dim Nd As New TreeNode
- Nd = e.Node
- XlApp.EnableEvents = False
- If Nd.Parent Is Nothing Then
- XlApp.Workbooks(Nd.Text).Activate()
- Else
- XlApp.Workbooks(Nd.Parent.Text).Worksheets(Nd.Text).Activate()
- Nd.Parent.Expand()
- End If
- XlApp.EnableEvents = True
- Nd = Nothing
- End Sub
|
17楼 xtanuihazfh |
6. 多工作簿查找功能的实现 以下是相关代码- '在文本框中按下回车键时查找文本框内容并填充Listview
- Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
- If e.KeyCode = 13 Then
- Dim Lvw As ListView = ListView1
- Dim WB As Microsoft.Office.Interop.Excel.Workbook
- Dim WS As Microsoft.Office.Interop.Excel.Worksheet
- Dim Rng As Microsoft.Office.Interop.Excel.Range
- Dim FindStr As String = TextBox1.Text
- Dim FirstAddress As String
- XlApp.ScreenUpdating = False
- With Lvw.Items
- .Clear()
- For Each WB In XlApp.Workbooks
- For Each WS In WB.Worksheets
- With WS.Cells
- Rng = .Find(What:=FindStr)
- If Not Rng Is Nothing Then
- FirstAddress = Rng.Address
- Do
- With Lvw.Items.Add(text:=WB.Name)
- .SubItems.Add(WS.Name)
- .SubItems.Add(Rng.Address)
- .SubItems.Add(Rng.Value())
- End With
- Rng = .FindNext(After:=Rng)
- Loop While Not Rng Is Nothing And Rng.Address <> FirstAddress
- End If
- End With
- Next
- Next
- End With
- XlApp.ScreenUpdating = True
- End If
- End Sub
- '点击Listview时选择对应单元格
- Private Sub ListView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.Click
- Dim Item As ListViewItem = ListView1.SelectedItems(index:=0)
- If Item Is Nothing Then Exit Sub
- With XlApp
- .Workbooks(Item.Text).Activate()
- .Worksheets(Item.SubItems(1).Text).activate()
- .ActiveSheet.range(Item.SubItems(2).Text).select()
- End With
- End Sub
此时,我们完成的自定义任务窗格中的所有代码
7. 调试项目 添加完所有代码后我们便可以调试我们的项目了,按下F5调试,期间出现问题,可以选相关代码下F1查找帮助
8. 发布项目 调试完所有的程序部分确认无误后便可以发布项目了
点击生成菜单下的 发布 <项目名称>命令便可以发布项目了
在发布项目对话框中指定发布的目录后,VS2010会自动生成所有项目完成的文件(包含安装程序),我们可以找到目录下运行安装程序确认 结束语:到此,我们完成了一个Excel中自定义任务窗格加载项的所有过程,虽然其间的代码不多,但是涉及到了程序中最常用的两个控件:Listview与Teeview,通过这个演示,可以熟悉VB.NET的语法结构,大家也可以不拘泥于我的演示中的功能,自己设计出属于自己的OFFICE加载项程序,在此分享一下我的学习方法,看到别人的代码例子之后,看几遍,记下它的相关代码与算法,然后关掉它,自己试着做出来,遇到不会的东西,再打开示例去学习,然后再关掉试着做,期间尽量少地去看别人的东西,或是抄写一遍他的代码,都可以使自己印象更加深刻.
|
18楼 xtanuihazfh |
源代码与WORD版本教程
自定义任务窗格.rar
VSTO开发Excel任务窗格的例子.rar |
19楼 wise |
不错,挺完整 |
20楼 nzkboy |
很好的东东,我喜欢,收下了 |