ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: xtanuihazfh

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

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-11 18:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

3. 添加控件

本帖已被收录到知识树中,索引项:VSTO开发
3.        添加控件
然后在创建的这个用户控件上添加一个选项卡控件(TabControl)
001.jpg ,画好控件,我们设置它的Dock属性为Fil 002.jpg
打开属性窗口,找到它的TabPages属性,点击后面的按钮将展开它的多页属性对话框
003.jpg
在此处可以添加或删除选项卡,我们只要一个就够了,设置其Text属性为:工作簿任务
然后在选项卡上添加一个TreeView控件,设置其Dock属性为Top,
然后在下面添加一个Spliter控件设置其Dock属性为Top,
再添加一个文本框控件(TextBox), 设置其Dock属性为Top,
最后添加一个ListView控件, 设置其Dock属性为Fill
完成后的布局如下图
004.jpg
接下来,我们来为我们的加载项添加事件代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-11 18:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

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
        代码完成后如下图所示
001.jpg
接下来添加用于触发刷新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



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

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-11 19:01 | 显示全部楼层

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控件布局中双击控件选取对应事件或在属性窗口中激活事件窗口

001.jpg 可以为控件设置对应的事件过程 002.jpg
以下是事件代码
以下是处理TreeViewListView控件与用户交互的事件

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

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-11 19:03 | 显示全部楼层

6. 多工作簿查找功能的实现7. 调试项目8. 发布项目

以下是相关代码
    '在文本框中按下回车键时查找文本框内容并填充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.        发布项目
调试完所有的程序部分确认无误后便可以发布项目了
001.jpg 点击生成菜单下的
发布 <项目名称>命令便可以发布项目了

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


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

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-11 19:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
上传源代码与WORD版本教程,放在同一目录下解压即可

自定义任务窗格.part1.rar

195.31 KB, 下载次数: 2085

自定义任务窗格.part2.rar

131.48 KB, 下载次数: 1863

VSTO开发Excel任务窗格的例子.part1.rar

195.31 KB, 下载次数: 1906

VSTO开发Excel任务窗格的例子.part2.rar

195.31 KB, 下载次数: 1855

VSTO开发Excel任务窗格的例子.part3.rar

195.31 KB, 下载次数: 1817

VSTO开发Excel任务窗格的例子.part4.rar

195.31 KB, 下载次数: 1788

VSTO开发Excel任务窗格的例子.part5.rar

80.17 KB, 下载次数: 1705

TA的精华主题

TA的得分主题

发表于 2011-6-11 20:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-6-11 20:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
虽然看不懂,先做个记号慢慢学

TA的精华主题

TA的得分主题

发表于 2011-6-11 20:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-6-11 21:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-6-11 22:31 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-27 03:32 , Processed in 0.050195 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表