ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于怎么让vb.net 开发书签插件支持工作表新增和删除事件,并自适应工作簿高度

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-2-15 12:55 | 显示全部楼层 |阅读模式
小弟正在用vb.net开发vsto插件,是一个简单的书签功能,如下图: 微信图片_20220215122847.png
现在碰到3个困扰的问题:
第1个问题,当关于用户新增和删除工作表时,书签无法自动刷新,源码如下:
ThisAddIn源码:
  1. Imports Microsoft.Office.Interop.Excel

  2. Public Class ThisAddIn

  3.     Private Sub ThisAddIn_Startup() Handles Me.Startup
  4.         xlapp = Me.Application
  5.         AddHandler xlapp.WindowActivate, AddressOf xlapp_WindowActivate '多窗口显示
  6.         AddHandler xlapp.WorkbookNewSheet, AddressOf xlapp_WorkbookNewSheet '当用户新增工作表初始化书签显示列表
  7.         Call CreateUC() '创建usercontrol
  8.     End Sub
  9.     Private Sub xlapp_WindowActivate()
  10.         Call CreateUC() '当激活新的excel工作簿,创建usercontrol
  11.     End Sub

  12.     Private Sub xlapp_WorkbookNewSheet()
  13.         Dim UC_BookMark As New UC_BookMark()
  14.         Call UC_BookMark.InitTreeView()  '无法调用InitTreeView方法?????????
  15.     End Sub
复制代码

M_UC模块用于存放CreateUC() 创建usercontrol方法,由于多个工作表都需要使用,我特地加了一个dic存放handle
  1. Imports Microsoft.Office.Tools
  2. Imports Excel = Microsoft.Office.Interop.Excel
  3. Imports System.Windows.Forms

  4. Module M_UC
  5.     Public xlapp As Excel.Application = Globals.ThisAddIn.Application

  6.     Public AW As Excel.Window
  7.     Public UC_Dic As Dictionary(Of String, CustomTaskPane) = New Dictionary(Of String, CustomTaskPane)
  8.     Public UC_BookMarkTaskPane As CustomTaskPane

  9.     Public Sub CreateUC()
  10.         If Not xlapp.ActiveWindow Is Nothing Then
  11.             Dim dic_key As String

  12.             AW = xlapp.ActiveWindow
  13.             dic_key = AW.Hwnd.ToString & "UC_BookMark" '因为包含多个窗体,所以加上窗体名称
  14.             If Not UC_Dic.ContainsKey(dic_key) Then
  15.                 UC_BookMarkTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(control:= New UC_BookMark(), title:="书签", window:=AW)
  16.                 With UC_BookMarkTaskPane
  17.                     .DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionRight
  18.                     .Width = 250
  19.                     .Visible = False
  20.                 End With
  21.                 UC_Dic.Add(key:=dic_key, value:=UC_BookMarkTaskPane)
  22.             End If
  23.         Else
  24.             AW = Nothing
  25.         End If
  26.     End Sub
  27. End Module
复制代码

UC_BookMark,是usercontrol,代码如下:
  1. Imports System.Windows.Forms
  2. Public Class UC_BookMark

  3.     Private Sub UC_BookMark_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4.         InitTreeView()
  5.     End Sub

  6.     Public Sub InitTreeView()
  7.             Dim sht As Excel.Worksheet = Nothing
  8.         Dim Trv As TreeView = me.TreeView1
  9.         Trv.Nodes.Clear()

  10.         For Each sht In xlapp.Worksheets
  11.             Dim TrvNode As New TreeNode
  12.             TrvNode.Tag = sht.Name
  13.             TrvNode.Text = sht.Name
  14.             Trv.Nodes.Add(TrvNode)
  15.         Next

  16.         ' 设定树形菜单高度
  17.         If Not UC_BookMarkTaskPane Is Nothing Then
  18.             Trv.Width = UC_BookMarkTaskPane.Width - 30
  19.             Trv.Height = UC_BookMarkTaskPane.Height - 100
  20.         End If

  21.         Trv.ExpandAll()
  22.         End Sub

  23.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  24.         InitTreeView()
  25.     End Sub

  26. End Class
复制代码
其中InitTreeView是用来刷新树形菜单的。由于新增工作表事件不成功,无奈加了一个按钮,手工刷新。请问通过什么方法可以实现自动刷新呢?


第2个问题也是在上面代码中,关于树形菜单自适应高度。非常奇怪,初始化加载时,无法获得UC_BookMarkTaskPane,等于nothing,为了防止报错,我只能加了if条件判断是否nothing,然后通过点击刷新按钮后才能自适应高度。
  1.         ' 设定树形菜单高度
  2.         If Not UC_BookMarkTaskPane Is Nothing Then
  3.             Trv.Width = UC_BookMarkTaskPane.Width - 30
  4.             Trv.Height = UC_BookMarkTaskPane.Height - 100
  5.         End If
复制代码


第3个问题,是关于当隐藏书签面板,其隐藏状态怎么和顶部菜单toggle btn怎么交互呢?
微信图片_20220215123653.png
Snipaste_2022-02-15_12-37-16.png

所有源码已经打包上传,哪些大神方便的话,帮忙看看,谢谢各位!!!!





DataTool0.zip

147.99 KB, 下载次数: 7

vsto源码

TA的精华主题

TA的得分主题

发表于 2022-2-15 14:27 来自手机 | 显示全部楼层
Call UC_BookMark.InitTreeView()  '无法调用InitTreeView方法?????????

其他方法,debug.print 能调用吗?
照理不会这样子的

TA的精华主题

TA的得分主题

发表于 2022-2-15 14:30 来自手机 | 显示全部楼层
Dim UC_BookMark As New UC_BookMark()

每次都创建一个新实例?是不是这个要全局变量

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-15 16:12 | 显示全部楼层
zpy2 发表于 2022-2-15 14:30
Dim UC_BookMark As New UC_BookMark()

每次都创建一个新实例?是不是这个要全局变量

试过在M_UC模块中申明全局变量UC_BookMark:

  1. Public UC_BookMark As UC_BookMark
复制代码


ThisAddin.vb中

  1. Private Sub xlapp_WorkbookNewSheet()
  2.         Call UC_BookMark.InitTreeView()  '无法调用InitTreeView方法
  3. End Sub
复制代码


还是没有效果。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-15 16:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zpy2 发表于 2022-2-15 14:27
Call UC_BookMark.InitTreeView()  '无法调用InitTreeView方法?????????

其他方法,debug.prin ...

调试了,能够调用InitTreeView方法,也查看了treeview的变量,已经包含了新增增加的工作表,但是界面上treeview就是不更新?!?!

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-15 16:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zpy2 发表于 2022-2-15 14:27
Call UC_BookMark.InitTreeView()  '无法调用InitTreeView方法?????????

其他方法,debug.prin ...

既能能够访问  usercontrol模块中的InitTreeView方法,那么问题会不会出方法中:
Dim Trv As TreeView = me.TreeView1  '外部模块或者thisaddin无法确定me对象?
那么请问这句怎么写,可以正确的让外部模块或者thisaddin访问usercontrol中方法呢?

TA的精华主题

TA的得分主题

发表于 2022-2-15 16:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
myperworld 发表于 2022-2-15 16:20
既能能够访问  usercontrol模块中的InitTreeView方法,那么问题会不会出方法中:
Dim Trv As TreeView = ...

你sheet增加事件和你初始化CTP中都是new的一个新对象,两个窗体不是同一个对象,用一个全局变量,单例模式就行。

DataTool0.rar

146.5 KB, 下载次数: 11

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-15 17:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wodewan 发表于 2022-2-15 16:51
你sheet增加事件和你初始化CTP中都是new的一个新对象,两个窗体不是同一个对象,用一个全局变量,单例模 ...

感谢老师,成功了!!!但我稍微优化下增加了删除事件,没有效果,这是什么原因呢?
thisaddin代码:
  1. Imports Microsoft.Office.Interop.Excel
  2. Public Class ThisAddIn
  3.     Private Sub ThisAddIn_Startup() Handles Me.Startup
  4.         xlapp = Me.Application
  5.         AddHandler xlapp.WindowActivate, AddressOf xlapp_WindowActivate '多窗口显示
  6.         AddHandler xlapp.WorkbookNewSheet, AddressOf xlapp_WorkbookNewSheet '新增工作表事件
  7.         AddHandler xlapp.SheetBeforeDelete, AddressOf xlapp_SheetBeforeDelete '删除工作表事件

  8.         Call M_UC.CreateUC() '创建usercontrol
  9.     End Sub
  10.     Private Sub xlapp_WindowActivate()
  11.         Call M_UC.CreateUC() '当激活新的excel工作簿,创建usercontrol
  12.     End Sub

  13.     Private Sub xlapp_WorkbookNewSheet() '新增工作表事件
  14.         Call M_UC.UC_BookMark.InitTreeView()
  15.     End Sub

  16.     Private Sub xlapp_SheetBeforeDelete() '删除工作表事件------没有效果????
  17.         Call M_UC.UC_BookMark.InitTreeView()
  18.     End Sub

  19. End Class
复制代码

TA的精华主题

TA的得分主题

发表于 2022-2-15 17:14 来自手机 | 显示全部楼层
myperworld 发表于 2022-2-15 16:14
调试了,能够调用InitTreeView方法,也查看了treeview的变量,已经包含了新增增加的工作表,但是界面上tr ...

https://docs.microsoft.com/zh-tw/dotnet/api/system.windows.forms.treeview.endupdate?redirectedfrom=MSDN&view=windowsdesktop-6.0#System_Windows_Forms_TreeView_EndUpdate
endupdate试试。。。微软。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-15 17:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
研究出来了,带入工作表名参数就可以了,然后在InitTreeView做相应修改。
  1. Imports Microsoft.Office.Interop.Excel

  2. Public Class ThisAddIn

  3.     Private Sub ThisAddIn_Startup() Handles Me.Startup
  4.         xlapp = Me.Application
  5.         AddHandler xlapp.WindowActivate, AddressOf xlapp_WindowActivate '多窗口显示
  6.         AddHandler xlapp.WorkbookNewSheet, AddressOf xlapp_WorkbookNewSheet '新增工作表事件
  7.         AddHandler xlapp.SheetBeforeDelete, AddressOf xlapp_SheetBeforeDelete '删除工作表事件
  8.         AddHandler xlapp.WindowResize, AddressOf xlapp_WindowResize '改变尺寸
  9.         Call M_UC.CreateUC() '创建usercontrol
  10.     End Sub
  11.     Private Sub xlapp_WindowActivate()
  12.         Call M_UC.CreateUC() '当激活新的excel工作簿,创建usercontrol
  13.     End Sub
  14.     Private Sub xlapp_WorkbookNewSheet() '新增工作表事件
  15.         Call M_UC.UC_BookMark.InitTreeView()
  16.     End Sub
  17.     Private Sub xlapp_SheetBeforeDelete(ByVal sh As Excel.Worksheet) '删除工作表事件
  18.         Call M_UC.UC_BookMark.InitTreeView(del_shtname:=sh.Name)
  19.     End Sub
  20.     Private Sub xlapp_WindowResize() '
  21.         Call M_UC.UC_BookMark.InitTreeView()
  22.     End Sub
  23. End Class
复制代码

谢谢@wodewan老师!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-4 02:15 , Processed in 0.058458 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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