ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

使用VSTO移植VBA

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2010-12-21 10:47 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:VSTO开发
        VSTO实际上是一系列的Visual Studio.NET工程模板,通过它来引导我们开发创建基于Office的解决方案。这里的项目测试针仅对文档级项目。

        VSTO解决方案的优点很多,如实现代码与数据文件分离、有利于保护代码和方便功能更新、安全方面的增强……

        第一次接触VSTO,是这个VS2010版本。经过几天的学习、摸索,发现移植VBA已经变得非常简单。

        VSTO的书籍很少,而且有点过时。买了一本基于VB2005的《VSTO开发指南》,收获不大,还不如看MSDN。但是MSDN上的示例代码,对于习惯VBA的非程序员用户来讲,对象引用、属性和方法的使用等,还是有些陌生。因此,进行了一些尝试,力争象使用VBA一样的方式,来移植我的VBA。

这个项目测试包括以下两个方面:
          一、VS2010定制功能区示例。
          二、移植VBA代码到VSTO示例。


运行环境:
        一、运行下面的附件示例文件,需要以下3个系统必备组件,请大家自行下载安装。见4楼地址
              1 xtbb01.png
              2 xtbb02.png
              3 xtbb03.png
     二、Office版本:20072010


示例文件: ExcelFlowerVSTO.rar (207.02 KB, 下载次数: 3091)

完整安装包下载:excelvsto@163.com 密码:123456

[ 本帖最后由 excelflower 于 2010-12-22 17:29 编辑 ]

评分

6

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-12-21 10:59 | 显示全部楼层
自定义功能区步骤:

1、文件菜单-新建项目,在窗口中选择“EXCEL 2010 工作簿”。

VSTO02.png

2、项目命名,选择文件格式。

VSTO03.png

3、生成新建项目界面,修改工作表名称。

VSTO10.png


4、项目菜单-添加新项,在窗口选择“功能区(可视化设计器)”。

VSTO05.png

5、打开“工具箱”,拖放“Tab”到设计功能区的顶部,创建新Tab。并在右下的属性窗口中修改相应的属性,如Lable属性值改为“VSTO操作工作表”。

VstoTab.png

6、拖放“Group”到新建的Tab区域,在右下的属性窗口中修改相应的属性,如Lable属性值改为“工作表操作”。

VSTO07.png

7、拖放“Butten”到新建的Tab区域,在右下的属性窗口中修改相应的属性,如Lable属性值改为“遍历工作表”,添加图标、更改ControlSize属性为“RibbonControlSizeLarge”。

VSTO09.png

8、双击任意“Butten”,便可输入代码。

VSTO11.png

已成功定制你的“自定义功能区”,开始体验代码吧。


[ 本帖最后由 excelflower 于 2010-12-21 11:11 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-12-21 11:03 | 显示全部楼层
1楼附件里的移植VBA完整代码,不包括VSTO模板代码。
  1. Imports Microsoft.Office.Tools.Ribbon
  2. Imports Excel = Microsoft.Office.Interop.Excel

  3. Public Class Ribbon1
  4.     Public ProtectOffOn&
  5.     Private Sub Ribbon1_Load(ByVal sender As System.Object, ByVal e As RibbonUIEventArgs) Handles MyBase.Load

  6.     End Sub
  7.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button1.Click
  8.         Call ListSheets()
  9.     End Sub
  10.     Sub 单元格写入值()
  11.         Dim i&
  12.         With Globals.ThisWorkbook.Worksheets("工作表一")
  13.             .select()
  14.             .RANGE("A1:B1") = {"名称", "数量"}
  15.             For i = 2 To 10
  16.                 .range("A" & i).VALUE2 = "数据-" & i
  17.                 .range("B" & i).VALUE2 = i * (100 - i * 10)
  18.             Next i
  19.         End With
  20.     End Sub



  21.     Sub ListSheets() '遍历工作表并生成目录
  22.         Dim i&, j&, k&
  23.         MsgBox("请确认工作表未保护!" & Chr(10) & "这是一个综合示例,包括:" & Chr(10) & "1、遍历工作表;" & Chr(10) & "2、获取特定名称工作表的位置:" & Chr(10) & "3、使用数组;" & Chr(10) & "4、把数组中的值写入工作表;" & Chr(10) & "5、选择工作表。")
  24.         With Globals.ThisWorkbook
  25.             .Worksheets("工作表目录").select()
  26.             j = .Worksheets("汇总表").index '确定开始提取工作表名称的位置,还是确定数组大小的参数
  27.             k = .Worksheets.Count - j '确定单元格区域大小
  28.             Dim Rng As Excel.Range = .Worksheets("工作表目录").Range("B3").Resize(k, 1)
  29.             Dim Arr(0 To k - 1, 0 To 0) As String '数组从0开始
  30.             For i = j + 1 To .Worksheets.Count
  31.                 Arr(i - j - 1, 0) = .Worksheets(i).Name
  32.             Next i
  33.             Rng.Value2 = Arr
  34.         End With
  35.     End Sub

  36.     Sub Button2_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button2.Click
  37.         With Globals.ThisWorkbook
  38.             .Worksheets("工作表目录").select()
  39.             If ProtectOffOn = 0 Then
  40.                 .Worksheets("工作表目录").protect(password:="123456")
  41.                 ProtectOffOn = 1
  42.                 MsgBox("工作表已保护!再次点击此按钮会解除保护。")
  43.             ElseIf ProtectOffOn = 1 Then
  44.                 .Worksheets("工作表目录").unprotect(password:="123456")
  45.                 ProtectOffOn = 0
  46.                 MsgBox("已撤消工作表保护!再次点击此按钮会重新保护。")
  47.             End If
  48.         End With
  49.     End Sub

  50.     Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button4.Click
  51.         MsgBox("此示例更改最后一个工作表的名称为《更名工作表》。")
  52.         With Globals.ThisWorkbook
  53.             .Worksheets(.Worksheets.Count).name = "更名工作表"
  54.         End With
  55.     End Sub

  56.     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button3.Click
  57.         MsgBox("此示例删除最后一个工作表。")
  58.         With Globals.ThisWorkbook
  59.             .Worksheets(.Worksheets.Count).delete()
  60.         End With
  61.     End Sub

  62.     Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button5.Click
  63.         MsgBox("此示例在最后增加一个工作表。")
  64.         With Globals.ThisWorkbook
  65.             .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))
  66.         End With
  67.     End Sub

  68.     Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button6.Click
  69.         Call 单元格写入值()
  70.     End Sub

  71.     Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button7.Click
  72.         Call 单元格写入值()
  73.         MsgBox("下面开始排序。")
  74.         With Globals.ThisWorkbook.Worksheets("工作表一")
  75.             .range("A:B").sort(key1:=.range("B1"), Header:=Excel.XlYesNoGuess.xlYes)
  76.         End With
  77.     End Sub

  78.     Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button8.Click
  79.         Dim i&
  80.         Call 单元格写入值()
  81.         MsgBox("下面设置边框")
  82.         With Globals.ThisWorkbook.Worksheets("工作表一")
  83.             i = .range("a" & .Rows.count).end(3).row
  84.             .range("A1:B" & i).Borders.LineStyle = 1
  85.             MsgBox("下面设置单元格颜色")
  86.             .range("A1:A" & i).Interior.ColorIndex = 6
  87.             MsgBox("下面设置字体颜色")
  88.             .range("B1:B" & i).Font.ColorIndex = 3
  89.         End With
  90.     End Sub
  91. End Class
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-12-21 14:38 | 显示全部楼层
本帖最后由 ExcelHome 于 2012-10-6 15:55 编辑

3个系统必备组件下载地址:

1、Microsoft .NET Framework 4【http://www.microsoft.com/downloa ... 7&displaylang=zh-cn

2、Microsoft Visual Studio 2010 Tools for Office Runtime 【http://www.microsoft.com/downloa ... 3a54d609a0#filelist

3、Windows Installer 3.1【http://www.microsoft.com/downloa ... C&displaylang=zh-cn

[ 本帖最后由 excelflower 于 2010-12-21 14:43 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-12-21 16:29 | 显示全部楼层
怪不得那么多天不见花MM了, 原来研究更加高深的资料去了。

TA的精华主题

TA的得分主题

发表于 2010-12-21 16:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
网上查找了下,发现Microsoft Visual Studio 2010 Ultimate RTM安装包好大,决定还是下载Visual Studio 2010 Express Edition。应该问题不大吧。 花MM

[ 本帖最后由 AVEL 于 2010-12-21 16:39 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-12-21 16:34 | 显示全部楼层
原帖由 AVEL 于 2010-12-21 16:29 发表
怪不得那么多天不见花MM了, 原来研究更加高深的资料去了。

哈哈,老师来了。
是啊!开始挺迷茫的,书上的代码不好用,MSDN上的代码太晦涩,就按VBA的思路结合MSND的示例去试,有点收获了

TA的精华主题

TA的得分主题

发表于 2010-12-21 16:45 | 显示全部楼层

回复 7楼 excelflower 的帖子

我也要学习  不懂的地方还要向花MM请教呢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-12-21 17:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 AVEL 于 2010-12-21 16:33 发表
网上查找了下,发现Microsoft Visual Studio 2010 Ultimate RTM安装包好大,决定还是下载Visual Studio 2010 Express Edition。应该问题不大吧。 花MM

2G多,下吧。我们还年轻,有时间

TA的精华主题

TA的得分主题

发表于 2010-12-21 17:18 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-29 01:49 , Processed in 0.042781 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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