VBA常用技巧代码解析
使用自定义函数取得应用程序的安装路径,如下面的代码所示。
#001 Function GetSetupPath(AppName As String) #002 Dim WSH As Object
#003 Set WSH = CreateObject(\
#004 GetSetupPath = WSH.RegRead(\#005 & \#006 & AppName & \#007 Set WSH = Nothing #008 End Function #009 Sub WinRARPath()
#010 MsgBox GetSetupPath(\#011 End Sub
代码解析:
自定义GetSetupPath函数取得应用程序的安装路径,其中参数AppName代表指定的应用程序的名称。
第3行代码使用CreateObject函数将Wscript.Shell对象的引用赋给变量WSH。 CreateObject函数创建并返回一个对ActiveX 对象的引用,语法如下:
CreateObject(class,[servername])
参数class是必需的,Variant (String),要创建的应用程序名称和类。
参数servername是可选的,Variant (String),要在其上创建对象的网络服务器名称。如果servername是一个空字符串(\,即使用本地机器。
第4行代码取得AppName参数指定的应用程序在注册表中的路径。
WinRARPath过程使用消息框显示由自定义的GetSetupPath函数取得的应用程序“WinRAR”的安装路径。
运行WinRARPath过程结果如图 16-1所示。
图 16-1 应用程序安装路径
26
VBA常用技巧代码解析
技巧17 数组的使用
17-1
代码运行时创建数组
使用Array函数可以在代码运行时创建数组并把一系列数据保存在数组中,示例代码如下:
#001 Option Base 1 #002 Sub arr()
#003 Dim arr As Variant #004 Dim i As Integer
#005 arr = Array(\王晓明\吴胜玉\周志国\曹武伟\张新发\卓雪梅\\沈煜婷\丁林平\
#006 For i = LBound(arr) To UBound(arr) #007 Cells(i, 1) = arr(i) #008 Next #009 End Sub
代码解析:
Arr过程使用Array函数创建一个数组用来保存数据并将其写入到工作表的单元格区域。
第1行代码使用Option Base语句声明数组下标的缺省下界为1,数组下标的缺省下界默认为0。
第5行代码使用Array函数创建数组用来保存数据。Array函数返回一个包含数组的Variant,语法如下:
Array(arglist)
Arglist参数是一个用逗号隔开的值表,这些值用于给Variant所包含的数组的各元素赋值。如果不提供Arglist参数,则创建一个长度为 0 的数组。
第6行代码使用LBound函数和UBound函数取得数组的最小和最大下标。
LBound函数返回一个Long型数据,其值为指定数组维可用的最小下标,语法如下:
LBound(arrayname[, dimension])
UBound函数返回一个Long型数据,其值为指定数组维可用的最大下标,语法如下:
UBound(arrayname[, dimension])
参数arrayname是必需的,数组变量的名称。
参数dimension是可选的,指定返回哪一维的下界,1表示第一维,2表示第二维,如
27
VBA常用技巧代码解析
此类推。默认为1。
UBound函数与LBound函数一起使用,可以用来确定数组的大小。
第7行代码确定数组的大小后使用For...Next语句遍历数组元素并将数组元素依次写入到工作表的A列单元格中,如图 17-1所示。
图 17-1 将数组元素写入工作表
17-2 文本转换为数组
在处理字符串时可以使用Split 函数将字符串按指定的分隔符分开并以数组返回,代码如下:
#001 Sub Splitarr()
#002 Dim Arr As Variant
#003 Arr = Split(Sheet2.Cells(1, 1), \
#004 Sheet1.Cells(1, 1).Resize(UBound(Arr) + 1, 1) = Application.Transpose(Arr)
#005 End Sub
代码解析:
Splitarr过程使用Split 函数将工作表Sheet2中A1单元格的姓名分别写入到工作表Sheet1中的A列单元格。
Split 函数返回一个下标从零开始的一维数组,包含指定数目的子字符串,语法如下:
Split(expression[, delimiter[, limit[, compare]]])
参数expression是必需的,包含子字符串和分隔符的字符串表达式。
参数delimiter是必需的,用来标识子字符串边界的字符串字符。如果忽略,则使用空格字符(\作为分隔符。
第4行代码,首先使用UBound函数取得返回数组的最大下标后调整单元格区域,因为数组下标的缺省下界默认为0,所以在使用Resize属性调整单元格区域时参数RowSize
28
VBA常用技巧代码解析
需要在返回数组的最大下标上加一。
然后使用工作表Transpose函数将返回数组转置后写入到工作表调整后的单元格区域中。
工作表Transpose函数返回转置单元格区域,即将一行单元格区域转置成一列单元格区域,反之亦然,语法如下:
TRANSPOSE(array)
参数array为需要进行转置的数组或工作表中的单元格区域。
Splitarr过程将如图 17-2所示的工作表单元格中的字符串以逗号分隔后依次写入到工作表的A列单元格中,如图 17-3所示。
图 17-2 工作表单元格中的字符串
29
VBA常用技巧代码解析
图 17-3 文本转换为数组写入单元格
17-3 使用动态数组去除重复值
在技巧17-2中使用数组函数将单元格中的文本进行分隔后写入到工作表Sheet1中的A列单元格,但是如果文本中含有大量的重复值,在写入时也会将重复值写入到工作表中,此时可以使用动态数组去除文本中的重复值,如下面的代码所示。
#001 Sub Splitarr()
#002 Dim Splarr() As String #003 Dim Arr() As String #004 Dim Temp() As String #005 Dim r As Integer
30