ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] VB6开发Excel任务窗格的例子(附制作过程与源代码)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-9-1 19:24 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:插件开发
本帖最后由 xtanuihazfh 于 2011-9-3 18:44 编辑

哈哈,论坛好些人说用VB6不能创建任务窗格,但是我还是做出来了
请大家下载附件帮忙测试一下,点击安装即可(这个过程会把工程.ocx复制到windows\system32目录下
WIN7用户要先把工程.ocx复制到windows\system32目录下,然后以管理员权限启动CMD输入 REGSVR32.EXE 文件路径\MyAddin.dll
VB6创建Excel自定义任务窗格.rar (296.12 KB, 下载次数: 2591)
--------------------2011年9月2日上传制作过程,请大家先照着做一下,源码稍后再传--------------------------------------------------------------------
由于本帖是面向对于VBA,VB编程有一些基础的人,所以可能文字描述不多(借口,其实是懒得打字,大家凑和着看代码就行),基本上就是把代码COPY过来了,
另外这个只是测试用的代码,某些地方可能不太严谨,大家弃其糟粕,取其精华即可,哈哈

--------------------2011年9月3日上传所有的东西,包含word版说明与源代码--------------------------------------------------------------------

VB6Excel创建自定义任务窗格
此前发过一篇用VSTO创建Excel任务窗格的例子与源码在http://club.excelhome.net/thread-729365-1-1.html
然而很多朋友如果可以的话,更愿意用VB6,因为开发环境,兼容性等各方面的问题
Excel的帮助中有这么一句话:
可以用任何支持 COM 并允许创建动态链接库 (DLL) 文件的语言创建自定义任务窗格。例如,Microsoft Visual Basic® 6.0Microsoft Visual Basic .NETMicrosoft Visual C++®Microsoft Visual C++ .NET Microsoft Visual C#®。但是,Microsoft Visual Basic for Applications (VBA) 不支持创建自定义任务窗格。
但是相关的代码是C#,尽管说可以用VB6.0创建OFFICE的自定义任务窗格,但是在网上这样的例子却是少之又少,所以在此介绍一下用VB6创建Excel自定义任务窗格的方法,由于本人用的是office 2007,所以顺带介绍了自定义功能区的东西

由于此帖子是主要演示如何创建任务窗格,所以只设置显示所有工作表与多工作簿查找功能

在创建任务窗格之前我们要先创建一个自定义控件,作为自定义窗格里面的唯一对象
一、创建自定义控件
1.       打开VB6.0,在新建工程对话框中选择ActiveX控件
          1.jpg
         将工程名称修改为ExcelCTPTest
         选择UserControl,在属性窗口中将其名称修改为TestControl
         此时我们可以在控件上画上我们需要在任务窗格中使用到的控件,如果是仅为测试的话,放上一个按钮与一个文本框即可
         在此处,我添加一个Tveeview控件,一个Image控件,一个Text控件,一个ListView控件,一个ImageList控件,作成如下布局,当然具体布局方式看个人习惯与爱好
         
2.jpg 然后呢,为控件设置适当的属性



TreeView1
属性名称
属性
LineStyle
1-tvwRootLines
ImageList
Imagelist1
Indentation
300
再往imagelist控件里面放入两张用于显示在treeview节点的图片
         
其它属性根据自己需要选择

2.       选择工程菜单中的引用命令,添加对Excel对象的引用
双击控件,输入以下代码



  1. Option Explicit
  2. Private ExcelApp As Excel.Application
  3. Dim yy As Single
  4. '处理控件大小与位置*******************************************************
  5. Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  6.     If Button = 1 Then yy = Y
  7. End Sub
  8. Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  9.     Dim yyy As Single
  10.     If Button = 1 Then
  11.         yyy = Y - yy
  12.         If yy - Y > TreeView1.Height Or yy > (ListView1.Height) Then Exit Sub
  13.         TreeView1.Height = TreeView1.Height + yyy
  14.         Image1.Top = Image1.Top + yyy
  15.         Text1.Top = Text1.Top + yyy
  16.         ListView1.Top = ListView1.Top + yyy
  17.         ListView1.Height = ListView1.Height - yyy
  18.     End If
  19. End Sub
  20. Private Sub UserControl_Resize()
  21.     Dim iWidth As Long, iHeight As Long
  22.     iWidth = UserControl.ScaleWidth - 1
  23.     iHeight = UserControl.ScaleHeight / 2
  24.     On Error Resume Next
  25.     TreeView1.Move 0, 0, iWidth, iHeight - Image1.Height - Text1.Height
  26.     Image1.Width = iWidth
  27.     Image1.Top = TreeView1.Height
  28.     Text1.Width = iWidth
  29.     Text1.Top = Image1.Top + Image1.Height
  30.     ListView1.Move 0, Text1.Top + Text1.Height, iWidth, iHeight
  31. End Sub
  32. '内部控件事件*******************************************************
  33. Private Sub UserControl_Initialize()
  34.     With ListView1
  35.         .View = lvwReport
  36.         .GridLines = True
  37.         .FullRowSelect = True
  38.         .HotTracking = True
  39.         .ColumnHeaders.Add , , "工作簿", 800, 0
  40.         .ColumnHeaders.Add , , "工作表", 800, 0
  41.         .ColumnHeaders.Add , , "单元格", 800, 0
  42.         .ColumnHeaders.Add , , "值", 800, 0
  43.         .ColumnHeaders.Add , , "公式", 1000, 0
  44.     End With
  45. End Sub
  46. Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
  47.     If Node.Parent Is Nothing Then
  48.         ExcelApp.Workbooks(Node.Key).Activate
  49.     Else
  50.         With ExcelApp.Workbooks(Node.Parent.Key)
  51.             .Activate
  52.             .Worksheets(Node.Text).Select
  53.         End With
  54.     End If
  55. End Sub
  56. Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
  57.     If Text1.Text = "" Then Exit Sub
  58.     If KeyCode = 13 Then
  59.         FindAllWorkBook Text1.Text
  60.     End If
  61. End Sub
  62. Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
  63.     With ExcelApp.Workbooks(Item.Text)
  64.         .Activate
  65.         .Worksheets(Item.ListSubItems(1)).Active
  66.         .Worksheets(Item.ListSubItems(1)).Range (Item.ListSubItems(2))
  67.     End With
  68. End Sub
  69. '控件的属性*******************************************************
  70.     '属性名称:  Application
  71.     '属性用途:  获取与返回正在使用控件的Excel应用程序对象
  72. Public Property Let Application(NewExcelApp As Excel.Application)
  73.     Set ExcelApp = NewExcelApp
  74. End Property
  75. Public Property Get Application() As Excel.Application
  76.     Set Application = ExcelApp
  77. End Property
  78. '控件的方法*******************************************************
  79. '填充树型控件
  80. Public Sub FillTvw()
  81.     Dim WB As Workbook, WS As Worksheet
  82.     If ExcelApp Is Nothing Then Exit Sub
  83.     With TreeView1.Nodes
  84.         .Clear
  85.         For Each WB In ExcelApp.Workbooks
  86.             .Add(, , WB.Name, WB.Name, 1).Expanded = True
  87.             For Each WS In WB.Sheets
  88.                 .Add WB.Name, tvwChild, WB.Name & "_" & WS.Name, WS.Name, 2
  89.             Next
  90.         Next
  91.     End With
  92. End Sub
  93. '搜索所有工作簿
  94. Public Sub FindAllWorkBook(FindStr As String)
  95.     Dim WB As Workbook, WS As Worksheet
  96.     Dim Item As ListItem, FindRng As Range, FirstAddress As String, RngFormula As String
  97.     If ExcelApp Is Nothing Then Exit Sub
  98.     With ListView1.ListItems
  99.         .Clear
  100.         For Each WB In ExcelApp.Workbooks
  101.             For Each WS In WB.Sheets
  102.                 Set FindRng = WS.Cells.Find(FindStr)
  103.                 If Not FindRng Is Nothing Then
  104.                     FirstAddress = FindRng.Address
  105.                     Do
  106.                         Set Item = .Add
  107.                         Item.Text = WB.Name
  108.                         Item.SubItems(1) = WS.Name
  109.                         Item.SubItems(2) = FindRng.Address
  110.                         Item.SubItems(3) = FindRng.Value
  111.                         RngFormula = FindRng.Formula
  112.                         If Left(RngFormula, 1) <> "=" Then RngFormula = ""
  113.                         Item.SubItems(4) = RngFormula
  114.                         Set FindRng = WS.Cells.FindNext(FindRng)
  115.                     Loop While Not FindRng Is Nothing And FindRng.Address <> FirstAddress
  116.                 End If
  117.             Next
  118.         Next
  119.     End With
  120. End Sub
复制代码

3.选择文件菜单上的生成命令,生成我们需要的控件
可自行选择目录
3.jpg
&sup2;  二、根据我们上面做好的控件创建任务窗格
1.         关闭保存我们之前的控件工程,重新启动VB,选择外接程序
          4.jpg
移除其中的窗体与设计器中的代码
设置设计器中的属性,如下图所示
5.jpg
关闭设置器窗口
2.         在创建任务窗格之前,我们先在Excel功能区创建一个选项卡及按钮来控件显示隐藏任务窗格
选择此菜单项,找到VB6资源管理器,如图设置
6.jpg    7.jpg
然后外接程序管理器窗口,如果你已经有资源编辑器那么则不需此项设置
在项目工程资源管理器窗口中右键添加资源文件,选择保存位置与名称,创建一个新的资源文件
然后选择添加自符串表格,在标识号为101的字符串表中复制进去以下用于自定义功能区的xml代码

  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  2.   <ribbon>
  3.     <tabs>
  4.       <tab id="TaskPaneTab" label="任务窗格">
  5.         <group id="Group1" label="VB6自定义任务窗格">
  6.           <toggleButton id="Button" label="显示任务窗格" size="large" imageMso="FileServerTransferDatabase"/>
  7.         </group >
  8.       </tab>
  9.     </tabs>
  10.   </ribbon>
  11. </customUI>
复制代码

3.         保存资源文件,关闭资源管理器,回到加载项设计器的代码窗口,添加以下代码到模块顶部
Implements IRibbonExtensibility
在左侧通用组合框中选择     IRibbonExtensibility,即可生成以下函数过程
Private Function IRibbonExtensibility_GetCustomUI(ByVal RibbonID As String) As String
    IRibbonExtensibility_GetCustomUI = LoadResString(101)      ‘用于从资源文件中载入自定义功能区的xml代码
End Function

现在按下F5,打开Excel,是否已经有了新的功能区选项卡了呢
选择工程菜单下的引用命令,引用Excel对象以及我们之前创建的控件

接下来我们添加模块全部的代码


  1. Implements IDTExtensibility2
  2. Implements ICustomTaskPaneConsumer
  3. Implements IRibbonExtensibility

  4. Private Sub ICustomTaskPaneConsumer_CTPFactoryAvailable(ByVal CTPFactoryInst As Office.ICTPFactory)
  5.          ‘注意此处的ExcelCTPTest为我们之前创建的控件的工程名称TestControl为控件名称
  6.     Set MyCustomTaskPane = CTPFactoryInst.CreateCTP("ExcelCTPTest.TestControl", "测试自定义任务窗格")
  7.     MyCustomTaskPane.DockPosition = msoCTPDockPositionLeft
  8.    
  9.     Set MyTestControl = MyCustomTaskPane.ContentControl
  10.     MyTestControl.Application = MyExcel
  11.     MyCustomTaskPane.Visible = True
  12. End Sub

  13. Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant)
  14.     '占位
  15. End Sub

  16. Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant)
  17.     '占位
  18. End Sub

  19. Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
  20.     Set MyExcel = Application
  21.     Set MyExcelApp = New ExcelApp
  22.     MyExcelApp.Attech Application
  23. End Sub

  24. Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
  25.     Set MyExcel = Nothing
  26.     Set MyExcelApp = Nothing
  27. End Sub

  28. Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant)
  29.     '占位
  30. End Sub

  31. Sub ShowTaskPane(control As IRibbonControl, pressed As Boolean)
  32.     MyCustomTaskPane.Visible = pressed
  33. End Sub

  34. Private Function IRibbonExtensibility_GetCustomUI(ByVal RibbonID As String) As String
  35.     IRibbonExtensibility_GetCustomUI = LoadResString(101)
  36. End Function
复制代码


4.         添加一个标准模块,加入以下全局变量的声明

  1. Public MyExcel As Excel.Application
  2. Public MyCustomTaskPane As CustomTaskPane
  3. Public MyExcelApp As ExcelApp
  4. Public MyTestControl As TestControl
复制代码


添加一个类模块,修改其名称为ExcelApp,添加以下代码


  1. Private WithEvents XlApp As Excel.Application

  2. Public Sub Attech(Application As Excel.Application)
  3.     Set XlApp = Application
  4. End Sub

  5. Private Sub XlApp_NewWorkbook(ByVal Wb As Excel.Workbook)
  6.     MyTestControl.FillTvw
  7. End Sub

  8. Private Sub XlApp_WorkbookActivate(ByVal Wb As Excel.Workbook)
  9.     MyTestControl.FillTvw
  10. End Sub

  11. Private Sub XlApp_WorkbookDeactivate(ByVal Wb As Excel.Workbook)
  12.     MyTestControl.FillTvw
  13. End Sub

  14. Private Sub XlApp_WorkbookOpen(ByVal Wb As Excel.Workbook)
  15.     MyTestControl.FillTvw
  16. End Sub
复制代码


现在按下F5调试工程,测试代码是否我们所设想的那样运行,
完成后的图片
8.jpg


评分

9

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-9-1 19:26 | 显示全部楼层
已下载。谢谢分享

TA的精华主题

TA的得分主题

发表于 2011-9-1 19:39 | 显示全部楼层
{:soso__12263369589824949048_3:} 俺期待你滴制作过程。。。。。{:soso__13200254148549810705_3:}

TA的精华主题

TA的得分主题

发表于 2011-9-1 19:41 | 显示全部楼层
很好,一直在找这个任务窗格相关的vb,可不可以分享一下源码?Thanks!

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-9-1 19:43 | 显示全部楼层
xyh_bear 发表于 2011-9-1 19:41
很好,一直在找这个任务窗格相关的vb,可不可以分享一下源码?Thanks!

先发个效果图,详细制作过程与源代码过两天再发上来
之前发过一个VSTO的全部过程与源码
http://club.excelhome.net/thread-729365-1-1.html

TA的精华主题

TA的得分主题

发表于 2011-9-1 20:05 | 显示全部楼层
xtanuihazfh 发表于 2011-9-1 19:43
先发个效果图,详细制作过程与源代码过两天再发上来
之前发过一个VSTO的全部过程与源码
http://club.exc ...

又是VSTO制作的,我还以为真的是VB6作的呢??? 有点失望。。。。。。

TA的精华主题

TA的得分主题

发表于 2011-9-1 20:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-9-1 20:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
真的希望是VB6.0制作的,切盼楼主早点上传!{:soso_e100:} {:soso_e181:}

TA的精华主题

TA的得分主题

发表于 2011-9-2 11:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主真是好人啊 非常感谢 我这人菜鸟得多向您学习

TA的精华主题

TA的得分主题

发表于 2011-9-2 11:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感觉是个复杂问题
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-8 13:23 , Processed in 0.044864 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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