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
版权声明:本文标题:VSTO开发与VBA编程的不同点总结 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1713921359a657814.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论