ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] VSTO制作任务窗格源码分享

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-8-17 14:50 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
image.jpg
由于Excel2010以上版本的加载项,一个工作簿一个进程,制作任务窗格需要多个事件相互配合。Excel2010(
含2010
)版本所有工作簿是公用进程!




评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-17 14:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
image.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-17 14:55 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-17 15:03 | 显示全部楼层
本帖最后由 Excelhome112233 于 2020-8-17 15:08 编辑

image.png
依次添加两个列表框(ListView1和ListView2)还有一个分割线(Splitter),还有图标(ImageList)

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-17 15:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 Excelhome112233 于 2020-8-17 15:17 编辑

添加ListView1,Dock属性改为Top;添加Splitter,Dock属性改为Top,添加ListView2,Dock属性改为Fill
添加ImageList。所有属性改好如下图:
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-17 15:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
准备两个图标。
image.png
鼠标右键
image.png
选择图像
image.png
添加

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-17 15:24 | 显示全部楼层
Imports System.Windows.Forms
Public Class UserControl1
    Public Sub Wb()
        REM 知识点:工作簿变量(Excel.Workbook)/For next 循环/
        REM 让选中的工作簿跟着滚动条滚动(ListView1.EnsureVisible);ListView1.Items(i).Selected = True
        REM 1.依次把打开所有的工作簿添加到列表框中;2.在列表中需寻找等于当前工作簿并让滚动条滚动
        Dim wb As Excel.Workbook   '定义工作簿变量
        On Error Resume Next
        Dim i As Int16          '定义i
        REM.1.依次把打开所有的工作簿添加到列表框中
        ListView1.Items.Clear()   '添加工作簿之前清楚ListView1中内容
        For Each wb In App.Workbooks   '在打开工作簿中循环
            ListView1.Items.Add(wb.Name, 1)    '依次把工作簿的名字添加到ListView中
        Next   '结束循环
        REM 2.在列表中寻找等于当前工作簿名,并让滚动条随着滚动,同时在列表中选中当前工作簿
        REM 让列表中内容选中等于当前工作簿(ListView1.Items(i).Selected = True)
        For i = 0 To ListView1.Items.Count - 1
            If App.ActiveWorkbook.Name = ListView1.Items(i).Text Then   '如果当前工作簿等于列表中内容则
                ListView1.Items(i).Selected = True        '选中当前工作簿
                Exit For    '退出循环
            End If    '结束条件
        Next    '结束循环

        '为了让列表呈现更好的选择效果,让滚动内容呈现向下可见5个内容
        If ListView1.Items.Count - (i + 1) < 5 Then
            ListView1.EnsureVisible(ListView1.Items.Count - 1)
        Else
            ListView1.EnsureVisible(i + 5)       '让选选钟内容跟着滚动条滚动,且向下多显示5个内容
        End If
    End Sub
    Public Sub Sht()
        REM  同工作簿原理一样
        Dim sht As Excel.Worksheet, i As Int16
        REM.1.依次把正在操作的工作簿中所有工作表添加列表2中
        ListView2.Items.Clear()  '添加之前清楚所有内容,以免重复添加
        On Error Resume Next
        For Each sht In App.ActiveWorkbook.Sheets   '在操作的工作簿中所有工作表中循环
            ListView2.Items.Add(sht.Name, 0)  '依次添加到ListView2中
        Next   '结束循环
        REM 2.在列表中寻找等于当前工作表名,并让滚动条随着滚动,同时在列表中选中当前工作簿
        REM 让列表中内容选中等于当前工作表(ListView1.Items(i).Selected = True)
        For i = 0 To ListView2.Items.Count - 1   '在列表2中循环
            If App.ActiveSheet.Name = ListView2.Items(i).Text Then  '如果正在操作的工作表等于列表框中内容则
                ListView2.Items(i).Selected = True
                Exit For
            End If
        Next '结束循环
        '为了让列表呈现更好的选择效果,让滚动内容呈现向下可见5个内容
        If ListView2.Items.Count - (i + 1) < 5 Then
            ListView2.EnsureVisible(ListView2.Items.Count - 1)
        Else
            ListView2.EnsureVisible(i + 5)       '让选选钟内容跟着滚动条滚动,且向下多显示5个内容
        End If
    End Sub
    Private Sub ListView1_Click(sender As Object, e As EventArgs) Handles ListView1.Click
        Dim Index As Int16
        Index = ListView1.SelectedIndices(index:=0)     '获取当前选中的内容的索引号
        App.Workbooks(ListView1.Items(Index).Text).Activate()     '激活当前选中的工作簿
        App.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized '让工作簿显示
        Call Sht()    '选中的工作中的所有工作表,引用sub sht()
    End Sub

    Private Sub ListView2_Click(sender As Object, e As EventArgs) Handles ListView2.Click
        Dim Index As Int16
        Index = ListView2.SelectedIndices(index:=0)    '获取当前选中的内容索引号
        App.Sheets(ListView2.Items(Index).Text).Activate()   '激活选中的工作表
    End Sub
    Private Sub UserControl1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Call Wb()
        Call Sht()
    End Sub
End Class

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-17 15:26 | 显示全部楼层
在工作簿和工作表时间中添加以下代码
Private Sub Application_WorkbookActivate(Wb As Workbook) Handles Application.WorkbookActivate
        On Error Resume Next
        If Globals.Ribbons.Ribbon1.导航窗格.Checked Then
            Call 用户控件.Wb()
            Call 用户控件.Sht()
            If App.Version <= 14 Then
                Exit Sub
            Else
                Me.CustomTaskPanes.RemoveAt(0)
                用户控件 = New UserControl1
                任务窗格 = Me.CustomTaskPanes.Add(用户控件, "导航")
                With 任务窗格
                    .DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft
                    .Width = 220
                    .Visible = True
                End With
            End If
        Else
            Me.CustomTaskPanes.RemoveAt(0)
        End If
    End Sub
    Private Sub Application_SheetActivate(Sh As Object) Handles Application.SheetActivate
        On Error Resume Next
        Call 用户控件.Sht()
    End Sub
End Class

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-17 15:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Private Sub 导航窗格_Click(sender As Object, e As RibbonControlEventArgs) Handles 导航窗格.Click
        On Error Resume Next
        If 导航窗格.Checked Then
            Globals.ThisAddIn.用户控件 = New UserControl1
            Globals.ThisAddIn.任务窗格 = Globals.ThisAddIn.CustomTaskPanes.Add(Globals.ThisAddIn.用户控件, "导航")
            With Globals.ThisAddIn.任务窗格
                .DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft
                .Visible = True
                .Width = 220
            End With
        Else
            Globals.ThisAddIn.CustomTaskPanes.RemoveAt(0)
        End If
    End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-17 20:49 | 显示全部楼层
开始要声明两个变量
Public 用户控件 As UserControl1
Public 任务窗格 As Microsoft.Office.Tools.CustomTaskPane
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 18:30 , Processed in 0.046614 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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