ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > Excel VBA > VSTO开发Excel任务窗格的例子(附制作教程与源代码)

VSTO开发Excel任务窗格的例子(附制作教程与源代码)

作者:绿色风 分类: 时间:2022-08-17 浏览:170
楼主
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模块顶部定义两个变量

   

  1. Private MyPane As Microsoft.Office.Tools.CustomTaskPane
  2.     Private MyControl As MyTaskPane



然后在ThisAddin_AtartUp事件中加入以下代码



   

  1. Private Sub ThisAddIn_Startup() Handles Me.Startup
  2.         MyControl = New MyTaskPane
  3.         MyPane = Me.CustomTaskPanes.Add(MyControl, "测试任务窗格")
  4.         MyPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft
  5.         Call ShowPane()
  6.     End Sub


ThisAddin_Shutdown事件中加入以下代码





  1.     Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
  2.         MyControl = Nothing
  3.         MyPane = Nothing
  4. End Sub





代码完成后如下图所示




 






接下来添加用于触发刷新TreeView控件事件的代码

   

  1.   Private Sub Application_WorkbookActivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookActivate

  2.      Call MyControl.FillTvw()

  3.   End Sub
  4.   
  5.   Private Sub Application_WorkbookDeactivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookDeactivate

  6.        Call MyControl.FillTvw()

  7.   End Sub

  8.      Private Sub ShowPane()

  9. MyPane.Visible = True

  10.      End Sub




到此,就完成了任务窗格的创建,下面我们将给它加入一些功能如:显示打开的工作簿与工作表列表,与多工作簿查找
6楼
xtanuihazfh
5. 工作表列表功能的实现

MyTaskPane模块项部添加以下代码



  1. Imports Microsoft.Office.Interop.Excel
  2. '导入Excel命名空间
  3. Imports System.Windows.Forms
  4. '导入窗体命名空间


然后在
ClassMyTaskPane的项部添加以下代码:


  1.     Private XlApp As Excel.Application
  2. '定义一个变量用于控制Excel.Application对象


接下来在MyTaskPane_Load事件中添加以下代码



  1. Private Sub MyTaskPane_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.         With ListView1
  3. '初始化Listview
  4. .View = View.Details
  5. .GridLines = True
  6. .FullRowSelect = True
  7. .HotTracking = True
  8. .Columns.Add(text:="工作簿", width:=50, textAlign:=0)
  9. .Columns.Add(text:="工作表", width:=50, textAlign:=0)
  10. .Columns.Add(text:="单元格", width:=50, textAlign:=0)
  11. .Columns.Add(text:="值", width:=50, textAlign:=0)
  12.         End With

  13. XlApp = Globals.ThisAddIn.Application
  14. '连接对象
  15.         Call FillTvw()
  16. '刷新Treeview控件列表
  17.     End Sub


这样就完成了任务窗格的初始化事件下面我们将添加填充TreeView的过程




  1.     Public Sub FillTvw()
  2. '刷新Treeview控件列表,在循环中将所有打开的工作簿与工作表添加到树型控件中
  3.         Dim Tvw As TreeView = TreeView1
  4.         Dim WB As Microsoft.Office.Interop.Excel.Workbook, WS As Microsoft.Office.Interop.Excel.Worksheet
  5.         With Tvw.Nodes
  6. .Clear()
  7.             For Each WB In XlApp.Workbooks
  8. .Add(WB.Name, WB.Name)
  9.                 For Each WS In WB.Sheets
  10. .Item(WB.Name).Nodes.Add(WS.Name, WS.Name)
  11.      Next
  12.             Next
  13.         End With
  14. Tvw.Nodes(XlApp.ActiveWorkbook.Name).Expand()
  15. End Sub



MyTaskPane控件布局中双击控件选取对应事件或在属性窗口中激活事件窗口


 



可以为控件设置对应的事件过程



 





以下是事件代码

处理TreeViewListView控件与用户交互的事件

  1. '点击树型控件的节点时激活对应工作簿中对应的工作表

  2. Private Sub TreeView1_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
  3. Dim Nd As New TreeNode
  4. Nd = e.Node
  5. XlApp.EnableEvents = False
  6. If Nd.Parent Is Nothing Then
  7. XlApp.Workbooks(Nd.Text).Activate()
  8. Else
  9. XlApp.Workbooks(Nd.Parent.Text).Worksheets(Nd.Text).Activate()
  10. Nd.Parent.Expand()
  11. End If
  12. XlApp.EnableEvents = True
  13. Nd = Nothing
  14. End Sub





7楼
xtanuihazfh
6. 多工作簿查找功能的实现
以下是相关代码
  1. '在文本框中按下回车键时查找文本框内容并填充Listview
  2.     Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
  3.         If e.KeyCode = 13 Then
  4.             Dim Lvw As ListView = ListView1
  5.             Dim WB As Microsoft.Office.Interop.Excel.Workbook
  6.             Dim WS As Microsoft.Office.Interop.Excel.Worksheet
  7.             Dim Rng As Microsoft.Office.Interop.Excel.Range
  8.             Dim FindStr As String = TextBox1.Text
  9.             Dim FirstAddress As String
  10.             XlApp.ScreenUpdating = False
  11.             With Lvw.Items
  12.                 .Clear()
  13.                 For Each WB In XlApp.Workbooks
  14.                     For Each WS In WB.Worksheets
  15.                         With WS.Cells
  16.                             Rng = .Find(What:=FindStr)
  17.                             If Not Rng Is Nothing Then
  18.                                 FirstAddress = Rng.Address
  19.                                 Do
  20.                                     With Lvw.Items.Add(text:=WB.Name)
  21.                                         .SubItems.Add(WS.Name)
  22.                                         .SubItems.Add(Rng.Address)
  23.                                         .SubItems.Add(Rng.Value())
  24.                                     End With
  25.                                     Rng = .FindNext(After:=Rng)
  26.                                 Loop While Not Rng Is Nothing And Rng.Address <> FirstAddress
  27.                             End If
  28.                         End With
  29.                     Next
  30.                 Next
  31.             End With
  32.             XlApp.ScreenUpdating = True
  33.         End If
  34.     End Sub

  35.     '点击Listview时选择对应单元格
  36.     Private Sub ListView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.Click
  37.         Dim Item As ListViewItem = ListView1.SelectedItems(index:=0)
  38.         If Item Is Nothing Then Exit Sub
  39.         With XlApp
  40.             .Workbooks(Item.Text).Activate()
  41.             .Worksheets(Item.SubItems(1).Text).activate()
  42.             .ActiveSheet.range(Item.SubItems(2).Text).select()
  43.         End With
  44.     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模块顶部定义两个变量

   

  1. Private MyPane As Microsoft.Office.Tools.CustomTaskPane
  2.     Private MyControl As MyTaskPane



然后在ThisAddin_AtartUp事件中加入以下代码



   

  1. Private Sub ThisAddIn_Startup() Handles Me.Startup
  2.         MyControl = New MyTaskPane
  3.         MyPane = Me.CustomTaskPanes.Add(MyControl, "测试任务窗格")
  4.         MyPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft
  5.         Call ShowPane()
  6.     End Sub


ThisAddin_Shutdown事件中加入以下代码





  1.     Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
  2.         MyControl = Nothing
  3.         MyPane = Nothing
  4. End Sub





代码完成后如下图所示




 






接下来添加用于触发刷新TreeView控件事件的代码

   

  1.   Private Sub Application_WorkbookActivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookActivate

  2.      Call MyControl.FillTvw()

  3.   End Sub
  4.   
  5.   Private Sub Application_WorkbookDeactivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookDeactivate

  6.        Call MyControl.FillTvw()

  7.   End Sub

  8.      Private Sub ShowPane()

  9. MyPane.Visible = True

  10.      End Sub




到此,就完成了任务窗格的创建,下面我们将给它加入一些功能如:显示打开的工作簿与工作表列表,与多工作簿查找
16楼
xtanuihazfh
5. 工作表列表功能的实现

MyTaskPane模块项部添加以下代码



  1. Imports Microsoft.Office.Interop.Excel
  2. '导入Excel命名空间
  3. Imports System.Windows.Forms
  4. '导入窗体命名空间


然后在
ClassMyTaskPane的项部添加以下代码:


  1.     Private XlApp As Excel.Application
  2. '定义一个变量用于控制Excel.Application对象


接下来在MyTaskPane_Load事件中添加以下代码



  1. Private Sub MyTaskPane_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.         With ListView1
  3. '初始化Listview
  4. .View = View.Details
  5. .GridLines = True
  6. .FullRowSelect = True
  7. .HotTracking = True
  8. .Columns.Add(text:="工作簿", width:=50, textAlign:=0)
  9. .Columns.Add(text:="工作表", width:=50, textAlign:=0)
  10. .Columns.Add(text:="单元格", width:=50, textAlign:=0)
  11. .Columns.Add(text:="值", width:=50, textAlign:=0)
  12.         End With

  13. XlApp = Globals.ThisAddIn.Application
  14. '连接对象
  15.         Call FillTvw()
  16. '刷新Treeview控件列表
  17.     End Sub


这样就完成了任务窗格的初始化事件下面我们将添加填充TreeView的过程




  1.     Public Sub FillTvw()
  2. '刷新Treeview控件列表,在循环中将所有打开的工作簿与工作表添加到树型控件中
  3.         Dim Tvw As TreeView = TreeView1
  4.         Dim WB As Microsoft.Office.Interop.Excel.Workbook, WS As Microsoft.Office.Interop.Excel.Worksheet
  5.         With Tvw.Nodes
  6. .Clear()
  7.             For Each WB In XlApp.Workbooks
  8. .Add(WB.Name, WB.Name)
  9.                 For Each WS In WB.Sheets
  10. .Item(WB.Name).Nodes.Add(WS.Name, WS.Name)
  11.      Next
  12.             Next
  13.         End With
  14. Tvw.Nodes(XlApp.ActiveWorkbook.Name).Expand()
  15. End Sub



MyTaskPane控件布局中双击控件选取对应事件或在属性窗口中激活事件窗口


 



可以为控件设置对应的事件过程



 





以下是事件代码

处理TreeViewListView控件与用户交互的事件

  1. '点击树型控件的节点时激活对应工作簿中对应的工作表

  2. Private Sub TreeView1_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
  3. Dim Nd As New TreeNode
  4. Nd = e.Node
  5. XlApp.EnableEvents = False
  6. If Nd.Parent Is Nothing Then
  7. XlApp.Workbooks(Nd.Text).Activate()
  8. Else
  9. XlApp.Workbooks(Nd.Parent.Text).Worksheets(Nd.Text).Activate()
  10. Nd.Parent.Expand()
  11. End If
  12. XlApp.EnableEvents = True
  13. Nd = Nothing
  14. End Sub





17楼
xtanuihazfh
6. 多工作簿查找功能的实现
以下是相关代码
  1. '在文本框中按下回车键时查找文本框内容并填充Listview
  2.     Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
  3.         If e.KeyCode = 13 Then
  4.             Dim Lvw As ListView = ListView1
  5.             Dim WB As Microsoft.Office.Interop.Excel.Workbook
  6.             Dim WS As Microsoft.Office.Interop.Excel.Worksheet
  7.             Dim Rng As Microsoft.Office.Interop.Excel.Range
  8.             Dim FindStr As String = TextBox1.Text
  9.             Dim FirstAddress As String
  10.             XlApp.ScreenUpdating = False
  11.             With Lvw.Items
  12.                 .Clear()
  13.                 For Each WB In XlApp.Workbooks
  14.                     For Each WS In WB.Worksheets
  15.                         With WS.Cells
  16.                             Rng = .Find(What:=FindStr)
  17.                             If Not Rng Is Nothing Then
  18.                                 FirstAddress = Rng.Address
  19.                                 Do
  20.                                     With Lvw.Items.Add(text:=WB.Name)
  21.                                         .SubItems.Add(WS.Name)
  22.                                         .SubItems.Add(Rng.Address)
  23.                                         .SubItems.Add(Rng.Value())
  24.                                     End With
  25.                                     Rng = .FindNext(After:=Rng)
  26.                                 Loop While Not Rng Is Nothing And Rng.Address <> FirstAddress
  27.                             End If
  28.                         End With
  29.                     Next
  30.                 Next
  31.             End With
  32.             XlApp.ScreenUpdating = True
  33.         End If
  34.     End Sub

  35.     '点击Listview时选择对应单元格
  36.     Private Sub ListView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.Click
  37.         Dim Item As ListViewItem = ListView1.SelectedItems(index:=0)
  38.         If Item Is Nothing Then Exit Sub
  39.         With XlApp
  40.             .Workbooks(Item.Text).Activate()
  41.             .Worksheets(Item.SubItems(1).Text).activate()
  42.             .ActiveSheet.range(Item.SubItems(2).Text).select()
  43.         End With
  44.     End Sub
此时,我们完成的自定义任务窗格中的所有代码

7. 调试项目
添加完所有代码后我们便可以调试我们的项目了,按下F5调试,期间出现问题,可以选相关代码下F1查找帮助

8. 发布项目
调试完所有的程序部分确认无误后便可以发布项目了



点击生成菜单下的
发布 <项目名称>命令便可以发布项目了





 




在发布项目对话框中指定发布的目录后,VS2010会自动生成所有项目完成的文件(包含安装程序),我们可以找到目录下运行安装程序确认




 


结束语:到此,我们完成了一个Excel中自定义任务窗格加载项的所有过程,虽然其间的代码不多,但是涉及到了程序中最常用的两个控件:Listview与Teeview,通过这个演示,可以熟悉VB.NET的语法结构,大家也可以不拘泥于我的演示中的功能,自己设计出属于自己的OFFICE加载项程序,在此分享一下我的学习方法,看到别人的代码例子之后,看几遍,记下它的相关代码与算法,然后关掉它,自己试着做出来,遇到不会的东西,再打开示例去学习,然后再关掉试着做,期间尽量少地去看别人的东西,或是抄写一遍他的代码,都可以使自己印象更加深刻.


18楼
xtanuihazfh
源代码与WORD版本教程



自定义任务窗格.rar



VSTO开发Excel任务窗格的例子.rar
19楼
wise
不错,挺完整
20楼
nzkboy
很好的东东,我喜欢,收下了

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap