admin 管理员组

文章数量: 1086019


2024年4月24日发(作者:左连接sql语句简单写法)

第17章 VSTO与VBA的差异

目录

第17章 VSTO与VBA的差异 ........................................................................................................................................................................ 2

17.1 变量、常量与数据类型 .................................................................................................................................................................. 2

17.1.1 数据类型 ................................................................................................................................................................................. 2

VS001:.......................................................................................................................................................................................... 2

VS002:.......................................................................................................................................................................................... 2

VS003:.......................................................................................................................................................................................... 3

VS004: ...................................................................................................................................................................................... 3

VS005: ...................................................................................................................................................................................... 4

17.1.2 变量 .......................................................................................................................................................................................... 4

VS006: ...................................................................................................................................................................................... 4

VS007: ...................................................................................................................................................................................... 5

VS008: ...................................................................................................................................................................................... 5

VS009: ...................................................................................................................................................................................... 5

VS010: ...................................................................................................................................................................................... 6

VS011: ...................................................................................................................................................................................... 7

17.1.3 常量 .......................................................................................................................................................................................... 8

VS012: ...................................................................................................................................................................................... 8

17.2 函数 ....................................................................................................................................................................................................... 9

17.2.1 调用方式不同 ........................................................................................................................................................................ 9

VS013: .................................................................................................................................................................................... 10

VS014:........................................................................................................................................................................................ 11

17.2.2 函数差异 ............................................................................................................................................................................... 12

VS015:........................................................................................................................................................................................ 12

VS016: .................................................................................................................................................................................... 12

VS017: .................................................................................................................................................................................... 12

VS018:........................................................................................................................................................................................ 13

VS019:........................................................................................................................................................................................ 13

VS020: .................................................................................................................................................................................... 14

VS021:........................................................................................................................................................................................ 14

VS022: .................................................................................................................................................................................... 15

17.3 数组 ..................................................................................................................................................................................................... 15

17.3.1 原本功能的差异 ................................................................................................................................................................. 15

VS023: .................................................................................................................................................................................... 15

VS024: .................................................................................................................................................................................... 16

17.3.2 新增功能 ............................................................................................................................................................................... 17

VS025: .................................................................................................................................................................................... 17

VS026: .................................................................................................................................................................................... 17

VS0267: ................................................................................................................................................................................. 18

VS028:........................................................................................................................................................................................ 18

17.4 窗体 ..................................................................................................................................................................................................... 18

17.4.1 名称变化 ............................................................................................................................................................................... 18

VS029: .................................................................................................................................................................................... 19

VS030: .................................................................................................................................................................................... 19

VS031: .................................................................................................................................................................................... 20

17.4.2 调用方式变化 ...................................................................................................................................................................... 21

VS032 ......................................................................................................................................................................................... 21

VS033:........................................................................................................................................................................................ 21

VS034: .................................................................................................................................................................................... 21

VS035: .................................................................................................................................................................................... 22

VS036: .................................................................................................................................................................................... 23

VS037: .................................................................................................................................................................................... 24

VS038: .................................................................................................................................................................................... 25

VS039: .................................................................................................................................................................................... 25

关闭窗体 .................................................................................................................................................................................... 25

VS041: .................................................................................................................................................................................... 26

VS042: .................................................................................................................................................................................... 26

VS043: .................................................................................................................................................................................... 27

VS044:........................................................................................................................................................................................ 27

VS045:........................................................................................................................................................................................ 28

VS046: .................................................................................................................................................................................... 29

17.4.3 功能变化 ............................................................................................................................................................................... 29

VS047: .................................................................................................................................................................................... 29

VS048:........................................................................................................................................................................................ 30

17.5 字典与正则表达式 ......................................................................................................................................................................... 30

17.5.1 字典 ........................................................................................................................................................................................ 30

VS049:........................................................................................................................................................................................ 30

VBA ............................................................................................................................................................................................. 30

17.5.2 正则表达式 ........................................................................................................................................................................... 32

VS050 ......................................................................................................................................................................................... 32

17.6 菜单与功能区 ................................................................................................................................................................................... 33

17.6.1 工作表菜单 ........................................................................................................................................................................... 33

1 / 50

第17章 VSTO与VBA的差异

VS051: .................................................................................................................................................................................... 33

17.6.2 功能区菜单 ........................................................................................................................................................................... 35

VS052: .................................................................................................................................................................................... 35

VS053: .................................................................................................................................................................................... 35

VS054: .................................................................................................................................................................................... 37

17.7 管理文件与目录 .............................................................................................................................................................................. 39

17.7.1 管理文件 ............................................................................................................................................................................... 39

VS055:........................................................................................................................................................................................ 39

VS056: .................................................................................................................................................................................... 40

VS057: .................................................................................................................................................................................... 40

VS058: .................................................................................................................................................................................... 41

VS059: .................................................................................................................................................................................... 42

17.7.2 管理目录 ............................................................................................................................................................................... 42

VS060:........................................................................................................................................................................................ 42

VS061: .................................................................................................................................................................................... 43

17.8 杂项 ..................................................................................................................................................................................................... 44

VS062: .................................................................................................................................................................................... 44

VS063:........................................................................................................................................................................................ 45

VS064: .................................................................................................................................................................................... 46

VS065: .................................................................................................................................................................................... 47

VS066: .................................................................................................................................................................................... 47

VS067: .................................................................................................................................................................................... 48

VS068: .................................................................................................................................................................................... 48

VS069:........................................................................................................................................................................................ 49

第17章 VSTO与VBA的差异

17.1 变量、常量与数据类型

17.1.1 数据类型

VSTO相对于VBA的数据类型大同小异,例如两者都有Byte型,取值范围都是0~

255,再如都有Double型,且取值范围都相同。本节主要讲述二者不同又易混淆之处。

VS001:

VSTO中取消了Currency类型,当VBA代码中有用到Currency类型时,将它修改

为Double就好。

VS002:

2 / 50

第17章 VSTO与VBA的差异

VSTO中的Short等同于VBA中的Integer;VSTO中的Integer等同于VBA中的

Long;VSTO中的Long远远大于VBA中的Long,其取值范围在-

9223372到9223372之间。

在VSTO中,Short可简写为int16,Integer可简写为int32,Long可简写为int64,

这样比较便于记忆和识别。

VS003:

VSTO中取消了变体型Variant,一切值和对象都是Object,就连字符串、数值都是

对象,有自己的方法。修改VBA代码在遇到Variant时必须将其修改为Object。

VS004:

当声明Excel的对象变量时,必须加前置的“Excel.”。例如:

Dim Rng as

但是在代码中直接调用Excel的对象时不是加前置的“Excel.”,而是前置“app.”。

其中app是变量,由自己的命名而定。例如在模块中用以下方式声明一个公共变量,它代

表Excel对象,后续引用Excel对象时都需要借用此变量来引用对象。

Public app As ation=ation

例如调用Range("A1")时要改用("A1")。

3 / 50

第17章 VSTO与VBA的差异

不过对于以下代码却不能在Application前添加“App.”,而是要将Application

修改为app,因为Application即为Excel对象,它不再有父对象。

Updating=False

VS005:

在VSTO中对对象的属性赋值时必须指定属性的名称,否则无法赋值。Visual Studio

2015会有错误提示,而Visual Studio 2010则没有错误提示,如果忘记写属性名称则会

导致程序赋值不成功,将给代码查错带来很大的障碍。例如:对单元格A1赋值为123,VBA

中可以用代码“Range("A1")=123”,忽略属性名称,而在VSTO中则必须采用代码

“("A1").Value=123”,不再支持默认属性Value。读者在测试代码时一

定要注意这一点,当把VBA代码复制到VSTO后将Range对象的属性值补充完整。

同理,窗体中的文本框控件也不再有默认属性,在对文本框赋值时需要写明Text属性

名称;选项按钮RadioButton不再有默认属性,调用时需注明Checked属性名称。

17.1.2 变量

VS006:

在VSTO中声明变量时,如果前一个变量未指定数据类型,后一个变量指定了数据类

型,那么前一个变量将会声明为后一个变量的相同类型。因此VBA中“Dim Arr,Mystr As

String”,VSTO中 “Dim Mystr As String,Arr”, “Dim Arr As Object,Mystr As

String”

4 / 50

第17章 VSTO与VBA的差异

VS007:

变量必须先声明才能调用,否则代码无法执行。不过VSTO同时也提供了便利:在声

明变量的同时可以赋值,不像VBA那样声明和赋值必须用两句代码。

VS008:

变量必须先赋值,然后才能调用。例如以下代码在VBA中可以正常运行,VSTO中则

不行,需要将“i As long”修改为“i As long=0”。

Sub test()

Dim cell as Excel Range,i as long

For Each cell In ion

If >10 Then i=i+1

Next cell

Msgbox(“大于10的单元格有”” & I & “个”)

End sub

VS009:

5 / 50

第17章 VSTO与VBA的差异

在对对象变量赋值时不需要使用Set。

VS010:

在变量的数据类型不同时,两个变量(也可以是一个变量和一个对象)不能做比较。

例如以下代码,如果A1的值是文本,那么“>Item”无法获得比较结果。

Dim Item As Integer,Rng As

Item=2 Rng=("A1")

MsgBox(>Item)

再如以下代码在VBA中可以正常比较,而在VSTO中则无法比较。

Dim a

a=123

MsgBox a="ABC"

解决办法有两个,如果要比较的对象不是文本,那么可以使用ToString方法将数据

变量转换成文本后再做比较,如果要比较的对象是数值,那么使用If函数判断对象变量是

不是数值,如果不是数值就忽略掉,从而完美解决问题。

因此上面第二段代码的修改方式为“MsgBox ng="ABC"”。

6 / 50

第17章 VSTO与VBA的差异

VS011:

在闭合的空间内声明的变量不能在此空间以外调用。例如在以下过程中If和End if

形成了一个闭合的空间,在此空间声明的变量不能在End If以后调用。

Dim aa As Integer

aa=("A1").Value

If aa>=0 Then

Dim bb As Integer

bb=aa*10

Else

Dim cc As Integer

cc=aa/10

End If

MsgBox(bb+cc)

此外,With…End with语句和Select Case…End Select语句都会形成闭合空间。

7 / 50

第17章 VSTO与VBA的差异

17.1.3 常量

VS012:

在VBA中调用VBA的内部常量和Excel的内部常量都直接写常量名称即可,而在

VSTO中调用Excel的一切内置常量都不能直接写常量名称,要么写该常量对应的数值,

要么对常量加上父对象,表明当前常量来自哪一个类,从而便于识别和理解,但是书写上

就复杂多了。不管使用数值还是添加父对象都需要使用相同办法去搜索目标,因此本节主

要介绍搜索目标的步骤。

假设要把以下代码改成VSTO代码:

Dim Rng As Range

SetRng=(What:=”中

国”After:=ActiveCell,LookIn:=xlFormulas,LookAt:=xlPart)

最先想到的修改结果可能是这样:

Dim Rng As =(What:="中国

",After:=Cell,

LookIn:=xlFormulas,LookAt:=xlPart)

但是很显然,代码无法运行,因为代码中用到了两个Execl的常量——xlFormulas

和xlPart,并未指定该常量的父对象。

8 / 50

第17章 VSTO与VBA的差异

以xlFormulas为例,搜索其父对象的方法是:按下F2键打开对象浏览器,然后在

左上方的搜索框中录入xlFormulas并按下Enter键,右方会弹出xlFormulas相关的信

息,包含它的父对象名称和数值,效果如图17-1所示。

因此,xlFormulas的完整写法是

“ulas”。

同时,图17-1中显示了xlFormulas的常数值为-4123,因此也可以直接写-4123。

用同样的方法可以找到常量xlPart的父对象名称,其完整书写方式为

“”。

17.2 函数

在VSTO中可以调用Excel函数,但是和VBA调用工作表函数稍有区别,而且还删

除了一些函数。如果不了解这些差异,那么将VBA代码改成VSTO代码后无法执行。

17.2.1 调用方式不同

9 / 50

第17章 VSTO与VBA的差异

VS013:

在VBA中调用工作表函数需要加前置的“Worksheetfunction.”,而调用VBA的

内部函数则直接写函数名称或者加前置的“VBA.”。在VSTO中调用Excel的工作表函数

和在VBA中的操作方式完全相同,但调用VBA函数则不能通过“VBA.”实现。

在VSTO中将内部函数分为数值运算函数和文本运算函数,调用数值运算函数可采用

前置的“Math.”,而调用文本运算函数则采用前置的“Strings.”。图17-2和图17-3

展示了调用过程。

10 / 50

第17章 VSTO与VBA的差异

在模块中调用Left或者Right函数可以直接书写函数名称,但是在窗体中调用Left

或者Right函数则必须使用或者。

VS014:

VBA中的参数有时需要加括号,有时不需要加括号;在VSTO中,任何时候都需要加

括号,否则代码无法运行,如下所示。

VBA:

MsgBox

Sheets()

VSTO:

11 / 50

第17章 VSTO与VBA的差异

MsgBox()

(())

17.2.2 函数差异

VS015:

VSTO使用StrDup函数取代了VBA中的string函数,例如:StrDup(5,"P")的

结果是“PPPPP”。

VS016:

在VBA中可以通过“ts”方式调用DoEvents函数,而在VSTO中要

改用“ts”。

VS017:

在VSTO中取消了Lenb、Leftb、Rightb等函数,其中Lenb可用 GetByteCount

取代,其他两个函数则不存在功能相同或相近的函数。

Dim mystr As String="中国人Ab"

MsgBox(Len(mystr))’结果为5

MsgBox(eCount(mystr))’结果为8

12 / 50

第17章 VSTO与VBA的差异

VS018:

Shell在VSTO中的语法有较大变化,语法如下:

Public Function Shell( ByVal PathName As String, Optional ByVal

Style As AppWinStyle=zedFocus, Optional ByVal Wait

As Boolean=False,Optional ByVal Timeout As Integer=-1)As Integer

其中第一参数代表应用程序,第二参数代表处理窗口的方式,第三参数代表是否等待

代码执行完成,赋值为True表示等待,第四参数表示等待时间。具体用法如下:

ID=Shell("""C:Program ""-a-q",,True,100000)

这里的100000是指如果程序大于100000毫秒尚未执行完毕,那么只等待100000

毫秒,就收回控制权。如果不写时间,那么表示一直等待下去,直到调用的程序执行完。

VS019:

VSTO提供了专用的打开网页的方法,不再需要Shell函数。当然,

VBA原本的Shell函数仍然继续支持。以下代码用于打开网址:

("")

方法支持两个参数,第一参数是程序名称,第二参数是程序的参数。

例如要打开C盘,然后选中名为的文件,那么可使用以下代码:

13 / 50

第17章 VSTO与VBA的差异

("","/select,c:")

VS020:

日期的计算方式有较大的变化,在VBA中使用加号或者减号即可计算,而VSTO则

需要使用比较复杂的算法。

日期相减采用Subtract函数。以上代码表示用现在的日期减去2012年8月13日的

天数差异,即对两个日期值求差。

Dim D As Date=#8/13/2012#

I=ct(D).TotalDays

以下代码表示对指定的日期2015年8月13日累加2天,允许累加值为负数。

Dim aa As Date=#8/9/2015#

MsgBox(s(2))

以下代码表示在2012年5月9日基础上累加2个月,从而生成一个新的日期。

MsgBox(DateAdd("M",2,"2012年5月9日"))

VS021:

14 / 50

第17章 VSTO与VBA的差异

VBA有Date函数,用于生成今天的日期,也有Date语句,用于修改电脑右下角显

示的日期。在VSTO中取消Date函数和Date语句,但提供了一个Date关键字,可以

通过它调用与日期相关的一些函数和方法,例如 、、

Year、Month和等。

VS022:

使用Format函数格式化日期时,在VBA中使用m代表月,而在VSTO中小写的m

代表分钟,大写的M才代表月份,因此在VSTO中必须按以下方式录入代码:

Dim aa As Date=#8/9/2015#

MsgBox(Format(aa,"yyyy-M-d"))

MsgBox(Format(aa,"yyyy年MM月dd日"))

17.3 数组

VSTO对数组的处理能力比VBA强大得多,二者差异也较大,必须掌握这些差异才能

让VBA代码在Visual Studio平台中顺利运行。

17.3.1 原本功能的差异

VS023:

在VBA中数组的下标可以是任意值,在定义变量时可以随意指定。VSTO中的数组变

15 / 50

第17章 VSTO与VBA的差异

量不允许下标大于0,例如在“Dim Arr(1 To 5),Arr2(3 To 5)”中的两个数组变量

都不可能声明成功。不过如果引用区域的值从而生成数组,那么该数据的下标则是1。

还有使用GetOpenFilename方法多选文件时,返回的值是一个数组,该数组的下标

也是1。例如在以下代码中,数组变量fileToOpen的第一个值是fileToOpen(1)。

Dim fileToOpen As Array=nFilename("图片文件(*.jpg),

*.jpg",,"

请选择图片文件(支持Ctrl+A全选图片)",,True)

VS024:

不再支持Array函数,而是改用花括号{ }来生成数组,并且可以生成二维数组。以下

代码分别生成了一个一维数组和一个二维数组:

Dim Arr={ “长久”,”黄河”,”松花江”,”珠江”}

Dim Arr2={ {“广东”,”东莞”,”长安” },{ “四川”,”成都””郫县”,},{ “湖

北”,”武汉”,”吴家山”}}

当然,如果一定要创建下标不为0的数组也可以,只是相当麻烦,代码如下:

'创建一个第一维下标为0、上标为10,第二维下标为0、上标为2的一维数组

Dim Arr()As Integer={10,2}

16 / 50

第17章 VSTO与VBA的差异

'创建一个第一维下标为0、上标为2,第二维下标为0、上标为2的一维数组

Dim Arr2()As Integer={2,2}

Dim Arr3 As Array

'赋值后Arr3则是二维数组,其第一维下标是2、上标为11,第二维下标为2、上标

为3

Arr3=Instance(GetType(String),Arr,Arr2)

17.3.2 新增功能

VSTO对数组的管理比较强大,相对于VBA新增了很多新功能,此处简单介绍几个比

较有用的功能。

VS025:

增加了Contains属性,用于判断数组中是否包含某个值,代码如下:

Dim Arr()={"长江","黄河","松花江","珠江"}

MsgBox(ns("黄河"))’返回值为True,表示存在包含关系

VS026:

17 / 50

第17章 VSTO与VBA的差异

增加了计算数组维数的属性Rank,代码如下:

Dim aa(2,4,6)As Array MsgBox()’结果为3

VS0267:

增加了Sort方法,可以对数组进行升序排列,代码如下:

Dim Arr()As String={10,8,2,"ABC"} (Arr)

VS028:

VSTO中新增了、和ainedCopy,都可用

于复制数组。第一个方法只对一维数组有效,后两种方法可以复制一维与二维数组。此处

仅介绍。

Dim Arr()As String={"A","B","C","D","E"} Dim Arr2()As

String={1,2,3,4,5,6,7,8,9,10}

(Arr2,2)’将数组Arr的值复制到数组Arr2中,起始位置为第3个

复制后数组Arr2的值包含“1,2,A,B,C,D,E,8,9,10”。

17.4 窗体

17.4.1 名称变化

18 / 50

第17章 VSTO与VBA的差异

VS029:

在VSTO中对窗体和几个常用控件的名称做了更改,主要体现在以下几个方面。

在VBA中窗体称为UserForm1,而在VSTO中称为Form1。

在VBA中按钮称为CommandButton1,而在VSTO中称为Button1。

在VBA中框架称为Frame1,而在VSTO中称为GroupBox1。

在VBA中多页控件称为TabStrip1或者Page1,而在VSTO中称为TabControl1。

VS030:

相对于VBA中的窗体或者控件,VSTO增加了很多新的事件,即使相同的事件在名称

上也有所变化。

VBA中的UserForm_Initialize事件,在VSTO中改成了Form1_Invalidated事件;

VBA中的UserForm_AddControl事件,在VSTO中改成了Form1_ControlAdded

事件;

VBA中的UserForm_Activate事件,在VSTO中改成了Form1_Activated事件;

VBA中的UserForm_QueryClose事件,在VSTO中改成了Form1_Closed事件;

19 / 50

第17章 VSTO与VBA的差异

VBA中的CommandButton1_DblClick事件,在VSTO中改成了

Button1_DoubleClick事件。

更多的事件名称变化不再一一举例,通常可以通过名称看出其功能。

有必要特别强调的是VSTO中增加了很多新的事件,从而让操作更加细化。

例如在VBA中只有一个关闭窗体的事件,而VSTO中则区分了Closed事件和

Closing事件,先触发Closing事件,后触发Closed事件。

再如VBA中窗体或者按钮只有一个Click事件,而在VSTO中则同时有Click和

MouseClick事件,前者在单击鼠标或者按【Enter】键时触发事件,后者只在单击鼠标

时才触发事件。

还有,在VBA中对按钮控件提供了一个MouseMove事件,在鼠标移过按钮时触发,

而在VSTO中则提供4个事件,包含光标进入按钮、移过按钮、停在按钮上方和离开按钮

时触发,4个事件分别为MouseEnter、MouseMove、MouseHover和MouseLeave

VS031:

`在VBA中可以直接使用代码显示窗体,而在VSTO中则必须通

过Dim语句声明一个代表目标窗体的对象实例,然后通过这个变量调用窗体的Show方

法,模板如下:

Sub Test()

20 / 50

第17章 VSTO与VBA的差异

Dim f As New Form1

()

End Sub

在显示窗体时最好加一句“t=True”,表示让窗体置于所有窗口的最顶端。

而在窗体中使用ox或者alog调用“浏览”对

话框时,则应该将窗体的TopMost属性修改为False,避免“浏览”对话框被当前窗体

覆盖,影响操作。

17.4.2 调用方式变化

VS032:

VBA窗体和控件的Caption属性或者Value属性都被VSTO中的Text属性取代了。

VS033:

VBA中获得焦点的SetFocus方法在VSTO中修改成了Focus方法。

VS034:

窗体控件的颜色不再是一个数值,而是一个对象。VSTO提供了两个方法让窗体控件

的颜色与代表单元格背景色的颜色值互相转换,FromOle方法表示将颜色数值转换成窗体

控件的颜色,ToOle方法则相反。

21 / 50

第17章 VSTO与VBA的差异

Sub test()

Dim Rng As =("A1")’声明变量并赋值

'让标签控件的背景色等于单元格的背景色

lor=e

()

让单元格的背景色等于标签控件的背景色

=

(lor)

End Sub

VS035:

要在VBA中设置窗体中的某个控件的提示信息,对该控件的ControlTipText属性赋

值即可,而在VSTO中的步骤则是先在窗体中添加一个ToolTip控件,然后在窗体的Load

事件中通过SetToolTip方法对控件指定提示信息。

例如要对窗体中的Button1控件添加提示信息,代码如下:

Private Sub Form2_Load(sender As Object,e As EventArgs)Handles

22 / 50

第17章 VSTO与VBA的差异

lTip(Button1,"单击此按钮可执行XXX命令")

End Sub

第一参数是对象,第二参数是要显示的内容,代码运行效果如图17-4所示。

VS036:

在判断用户在文本框输入过程中是否按下了某个键时,VSTO的判断过程有了较大的

变化。在VSTO中,文本框的KeyPress事件有sender和 e两个参数,其中参数e即代

表按键。可以将按键转换成字符,然后与内置的常量进行比较,从而判断用户按下了哪个

键。

以下事件过程是在文本框中按下任意键时触发,事件过程可以判断用户是否按下了回

车键或者录入了任意大写字母。

Private Sub TextBox1_KeyPress(sender As Object,e As

ssEventArgs)Handles ss

23 / 50

第17章 VSTO与VBA的差异

'判断用户是否按下了回车键,或者录入了大写字母

If r=Chr()Then MsgBox("

你按下了回车键")

If Asc(ng)>=65 And Asc(ng)<=90 Then

MsgBox("你录入了大写字母")

End Sub

判断用户是否输入了数值则用以下代码:

If not IsNumeric(r,ToString) Then MsgBox(“你输入的不是数值”)

VS037:

在VSTO中字体是一个类,需要创建一个Font类,然后将它赋值给Font对象。例

如要对窗体中Textbox1的字体设置为黑体、12号且加粗,那么代码如下:

=New ("黑体

",12,)

如果要将标签Label1的字体设置为倾斜,那么代码如下:

=New

(,)

24 / 50

第17章 VSTO与VBA的差异

若要恢复不倾斜的状态,则用以下代码:

=New

(,r)

VS038:

将窗体控件上移一层不再使用Zorder属性,而是采用BringToFront方法。

例如代码“oFront()”可以让文本框上移一层。

VS039:

关闭窗体的方法产生了变化。

VBA:Unload me

VSTO:()

VS040:

列表框是否允许多选的控制方式产生了变化,例如让列表框支持多选,代码如下。

VBA:elect=fmMultiSelectMulti

VSTO:ionMode=ionMode.M

25 / 50

第17章 VSTO与VBA的差异

ultiExtend

VS041:

列表框中添加单个值的代码有所变化。

在VSTO中添加了Items属性,有很多操作都需要借助Items来实现,即VBA中的

部分方法和属性移到了Items的下面,需要通过Items才能调用。

VBA:m Item

VSTO:(Item)

VS042:

列表框中添加一组值的代码有所变化。

VBA:

=Arr'Arr是一维数组

VSTO:

ge(Arr)

VBA中“=Arr”这种赋值方式会用新值覆盖原值(假设列表框中已经

26 / 50

第17章 VSTO与VBA的差异

有值),而VSTO中的AddRange方法属于追加数据,不会覆盖原值,因此如果要达到

VBA的相同功能,应该在赋值前加一句“()”。

VS043:

删除列表框中的当前选中的条目,VSTO的语法稍有变化。

VBA:Item dex

VSTO:()

VS044:

VSTO中取消了列表框的List属性,以下代码展示了在引用列表框的单个值时,二者

的不同之处。VBA:(1) VSTO:(1)

在引用列表框的所有值时,VBA可以用以下这句代码完成。

Range("a1").Resize(unt,1)=

而VSTO则麻烦得多,必须借助CopyTo方法,将列表框的值赋值给数组,然后再将

数组的值写入到区域中。

Dim Arr(-1)As Object

(Arr,0)

27 / 50

第17章 VSTO与VBA的差异

(1).Resize

(,1).value=eetFunction.

Transpose(Arr)

同理,对于某些非花扩号生成的,下标不为0的数组,要将数组赋值给列表框也不能

直接赋值,需要先利用CopyTo方法转到数组变量中,再将数组变量的值赋予列表框。例

如:

Dim ArrList

ArrList=nFilename("请选择文件(*.*),*.*",,,,True)

If TypeName(ArrList)="Object()"Then

Dim Arr(ngth-1)As Object ’其中LongLength代表数组的

元素个数

(Arr,0)

ge(Arr) ’将用户选择的所有文件名称导入到列

表框中

End If

VS045:

28 / 50

第17章 VSTO与VBA的差异

VSTO中对列表框的项目计数方式有所变化。

VBA:unt

:

VS046:

让列表框的某一行呈选中状态的方法由Selected改成了SetSelected,而且语法也

不相同,以“选中第三行”为例。

VBA:ed(2)=True

VSTO:ected(2,True)

以上关于列表框的所有变化内容,同样适用于组合框控件。

17.4.3 功能变化

VS047:

在VSTO中,Height和Width属性是以像素为单位的;而在VBA中,窗体的Height

和Width属性则以磅为单位。磅与像素的换算单位是:1磅等于4/3像素,约1.333333

像素。因此,以下两句代码获得的窗体高度基本一致。

VBA:=400

29 / 50

第17章 VSTO与VBA的差异

VSTO:=400*1.333333

VS048:

VBA中的列表框可以显示多列,可以将二维数组赋值给列表框,而VSTO中不允许显

示多列,只支持一维数组。

如果要在窗体中显示二维数组,那么可以用ListView控件代替列表框,不过ListView

控件最大的缺点是不能像VBA中的列表框那样一句话赋值一个二维数组给控件,而是需要

一个一个将值添加进去,在效率上较差,代码也相当长。

17.5 字典与正则表达式

关于字典与正则表达式,VSTO提供了新的调用方式,但是同时也保留了与VBA相同

的语法,兼容VBA规范的代码。

17.5.1 字典

VS049:

VBA的代码可以直接应用于VSTO中,只是在将字典的值输出到单元格时要对Range

对象添加.Value,其他都一样。

Sub 字典应用模板()

With CreateObject("nary")

30 / 50

第17章 VSTO与VBA的差异

. esize(1,.Count).Value=.items

End With

End Sub

以下是VSTO新增的字典用法:

Sub字典应用模板升级版()

Dim Dic As New Dictionary(Of String,String)

With Dic

.Add("1","A")

.Add("2","B")

.Add("3","C")

("A1").Resize(1,.Count).Value=.y()

("A2").Resize(1,.Count).Value=.y()

End With

31 / 50

第17章 VSTO与VBA的差异

End Sub

17.5.2 正则表达式

VS050:

VSTO完全兼容VBA中的正则表达式语法,不过同时也新增了自己的语法,模板如下:

Sub 字典基本用法模板()

Dim Dic As New Dictionary(Of String,String)

With Dic

.Add("1","A")

.Add("2","B")

.Add("3","C")

("A1").Resize(1,.Count).Value=.y()

("A2").Resize(1,.Count).Value=.y()

End With

32 / 50

第17章 VSTO与VBA的差异

End Sub

17.6 菜单与功能区

Excel 2016支持传统的工具栏和工作表菜单,但是传统的工具栏和工作表菜单已经边

缘化了,今后将会大力推广功能区菜单。但是本节仍然阐述在VSTO中为Excel插件创建

传统菜单和功能区按钮的代码与VBA之间的差异。

17.6.1 工作表菜单

VS051:

在VSTO中创建工作表菜单采用以下模板即可:

WithEvents 子菜单 As dBarButton

Public Sub 建菜单()

子菜单=dBars(1).

(trolButton,,,,True)

With 子菜单

.Style=tonIconAndCaption

.Caption="新菜单"

33 / 50

第17章 VSTO与VBA的差异

.FaceId=483

End With

End Sub

Private Sub 子菜单 _Click(Ctrl As

dBarButton,ByRef CancelDefault As Boolean)

Handles 子菜单.Click

MsgBox("玩转VSTO")

End Sub

使用以上模板的方法是:需要在创建菜单时,将以上代码复制到模块中,然后根据需

求修改菜单的Caption和FaceId两个参数,再将要关联的过程放到“子菜单_Click”事

件中,最后在“ThisAddIn_Startup”事件加上代码“Call 建菜单()”即可,代码运行

效果如图17-5所示。调用创建菜单的方法在第19章中有应用案例。

34 / 50

第17章 VSTO与VBA的差异

17.6.2 功能区菜单

功能区按钮的设计过程在前16章已经讲过,本章不再讲述VBA与VSTO设计功能区

按钮的差异,而是讲解回调方面的差异。

VS052:

在VSTO中为功能区按钮绑定Sub过程比VBA中更方便,具体方法是双击按钮从而

进入功能Ribbon控件的代码窗口,此时光标会自动进入当前按钮的Click事件过程中,

在此处直接录入事件过程的代码即可。如果在模块中已经录入了Sub过程,那么在此处调

用该过程名称即可。

VS053:

在VBA中使用回调控制功能区按钮的Label和图像是比较困难的,步骤相当烦琐,

而在VSTO中只要一句代码即可回调。假设已经设置好了一个功能区按钮,其Label属性

的默认值为“Yes”,其OfficeImageId 属性的默认值为“AcceptInvitation”,要求

单击按钮后将Label属性的值改为“No”,OfficeImageId属性值改为

“DeclineInvitation”,再次单击按钮返回默认值,那么可用以下代码完成:

Imports ’此句必须放在最顶端,用于声明命名空

Private Sub Button1_Click(sender As Object,e As

RibbonControlEventArgs)Handles ’此代码'放在Class与End Class

35 / 50

第17章 VSTO与VBA的差异

之间

=IIf(="Yes","No","Yes")

ImageId=IIf

(ImageId="DeclineInvitation","AcceptInvitation",

"DeclineInvitation")

End Sub图17-6和图17-7分别是按钮的默认状态和单击按钮后的状态。在图17-7

状态下再次单击按钮,按钮会回到默认状态。

36 / 50

第17章 VSTO与VBA的差异

VS054:

上一段代码只能在Ribbon组件的代码窗口中使用,如果在模块的Sub过程中实现回

调就需要用不同的思路了。

假设仍然要实现上面的需求,但需要在模块的Sub过程中完成,那么代码如下:

Sub abc()

37 / 50

第17章 VSTO与VBA的差异

Dim Btn1 As

Button=1.

Groups(0).Items(0)

=IIf(="Yes","No","Yes")ImageId=IIf

(ImageId="DeclineInvitation","AcceptInvitation","DeclineInvitati

on")

End Sub

其中Groups(0)代表第一组,Items(0)代表第一组中的第一个按钮。

当然也有更简单的办法,不借助变量,添加前缀“1”后

直接引用Button1,代码如下:

Sub abc()

With 1

.Label=IIf(.Label="Yes","No","Yes")

.OfficeImageId=IIf

(.OfficeImageId="DeclineInvitation","AcceptInvitation","DeclineInvitation")

End With

38 / 50

第17章 VSTO与VBA的差异

End Sub

17.7 管理文件与目录

管理文件包含文本文件的读取与写入,以及复制文件、移动文件、删除文件。而管理

目录则包含新建文件夹、删除文件夹、移动文件夹和重命名文件夹。VSTO与VBA的命令

名称是基本一致的,二者仅仅调用方式不同。

17.7.1 管理文件

VS055:

VSTO中保留了VBA的处理文本文件的语法,同时也新增了自己专用的语法。以下代

码表示在C盘新建一个名为的文本文件,然后向该文件写入数据,写完后关闭文

件,最后执行这个文件中的命令。命令的功能是获取当前计算机的IP地址。

Sub创建文本文件且执行文件的模板()

Dim SW As Writer=xtFileWriter

("c:",False,oding("GB2312"))

ine("@echo off")’写入第一行

ine("ipconfig")’写入第二行

ine("pause")

39 / 50

第17章 VSTO与VBA的差异

()

("c:")

End Sub

VS056:

在读取文本文件的所有内容方面,VSTO中新增了比VBA更简单的代码。

假设要读取C盘中文件的内容,使用以下模板即可:

Sub 读取文本文件模板()

Dim sr As New Reader("c:",t)

MsgBox(End())

()

End Sub

VS057:

在VBA中用 CreateObject("stemObject")方法创建FSO对

象的引用然后通过它调用FSO的方法和属性在VSTO中则用stem

40 / 50

第17章 VSTO与VBA的差异

调用FSO的所有方法和属性VSTO与VBA中的FSO对象调用方式不同语法也有一定差

异。

复制文件:le(源文件名,目标文件名,是否覆

盖文件)

命名文件:File(要重命名的文件名称,新名称)

需要注意的是,RenameFile的第二参数不能带路径,这点与VBA不同。

命名文件或文件夹:(原本的路径,新路径)。

需要注意的是,Rename方法既能命名文件也能命名文件夹,它的第二参数必须带有

路径。

删除文件:File(文件路径)

判断文件是否存在:ists(文件路径)

VS058:

获得文件的创建时间、最后一次访问时间和修改时间。

Dim Finfo As fo=eInfo

("C:")

41 / 50

第17章 VSTO与VBA的差异

MsgBox(onTime) ’创建时间

MsgBox(cessTime) ’最后一次访问时间

Msgbox(iteTime) ’最后一次修改时间

VS059:

获取文件的扩展名,使用Extension属性即可。

Dim Finfo As fo=eInfo("D:报

表.docx")

MsgBox(ion)

17.7.2 管理目录

VS060:

VSTO用于管理目录的代码与VBA相比稍有变化。

命名文件夹:Directory(文件夹名称,新名称)

新建文件夹:Directory(文件夹路径)

删除文件夹:Directory(路径,文件夹非空时

42 / 50

第17章 VSTO与VBA的差异

的处理方式)

如果要删除的文件夹中有文件那么对第二参数赋值为

AllContents时表示删除所有文件和目录,在对

第二参数赋值为fDirectoryNonEmpt时则表

示不删除文件和目录但会产生一个异常(异常不等于错误可以使用Try…End Try语句捕

获这个异常)。

移动文件夹:rectory(原路径,新路径)

VS061:

在VBA中要获得桌面,我的文档等路径需要调用脚本语言而在VSTO中调用内置语言

即可

VBA:

CreateObject("").("Desktop")——桌面

CreateObject("").("Favorites")——收

藏夹

CreateObject("").("AllUsersStartMenu")

——开始菜单

CreateObject("").("MyDocuments")

43 / 50

第17章 VSTO与VBA的差异

——我的文档

VSTO:

p——桌面

derPath(tes)——收

藏夹

derPath(enu)——

开始菜单

ments ——我的文档

17.8 杂项

本节讲述若干在开发插件时比较有用的小功能。

VS062:

在VSTO中关于在剪贴板中写入数据或读取数据方面提供了比VBA更简化的代码。

假设需要将A1和A2的值串成一个字符串写入到剪贴板中,使用VBA完成需要先引

用文件,然后在模块中录入以下代码:

Sub VBA写入剪贴板()

44 / 50

第17章 VSTO与VBA的差异

Dim MyData As DataObject ’声明变量

Set MyData=New DataObject ’新建一个DataObject类的实例

t Range("A1")&Range("A2") ’将A1与A2的值合并,然

后赋值给变量

lipboard ’将变量的值写入到剪贴板中

End Sub

而在VSTO中仅需一句代码即可完成:

Sub VSTO写入剪贴板() ’将A1与A2的值合并,然后写入剪

贴板

t(("A1").Value&

("A2").

Value)

End Sub

VS063:

VSTO提供了播放wav音乐的办法,仅需一句代码:

45 / 50

第17章 VSTO与VBA的差异

My (“凡人歌.wav”)

如果播放MP3格式的音乐则需要调用API函数了,代码如下:

Private Declare Function mciSendString Lib "" Alias

"mciSendStringA"(ByVal lpstrCommand As String,ByVal lpstrRetumString As

String,ByVal uReturnLength As Int16,ByVal hwndCallback As Int16)As Int16

Sub 播放Mp3()

mciSendString("open C:凡人歌.mp3"&"alias mp3",0,0,0)

mciSendString("Play mp3",0,0,0)

End Sub

Sub 关闭()

mciSendString("close mp3",0,0,0)

End Sub

在VBA中也可以使用以上代码,但是Int16需要改成Long或者Integer,VBA中没

有Int16这个数据类型。

VS064:

46 / 50

第17章 VSTO与VBA的差异

判断当前是否按下了Shift/Ctrl键,VBA中未提供此类工具,调用API函数可以实

现。VSTO中一句代码即可实现。

If eyDown Then MsgBox("您按下了Shift键")

If yDown Then MsgBox("您按下了Ctrl键")

VS065:

VSTO中不再支持Ontime和OnKey方法,但是对于Sendkeys还是支持的,只是

调用方式发生了改变,不再通过Application方式调用,而是用rd

方式调用。

ys("%ti")'Alt+T+I快捷键打开“加载宏”对

话框

VS066:

在VSTO中读写注册表使用SaveSetting和GetSetting方法,它们只能操作固定键

值的注册表信息;在VSTO中使用SetValue和GetValue方法,可以读写任意键值。

以下代码表示用SetValue在

“HKEY_CURRENT_USERSOFTWAREMicrosoftABCD”这个路径下创建一个名为

“EFG”的子键且指定键值123然后使用GetValue读取该键值:

ue

47 / 50

第17章 VSTO与VBA的差异

("HKEY_CURRENT_USERSOFTWAREMicrosoftABCD","EFG",123,Microsoft.

MsgBox(ue("HKEY_CURRENT_USERSOFTW

AREMicrosoftABCD","EFG",0))

VS067:

在VBA中未提供播放gif动画的代码,在VSTO中可以借助窗体控件PictureBox

来播放动画,方法是在窗体中添加一个PictureBox1控件,然后在窗体的Form1_Load

事件中加入以下代码:

=le("c:")’请根据实际情况修改路

VS068:

在VBA中代码错误分为编译错误和运行时错误,有些编译错误会在运行前通过颜色提

示用户,还有些编译错误在运行时弹出对话框通知用户。而运行时错误则是在运行代码时

弹出对话框通知用户。在VSTO中不仅有错误,还有异常,代码产生错误时会明显地通知

用户,但是当代码产生异常时则可能不产生任何通知,同时也不产生正确结果,此时想要

解决问题就比较困难。

VSTO提供了捕获异常的工具Try…End Try,可通过它找出所有异常。以下代码的功

能是让用户在输入框中录入年龄,然后利用Int函数将年龄取整,再通过Msgbox展示在

48 / 50

第17章 VSTO与VBA的差异

对话框中。

Sub test()

Dim myval As Object=ox("请输入年龄")

MsgBox("您今年:"&Int(myval)&"岁整")’使用Int表示当年岁有小数时只

取整数

Catch ex As Exception

MsgBox(ng)

End Try

End Sub

将代码改成以上形式后,如果用户输入正常的值,那么程序的执行结果和不采用

Try…End Try语句时完全一样;如果用户录入了文本,那么执行过程中会弹出异常提示,

包含异常的原因和产生异常的模块名称、过程名称,以及代码的行数。

VS069:

Excel的VBA代码可以直接按【F8】键逐句运行从而调试代码,利用VSTO开发Excel

的外接程序时无法调用【F8】键,要逐句运行代码可以按以下步骤执行。

49 / 50

第17章 VSTO与VBA的差异

选中需要调试过程的第一句,然后按下【F9】键,表示在此设置一个断点。接着单击

工具栏的“启动”按钮或者按【F5】键启动插件,当打开Excel程序后,单击功能区按钮

运行Sub过程,此时会激活Visual Studio 2015的代码窗口,同时Sub过程会执行到

设置断点的位置并自动停下。此时每按一次【F8】键,Sub过程会执行一句代码,从而便

于用户调试代码。

50 / 50


本文标签: 代码 调用 函数 方法 需要