ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

【学习VSTO】——任务窗格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-9-24 21:41 | 显示全部楼层 |阅读模式
本帖最后由 wpxxsyzx 于 2014-10-5 15:09 编辑

      office应用程序中包含许多内置任务窗格(比如 Word 中的“样式和格式”任务窗格),使用操作窗格控件可以定制自己的任务窗格,其只能应用于文档级别的项目,对于应用程序级别的项目应该使用自定义任务窗格。
      第一次向操作窗格中添加控件会使该窗格自动在运行时变为可见,关闭任务窗格后再次添加控件不会自动显示。虽然 ActionsPane 类具有 Hide 方法和 Visible 属性,但使用 ActionsPane 类本身的Hide 方法或将 Visible 属性设置为 false 仅会在操作窗格上隐藏控件;不会隐藏任务窗格,会触发 其VisibleChanged 事件,相反,用户关闭操作窗格时不会引发此事件。
      如果用户在该操作窗格可见时保存文档,则每次打开文档时该操作窗格均可见,无论该操作窗格是否包含控件(有可能出现空白的任务窗格,应该在Startup 事件处理程序中调用 ActionsPane 的 Clear 方法,以确保在打开文档时不显示操作窗格。
      文档只有一个任务窗格,可以在任务窗格中添加多个用户控件,控制在不同的情况下显示不同的用户控件来模拟多个任务窗格。
   
  1. Public Class ThisWorkbook
  2.     '使用Clear方法使任务窗格和文档分离,确保不会出现空白任务窗格
  3.     Private Sub ThisWorkbook_Startup() Handles Me.Startup
  4.         ActionsPane.Clear()
  5.     End Sub
  6.     '根据任务窗格是水平还是垂直显示,设置其上的控件的排列方式,默认是垂直排列多个控件
  7.     Private Sub ActionsPane_OrientationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ActionsPane.OrientationChanged
  8.         If Globals.Sheet1.CheckBox1.Checked = True Then
  9.             If Me.ActionsPane.Orientation = Orientation.Horizontal Then
  10.                 Me.ActionsPane.StackOrder = Microsoft.Office.Tools.StackStyle.FromLeft
  11.             Else
  12.                 Me.ActionsPane.StackOrder = Microsoft.Office.Tools.StackStyle.FromTop
  13.             End If
  14.         End If
  15.     End Sub
  16. End Class

  17. Public Class Sheet1
  18.     Private acp1 As ActionsPaneControl1
  19.     Private acp2 As ActionsPaneControl2
  20.     Private Sub Sheet1_Startup() Handles Me.Startup
  21.         acp1 = New ActionsPaneControl1
  22.         acp2 = New ActionsPaneControl2
  23.     End Sub
  24.     '在选中其他单元格区域和NamedRange控件所在区域时显示不同的用户控件来模拟多个任务窗格
  25.     Private Sub Sheet1_SelectionChange(ByVal Target As Microsoft.Office.Interop.Excel.Range) Handles Me.SelectionChange
  26.         With Globals.ThisWorkbook.ActionsPane.Controls
  27.             If Target.Address = NamedRange1.InnerObject.Address Then
  28.                 'Remove方法从任务窗格中移除用户控件
  29.                 If .Contains(acp1) = True Then .Remove(acp1)
  30.                 If .Contains(acp2) = False Then .Add(acp2)
  31.             Else
  32.                 If .Contains(acp2) = True Then .Remove(acp2)
  33.                 If .Contains(acp1) = False Then .Add(acp1)
  34.             End If
  35.         End With
  36.         Globals.ThisWorkbook.Application.DisplayDocumentActionTaskPane = True
  37.     End Sub
  38.     '还可以使用下面的方法影藏或显示不同的用户控件来模拟多个任务窗格,InnerObject返回宿主控件的本机对象
  39.     'Private Sub Sheet1_SelectionChange(ByVal Target As Microsoft.Office.Interop.Excel.Range) Handles Me.SelectionChange
  40.     '    With Globals.ThisWorkbook.ActionsPane
  41.     '        If Target.Address = NamedRange1.InnerObject.Address Then
  42.     '            .Controls("ActionsPaneControl1").Visible = False
  43.     '            .Controls("ActionsPaneControl2").Visible = True
  44.     '        Else
  45.     '            .Controls("ActionsPaneControl2").Visible = False
  46.     '            .Controls("ActionsPaneControl1").Visible = True
  47.     '        End If
  48.     '    End With
  49.     '    Globals.ThisWorkbook.Application.DisplayDocumentActionTaskPane = True
  50.     'End Sub
  51.     'Private Sub Sheet1_Startup() Handles Me.Startup
  52.     '    Globals.ThisWorkbook.ActionsPane.Controls.Add(acp1)
  53.     '    Globals.ThisWorkbook.ActionsPane.Controls.Add(acp2)
  54.     'End Sub
  55.         '使用Controls的Add方法向任务窗格添加用户控件,使同时显示多个控件,以测试调整任务窗格位置时,这些控件的排列方式
  56.     Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
  57.         With Globals.ThisWorkbook.ActionsPane.Controls
  58.             If CheckBox1.Checked = True Then
  59.                 If .Contains(acp1) = False Then .Add(acp1)
  60.                 If .Contains(acp2) = False Then .Add(acp2)
  61.             End If
  62.         End With
  63.         'DisplayDocumentActionTaskPane属性控制是否显示任务窗格
  64.         Globals.ThisWorkbook.Application.DisplayDocumentActionTaskPane = True
  65.     End Sub
  66.     '使用CommandBars对象调整任务窗格的尺寸,"Task Pane"代表任务窗格
  67.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  68.         With Globals.ThisWorkbook.Application.CommandBars("Task Pane")
  69.             If .Position = Microsoft.Office.Core.MsoBarPosition.msoBarLeft Or _
  70.                 .Position = Microsoft.Office.Core.MsoBarPosition.msoBarRight Then
  71.                 .Width = .Width * 1.2
  72.             Else
  73.                 .Height = .Height * 1.2
  74.             End If
  75.         End With
  76.     End Sub
  77.     '使用CommandBars对象调整任务窗格的位置,"Task Pane"代表任务窗格
  78.     Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
  79.         With Globals.ThisWorkbook.Application.CommandBars("Task Pane")
  80.             If .Position = Microsoft.Office.Core.MsoBarPosition.msoBarLeft Or _
  81.                 .Position = Microsoft.Office.Core.MsoBarPosition.msoBarRight Then
  82.                 .Position = Microsoft.Office.Core.MsoBarPosition.msoBarTop
  83.             Else
  84.                 .Position = Microsoft.Office.Core.MsoBarPosition.msoBarLeft
  85.             End If
  86.         End With
  87.     End Sub
  88.     '从工作表向任务窗格写入数据
  89.     Private Sub NamedRange1_Change(ByVal Target As Microsoft.Office.Interop.Excel.Range) Handles NamedRange1.Change
  90.         Globals.ThisWorkbook.ActionsPane.Controls("ActionsPaneControl2").Controls("TextBox1").Text = Target.Value2
  91.         MessageBox.Show("可以看到文本框的内容和NamedRange控件的内容同步")
  92.     End Sub
  93.     '通过判断用户单击了那个控件,动态添加或移除任务窗格中的控件
  94.     Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click, Button4.Click
  95.         If CType(sender, System.Windows.Forms.Button) Is Button3 Then
  96.             Globals.ThisWorkbook.ActionsPane.Controls.Add(btn)
  97.             btn.Text = "这是动态添加的按钮"
  98.         Else
  99.             Globals.ThisWorkbook.ActionsPane.Controls.Remove(btn)
  100.         End If
  101.     End Sub
  102.     '动态添加的控件的事件
  103.     Private Sub btn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn.Click
  104.         MessageBox.Show("这是动态添加的按钮")
  105.     End Sub
  106. End Class
  107. Public Class ActionsPaneControl2
  108.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  109.         Globals.Sheet1.range("a2").Value = "A"
  110.     End Sub
  111. End Class
复制代码

vs2010,office2010

ExcelWorkbook1.rar

246.27 KB, 下载次数: 387

TA的精华主题

TA的得分主题

发表于 2014-9-28 11:23 | 显示全部楼层
学习了,感谢啊,我也是用VB,感觉用VB的人真心不多啊。楼主可发个vsto+Ribbon(xml)的版本

TA的精华主题

TA的得分主题

发表于 2015-10-19 16:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-5-5 10:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢,学习了你的经验。请问能制作多个窗格独立显示吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-4 16:46 , Processed in 0.052379 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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