您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页Excel VBA Contents

Excel VBA Contents

来源:爱go旅游网
Table of Contents

1

函数与方法 ................................................................................................................ 3 1.1 VBA,字符串处理大全 ........................................................................................ 3

1.1.1 VBA中处理字符串的函数 ....................................................................... 3 1.1.2 转换字符串 ............................................................................................. 4 1.1.3 创建字符串 ............................................................................................. 6 1.1.4 获取字符串的长度................................................................................... 7 1.1.5 格式化字符串 .......................................................................................... 8 1.1.6 查找字符串 ........................................................................................... 16 1.1.7 提取字符/字符串 ................................................................................... 17 1.1.8 示例 ..................................................................................................... 28 1.2 关闭屏幕刷新 .............................................................................................. 31 1.3 Msgbox 内换行 ............................................................................................... 31 1.4 在VBA中设置一个变量的小数点位数 .......................................................... 32 1.5 类型转换函数 .............................................................................................. 32 1.6 Select Case 语句 .......................................................................................... 34

1.6.1 语法 ..................................................................................................... 34 1.6.2 说明 ..................................................................................................... 35 1.6.3 Select Case 语句也可以是嵌套的........................................................ 36 1.6.4 和Case子句一起使用Is ...................................................................... 38 1.6.5 确定Case子句里数值的范围 ................................................................ 38 1.6.6 在Case子句里确定多个表达式 ............................................................ 40 1.7 Vba暂停几秒的代码 ....................................................................................... 40

1.7.1 自动式的VBA暂停语句 ......................................................................... 40 1.7.2 手工暂停VBA语句的办法 ..................................................................... 41 1.8 TreeView 控件 ............................................................................................... 41

1.8.1 打开TreeView控件 .............................................................................. 41 1.8.2 点击时加入子节点,找出树中当前节点的级数 ........................................ 41 1.9 VBA listview控件用法 .................................................................................... 45

1.9.1 应用帮助(vba) ....................................................................................... 45 1.9.2 显示数据表内容 .................................................................................... 46 1.9.3 VBA 点 listview 列名时自动排序(超有用) .............................................. 47 1.10 窗体上显示图表 .......................................................................................... 48

1.10.1 其实装载的只是一个图片 ..................................................................... 48 1.10.2 在窗体上显示图表 ................................................................................ 51 1.11 如何让VBA制作的窗体即在前端显示又不影响表使用................................ 56 应用实例 .................................................................................................................. 56 2.1 获取工作表使用的最大行数 ........................................................................ 56 2.2 利用动态数组获取当前目录下指定文件类型的文件 ..................................... 59

2

1 函数与方法

1.1 VBA,字符串处理大全 VBA中的字符串

VBA不仅可以处理数字,也可以处理文本(字符串)。VBA提供了两类字符串: 一类为固定长度的字符串,声明时包含指字的字符数。例如,下面的语句 Dim strFixedLong As String*100

声明字符串变量后,无论赋予该变量多少个字符,总是只包含100个字符,但字符串最长不超过65526个字符,且需要使用Trim函数去掉字符串中多余的空格。定长字符串只有在必要时才使用。

另一类为动态字符串。例如,声明字符串变量Dim strDynamic As String后,可以给该变量任意赋值,最多可包含20亿个字符。

1.1.1 VBA中处理字符串的函数

比较字符串

通常,在VBA中进行字符串比较时,会用到比较运算符(如=、>等)、Like运算符和StrComp函数。此外,在模块的开头用Option Compare语句指定比较方式。

1.1.1.1 比较运算符

可以采用简单的逻辑运算符进行两个字符串的比较,即<(小于)、<=(小于或等于)、>(大

于)、>=(大于或等于)、=(等于)、<>(不等于)。此外,还可以使用Like运算符进行比较。

1.1.1.2 StrComp函数

StrComp函数返回字符串比较的结果。其语法为: StrComp(string1,string2[,compare])

其中,参数string1和strng2为必需的参数,可以是任何有效的字符串表达式。

参数Compare为可选参数,如果该参数为Null,将发生错误。如果参数Compare设置为常数vbUseCompareOption或-1或忽略该参数,将使用Option Compare语句设置进行比较;如果忽略该参数且没有设置Option Compare语句,则按二进制进行比较;如果参数Compare设置为常数vbBinaryCompare或0,则用二进制进行比较;如果参数Compare设置为常数vbTextCompare或1,则按文本进行比较;如果参数Compare设置为常数

vbDatabaseCompare或2,此时仅适用于Microsoft Access,进行基于数据库信息的比较。 StrComp函数的返回值为:如果String1String1=String2,则返回值为0;如果String1>String2,则返回值为1;如果String1或String2为Null,则返回值为Null。 看看下面的示例:

Sub testStringCompare()

Dim MyStr1 As String, MyStr2 As String, MyComp1, MyComp2, MyComp3, MyComp4 MyStr1 = \"ABCD\" MyStr2 = \"abcd\"

MyComp1 = StrComp(MyStr1, MyStr2, 1) ' 返回 0 MyComp2 = StrComp(MyStr1, MyStr2, 0) ' 返回 -1 MyComp3 = StrComp(MyStr1, MyStr2) ' 返回 -1 MyComp4 = StrComp(MyStr2, MyStr1) '返回1

MsgBox \"StrComp(MyStr1, MyStr2, 1)的结果为:\" & MyComp1 MsgBox \"StrComp(MyStr1, MyStr2, 0)的结果为:\" & MyComp2 MsgBox \"StrComp(MyStr1, MyStr2)的结果为:\" & MyComp3 MsgBox \"StrComp(MyStr2, MyStr1)的结果为:\" & MyComp4 End Sub

示例说明:如果StrComp函数的第三个参数值为1,则以文本比较的方式进行字符串比较;如果第三个参数值为0或忽略该参数,则以二进制比较的方式进行字符串比较。注意,文本比较的方式不区分字母大小写,而二进制比较方式则区分大小写。 [编程方法和技巧] 完成一次简单的单一比较,如 If UCase(sString1)If StrComp(sString1,sString2,vbTextCompare)=-1 Then 在性能上要提高30%,且更容易阅读和理解。

1.1.2 转换字符串

1.1.2.1 StrConv函数

使用StrConv函数来按指定类型转换字符串。其语法为:

StrConv(string,conversion,LCID)

其中,参数string为要转换的字符串,参数conversion为指定转换的类型,参数LCID为可选参数。

如果将参数conversion设置为vbUpperCase或1,则将字符串转换成大写;设置为

vbLowerCase或2,则将字符串转换成小写;设置为vbProperCase或3,则将字符串中每个字的开头字母转换成大写;设置为vbUnicode或64,则根据系统的缺省码页将字符串转换成Unicode;设置为vbFromUnicode或128,则将字符串由Unicode转换成系统的缺省码页。

在将ANSI格式的Byte数组转换成字符串时,应使用StrConv函数;转换Unicode格式的数组时,使用赋值语句。下面的例子使用StrConv函数将Unicode字符串转换成ANSI字符串:

Sub testConverseString() Dim i As Long Dim x() As Byte

x = StrConv(\"ABCDEFG\转换字符串。 For i = 0 To UBound(x)

Debug.Print x(i) Next End Sub

下面的例子将句子中每个词语的首字母转换为大写: Sub testConverseString2()

Debug.Print StrConv(\"my book is this book.\End Sub

程序运行后,在VBE窗口中的立即窗口中将会看到上述结果。

下面的示例演示了如何把一个字符串转换为字节数组,以便使用在API函数调用中: Sub Test()

Dim byArray() As Byte Dim sString As String sString = \"Some stuff\"

byArray = StrConv(sString, vbFromUnicode) End Sub

StrConv函数将下面的字符看成是字的分隔符: Null:Chr$(0)

水平制表符:Chr$(9) 换行符:Chr$(10)

垂直制表符:Chr$(11) 换页符:Chr$(12) 回车符:Chr$(13) 空格:Chr$(32)

[编程方法和技巧] 在使用API时该函数很重要,很多程序调用都要求传递给它们Unicode字符,或者赋给返回变量Unicode字符。

1.1.2.2 Str函数

将数值转换成字符串,即返回代表一个数值的字符串。其语法为: Str(number)

当一个数字转成字符串时,总会在前面保留一个空位来表示正负,即字符串的第一位一定是空格或正负号。如果参数number为正,返回的字符串前面包含一空格。Str函数将句点(.)作为有效的小数点。示例如下:

MyString = Str(459) ' 返回 \" 459\"

MyString = Str(-459.65) ' 返回 \"-459.65\" MyString = Str(459.001) ' 返回 \" 459.001\"

[编程方法和技巧] 使用LTrim函数可删除Str函数在返回的字符串开头添加的前导空格。此外,CStr函数和Format函数已经取代了Str函数,CStr函数不用为正数的符号而添加前导空格,Format函数能够用来识别小数点。

1.1.2.3 CStr函数

CStr将数值表达式转换成String数据类型。示例如下:

MyDouble = 437.324 ' MyDouble 为 Double 类型

MyString = CStr(MyDouble) ' MyString 的内容为\"437.324\"

[编程方法和技巧] 传递给CStr的未初始化的数字数据类型返回“0”,传递给CStr的未初始化的日期变量返回“0:00:00”。

1.1.3 创建字符串

Space函数

该函数返回指定数的空格的字符串。语法为: Space(number)

其中,参数number必须,为字符串中指定的空格数。 如下例所示:

Sub CreateString1() Dim MyString

' 返回 10 个空格的字符串。 MyString = Space(10)

' 将 10 个空格插入两个字符串中间。

MyString = \"Hello\" & Space(10) & \"World\" End Sub

该函数可用于在调用外部DLL时建立字符串缓冲区,特别是在调用Window API时。此外,使用该函数还可以使字符串在特定长度的缓冲区左对齐或右对齐。

注意,如果参数number是负数,则会产生运行时错误5:“无效的过程调用或参数”。 [编程方法和技巧] 可以使用Space函数添加和清除存储在定长字符串中的数据,例如,下面的代码用空格填充一个定长字符串: Dim strFixed As String * 32

strFixed = Space(Len(strFixed))

1.1.3.1 String函数

该函数返回重复的字符或字符串。其语法为: String(number,character)

其中,参数number必须,指定所返回的字符串的长度;参数character必须,指定字符的字符代码或字符串表达式。

例如,下面使用String函数生成指定长度且只含单一字符的字符串。 Sub CreateString2() Dim MyString

MyString = String(5, \"*\") ' 返回 \"*****\" MyString = String(5, 42) ' 返回 \"*****\"

MyString = String(10, \"ABC\") ' 返回 \"AAAAAAAAAA\" End Sub

如果参数number包含Null,则返回Null;如果参数character包含Null,则返回Null;参数character可以指定为字符串或者是ANSI字符代码,如:

strString1=String(128,”=”) ‘用”=”填充 strString2=String(128,0) ‘用Chr$(0)填充 [编程方法和技巧]

(1) String函数在用于创建较长的“_”,“-”,或者“=”构成的水平线以便给报表分段时十分有用。

(2) 当调用API函数向缓冲区写入字符串值时,首先要用String函数创建一个长度合适的字符串变量,并且用诸如Chr$(0)之类的单个字符来填充。

1.1.4 获取字符串的长度

可以使用Len函数来确定任何字符串或字符串表达式的长度,其语法为:

Len(string|varname)

其中,参数string为任何有效的字符串表达式;参数varname为任何有效的变量名称。两个参数必须取一。

利用LenB函数可以确定存储某变量所需的实际字节数。

下面的示例使用Len函数来获取某字符串的长度(字符数)或某变量的大小(位数)。 Type CustomerRecord ' 定义用户自定义的数据类型 ID As Integer ' 将此定义放在常规模块中 Name As String * 10 Address As String * 30 End Type

Sub GetStrLen()

Dim Customer As CustomerRecord ' 声明变量 Dim MyInt As Integer, MyCur As Currency Dim MyString, MyLen

MyString = \"Hello World\" ' 设置变量初值 MyLen = Len(MyInt) ' 返回 2 MyLen = Len(Customer) ' 返回 42 MyLen = Len(MyString) ' 返回 11 MyLen = Len(MyCur) ' 返回 8 End Sub

此外,在需要大量判断是否为空字符串的代码中,使用Len函数也可以加快代码执行的速度。例如:

If strTemp = \"\" Then '要执行的代码 End If

上面的代码可以用以下代码代替: If Len(strTemp) = 0 Then '要执行的代码 End If 注意:

(1) 参数string和参数varname互不相容,即只能指定这两个参数中的某一个,不能同时指定这两个参数。

(2) 如果参数string或参数varname中包含Null,则Len函数会返回Null。

(3) 在向文件写入某种用户自定义类型数据时,Len函数会返回数据的大小(字符数)。 (4) LenB函数返回用户自定义类型数据实际占用的内存大小。

(5) 在对字节数据或Unicode字符串使用LenB函数时,LenB函数返回表示数据或字符串的字节数。

(6) 不能对对象变量使用Len函数。

(7) 如果参数varname是一个数组,则必须指定一个有效的下标,即Len函数不能确定数组中元素的总数或数组占用内存的大小。

(8) Len函数对Variant类型变量的处理和字符串变量一样,Len函数返回变量所存储的实际字符数,如下面的代码: Dim vVar vVar=100

MsgBox Len(vVar) 结果为3。

(9) 由于VB本质上使用的是Unicode字符串(用两个字节的空间来存储一个字符),因此当相同的字符串变量传递给Len函数和LenB函数时会出现不同的返回值。例如,对于一个包含4个字符的字符串,使用Len函数时返回值为4,使用LenB函数则为8。

(10) 使用强类型变量(即强制声明该变量的类型)时,Len函数会返回存储该变量所需的字节数。例如,长整型变量的长度为4。

下面的示例说明了为什么要显式声明数据类型: Sub test()

Dim lVar As Long Dim vVar

lVar = 10000000 vVar = 10000000

MsgBox LenB(lVar) '返回4 MsgBox LenB(vVar)'返回16 End Sub

很显然,Variant类型变量比强制声明的类型变量要占用更多的内存。

1.1.5 格式化字符串

可以使用Format函数规定输出的字符串的格式,其语法为:

Format(expression[,format[,firstdayofweek[,firstweekofyear]]])

其中,参数expression必须,为任何有效的表达式;其余参数均可选。参数format表示所要采用的格式,参数firstdayofweek使用常数,表示一星期的第一天,参数firstweekofyear使用常数,表示一年的第一周。

在参数format中,使用字符“@”,表示空格或字符占位符,如果在输入的字符串相应位置有字符,则显示该字符,否则显示空格;使用字符“&”,表示空或字符占位符,如果

在输入的字符串的相应位置有字符,则显示该字符,否则不显示;使用字符“<”,则将所有字符显示为小写格式;使用字符“>”,则将所有字符显示为大写格式;使用字符“!”,强制占位符从左向右填满, 满足默认为从右向左。 例如下面的代码: Dim strOut

strOut = Format(\"8888888\返回( )888-8888 strOut = Format(\"8888888\返回()888-8888

在Format函数中,还可以同时格式化普通字符串和空字符串,只须在指定的格式中用分号隔开两个部分,第一部分用于非空字符串,第二部分用于空字符串。例如: strOut = Format(\"6666666\返回( )666-6666 strOut = Format(\"\返回No Phone 又如,下面的代码将字母全部转换为大写: Dim strOut

strOut = Format(\"Hello\‘返回HELLO 同理,可以使用“<”将字母全部转换为小写。 Format函数的简要使用规则:

(1) 允许用预先定义或用户定义的格式来建立多种用于输出字符串、数字和日期/时间数据的方法。

(2) 创建用户定义的数值格式最多可以有四个部分,每个部分代表一种不同类型的数值,且用分号分隔。第一部分在单独命名使用时可用于所有值,与其它多个部分一起使用时只用于正数;第二部分用于负数;第三部分用于零值;第四部分用于Null值。

在参数format中不必包括所有四部分,但所用部分的数目决定了每一个部分所定义的数值类型:只有一个部分,则应用于所有数值;有两个部分,则第一部分应用于正数和零值,第二部分应用于负数;有三个部分,则第一部分用于正数,第二部分应用于负数,第三部分应用于零值;有四个部分,则每部分的使用如前所述。

如果忽略了一个部分,则该部分使用与定义正数的部分一样的格式,例如: “#.00;;#,##”

表示负数值与正数值使用同一种格式显示。 如果参数含有命名格式,则只能有一个部分。

(3) 字符串值的用户定义格式有两个部分,第一部分可应用于所有值,第二部分只应用于Null值或零长字符串。

(4) 预定义的日期和时间格式如下: General Date

范例: Format(\"28/02/2007\返回: 2007-2-28 Long Date

范例: Format(\"28/02/2007\返回: 2007年2月28日 Medium Date

范例: Format(\"28/02/2007\返回: 07-02-28

Short Date

范例: Format(\"28/02/2007\返回: 2007-2-28 Long Time

范例: Format(\"17:30:03\返回: 17:30:03 Medium Time

范例: Format(\"17:30:03\返回: 下午 05:30 Short Time

范例: Format(\"17:30:03\返回: 17:30

(5) 预定义的数值格式如下: General Number

范例: Format(123456.0789,\"General Number\") 返回: 123456.0789 Currency

范例: Format(123456.0789,\"Currency\") 返回: ¥123,456.08 Fixed

范例: Format(0.2,\"Fixed\") 返回: 0.20 Standard

范例: Format(123456.0789,\"Standard\") 返回: 123,456.08 Percent

范例: Format(.7321,\"Percent\") 返回: 73.21% Scientific

范例: Format(123456.0789,\"Scientific\") 返回: 1.23E+05 Yes/No

范例1: Format(0,\"Yes/No\") 返回: No

范例2: Format(23,\"Yes/No\") 返回: Yes True/False

范例1: Format(0,\"True/False\") 返回: False

范例2: Format(23,\"True/False\") 返回: True

On/Off

范例1: Format(0,\"On/Off\") 返回: Off

范例2: Format(23,\"On/Off\") 返回: On

(6) 创建用户自定义的日期和时间格式的字符: C

元素:日期

显示:基于当前Windows系统的短日期和短时间国际设置格式的日期或时间。 范例:Format(\"28/02/2007 17:30:03\返回:2007-2-28 17:30:03 dddddd

元素:日期

显示:基于当前Windows系统的长日期国际设置格式的完整日期。 范例:Format(\"28/02/2007\返回:2007年2月28日 /

元素:日期分隔符

范例:Format(\"28/02/2007\返回:02-28-2007 d

元素:日

显示:1~31范围内的一个数字,无前导0。 范例:Format(\"02/02/2007\返回:2 dd

元素:日

显示:01~31范围内的一个数字,有前导0。 范例:Format(\"02/02/2007\返回:02 ddd

元素:日

显示:英文简写(Sun~Sat)

范例:Format(\"02/02/2007\返回:Fri dddd 元素:日

显示:英文全称(Sunday~Saturday) 范例:Format(\"02/02/2007\返回:Friday ddddd

元素:日期

显示:基于计算机Windows国际设置短日期格式的日期。 范例:Format(\"02/02/2007\返回:2007-2-2 h

元素:小时

显示:0~23范围内的一个数字,无前导0。 范例:Format(\"05:08:06\返回:5 hh

元素:小时

显示:00~23范围内的一个数字,有前导0。 范例:Format(\"05:08:06\返回:05 n

元素:分

显示:0~59范围内的一个数字,无前导0。 范例:Format(\"05:08:06\返回:8 nn

元素:分

显示:00~59范围内的一个数字,有前导0。 范例:Format(\"05:08:06\返回:08 s

元素:秒

显示:0~59范围内的一个数字,无前导0。 范例:Format(\"05:08:06\返回:6 ss

元素:秒

显示:00~59范围内的一个数字,有前导0。 范例:Format(\"05:08:06\返回:06 ttttt

元素:时间

显示:基于12小时制的时间,包含Windows区域设置中指定的时间分隔符和前导0。 范例:Format(\"05:08:06\返回:5:08:06 AM/PM

元素:时间

显示:用大写的AM和PM表示的12小时制的时钟格式。 范例:Format(\"17:08:06\返回:05:08:06 PM am/pm

元素:时间

显示:用小写的am和pm表示的12小时制时钟格式。 范例:Format(\"17:08:06\返回:05:08:06 pm A/P

元素:时间

显示:12小时制时钟格式,用大写“A”表示AM,大写“P”表示PM。 范例:Format(\"17:08:06\返回:05:08:06 P a/p

元素:时间

显示:12小时制时钟格式,用小写“a”表示am,小写“p”表示pm。 范例:Format(\"17:08:06\返回:05:08:06 p :

元素:时间分隔符 显示:时间格式

范例:Format(\"17:08:06\返回:17:08:06 w

元素:星期几

显示:1~7范围内的一个数字(1~7分别表示星期天到星期六)。 范例:Format(\"02/02/2007\返回:6 ww

元素:周

显示:1~54范围内的一个数字。 范例:Format(\"02/02/2007\返回:5 m

元素:月

显示:1~12范围内的一个数字,无前导0。 范例:Format(\"02/02/2007\返回:2 mm

元素:月

显示:01~12范围内的一个数字,有前导0。

范例:Format(\"02/02/2007\返回:02 mmm

元素:月

显示:英文月份简写(Jan~Dec) 范例:Format(\"02/02/2007\返回:Feb mmmm 元素:月

显示:英文月份全称(January~December) 范例:Format(\"02/02/2007\返回:February q

元素:季度

显示:1~4范围内的一个数字 范例:Format(\"02/02/2007\返回:1 y

元素:一年中的某天

显示:1~366范围内的一个数字。 范例:Format(\"02/02/2007\返回:33 yy

元素:年

显示:00~99范围内的一个两位数字。 范例:Format(\"02/02/2007\返回:07 yyyy 元素:年

显示:100~9999范围内的一个四位数字。 范例:Format(\"02/02/2007\返回:2007

(7)用于创建用户自定义数字格式的字符 0

说明:数字占位符。如果参数expression所代表的数值在相应的0位置上有一个数字,则显示这个数字,否则显示0。所指定的小数点后的位数,使数值舍入为给定的小数位数,但不影响小数点左边的数字位数。

范例1:Format(23.675,\"00.0000\") 返回:23.6750 范例2:Format(23.675,\"00.00\") 返回:23.68 范例3:Format(2345,\"00000\") 返回:02345 范例4:Format(2345,\"00.00\") 返回:2345.00

#

说明:数字占位符。如果参数expression所代表的数值在相应的#位置上有一个数字,则显示这个数字,否则什么也不显示。

范例1:Format(23.675,\"##.##\") 返回:23.68 范例2:Format(23.675,\"##.####\") 返回:23.675

范例3:Format(12345.25,\"#,###.##\") 返回:12,345.25 .

说明:小数点占位符。小数点占位符实际显示的字符由本机Windows系统国际设置格式决定。 %

说明:百分数占位符。首先将参数expression所代表的数值乘以100,然后把它作为百分数显示。

范例:Format(0.25,\"##.00%\") 返回:25.00% ,

说明:千位分隔符。实际显示的字符由本机Windows系统国际设置格式决定。在格式定义中只需要给出一个千位分隔符。

范例:Format(1000000,\"#,###\") 返回:1,000,000 E-E+ e-e+

说明:科学计数法格式。如果格式表达式在E-、E+或e-、e+的右边至少有一个数字占位符(0或#),数字就以科学计数法格式显示数字,参数Format中所用的字母E或e在该数字和它的指数之间显示。右边的数字占位符数目决定了要在指数中显示的位数。使用E-或e-可以在负指数前插入一个减号,使用E+或e+可以在正指数前插入一个正号。 范例:Format(1.09837555,\"######E-###\") 返回:109838E-5 -+$

说明:显示一个直接量字符。

范例:Format(2345.25,\"$#,###.##\") 返回:$2,345.25 \\

说明:反斜杠后的字符以直接量字符显示。可以用反斜杠将某个特定格式的字符以直接量字符显示。

范例:Format(0.25,\"##.##\\%\") 返回:.25% (8) 用于创建用户自定义字符串格式的字符 @

说明:字符占位符。如果expression在相应的@位置上有一个字符,就显示这个字符,否则显示一个空格。

范例:Format(\"VBA\返回:* * VBA &

说明:字符占位符。如果expression在相应的&位置上有一个字符,就显示这个字符,否则什么也不显示。

范例:Format(\"VBA\返回:**VBA <

说明:用小写形式显示所有字符。

范例:Format(\"VBA\返回:vba >

说明:用大写形式显示所有字符。 范例:Format(\"vba\返回:VBA !

说明:从左向右处理占位符(缺省情况为从右向左处理占位符)。 [编程方法和技巧]

(1) 使用没有格式定义的Format函数格式化数字比使用Str函数格式化数字更好。

Format函数与Str函数不同,它会把正数中一般保留用于表示符号的前导空格清除掉。 (2) 可以使用Format函数以1000为单位对数字进行标度,做法是在语句中小数点的左边用一个千位分隔符(,)表示标度数字的一个千位;可以使用多个千位分隔符。例如: Format(1000000,\"##0,.\") 返回:1000. Format(1000000,\"##0,,.\") 返回:1.

1.1.6 查找字符串

1.1.6.1 InStr函数

可使用InStr函数返回一字符串在另一字符串中的位置,因此,也可以使用该函数确定一

个字符串中是否包含有另一个字符串。其语法为: InStr([Start,]string1,string2[,compare])

其中,参数Start为可选参数,设置查找的起点,如果省略,则从第一个字符的位置开始查找,当指定了参数Compare时,则要指定此参数。参数string1为被查找的字符串,参数string2为要查找的字符串,这两个参数都是必需的。

如果在String1中没有找到String2,返回0;如果找到String2,则返回String2第一个出现的首字符位置(即1到String1的长度);如果String2的长度为零,返回Start。 可看看下面的示例: Sub test()

Dim SearchString, SearchChar, MyPos

SearchString = \"XXpXXpXXPXXP\" '被搜索的字符串 SearchChar = \"P\" '要查找字符串 \"P\"

'从第四个字符开始,以文本比较的方式找起,返回值为 6(小写 p) '小写 p 和大写 P 在文本比较下是一样的

MyPos = InStr(4, SearchString, SearchChar, 1) Debug.Print MyPos

'从第一个字符开使,以二进制比较的方式找起,返回值为 9(大写 P) '小写 p 和大写 P 在二进制比较下是不一样的 MyPos = InStr(1, SearchString, SearchChar, 0) Debug.Print MyPos

'缺省的比对方式为二进制比较(最后一个参数可省略) MyPos = InStr(SearchString, SearchChar) '返回 9 Debug.Print MyPos

MyPos = InStr(1, SearchString, \"W\") '返回 0 Debug.Print MyPos End Sub

1.1.6.2 InStrRev函数

也可以使用InStrRev函数返回一个字符串在另一个字符串中出现的位置,与InStr函数不同的是,从字符串的末尾算起。其语法为:

InStrRev(String1,String2[,[Start[,compare])

参数String1为被查找的字符串,参数String2为要查找的字符串,这两个参数都是必需的。参数Start为可选参数,设置每次查找开始的位置,若忽略则使用-1,表示从上一个字符位置开始查找。参数Compare为可选参数,表示所使用的比较方法,如果忽略则执行二进制比较。

下面的示例使用了InStr函数和InStrRev函数,相应的结果不同: Sub test()

Dim myString As String Dim sSearch As String

myString = \"I like the functionality that InsStrRev gives\" sSearch = \"th\"

Debug.Print InStr(myString, sSearch) '返回8 Debug.Print InStrRev(myString, sSearch) '返回26 End Sub

- - - - - - - - - - - - - - - - - - - - - - -

1.1.7 提取字符/字符串

1.1.7.1 Left函数

Left函数可以从字符串的左边开始提取字符或指定长度的字符串,即返回包含字符串中

从左边算起指定数量的字符。其语法为: Left(String,CharNum)

其中,如果参数String包含Null,则返回Null;如果参数CharNum的值大于或等于String的字符数,则返回整个字符串。

例如,下面的代码返回指定字符串的前两个字符: strLeft=Left(“This is a pig.”,2)

Left函数与InStr函数结合,返回指定字符串的第一个词,例如下面的代码: str = \"This is a pig.\"

FirstWord = Left(str, InStr(str, \" \") - 1)

1.1.7.2 Right函数

与Left函数不同的是,Right函数从字符串的右边开始提取字符或指定长度的字符串,即返回包含字符串中从右边起指定数量的字符。其语法为:

Right(String,CharNum) 例如:

AnyString = \"Hello World\" ' 定义字符串 MyStr = Right(AnyString, 1) ' 返回 \"d\"

MyStr = Right(AnyString, 6) ' 返回 \" World\"

MyStr = Right(AnyString, 20) ' 返回 \"Hello World\"

如果存放文件名的字符串中没有反斜杠(\\),下面的代码将反斜杠(\\)添加到该字符串中: If Right(strFileName,1) <> “” Then strFileName=strFileName & “\\” End If

下面的函数假设传递给它的参数或者是文件名,或者是包含完整路径的文件名,从字符串的末尾开始返回文件名。

Private Function ParseFileName(strFullPath As String) Dim lngPos As Long, lngStart As Long Dim strFilename As String lngStart = 1 Do

lngPos = InStr(lngStart, strFullPath, \"\\\") If lngPos = 0 Then

strFilename = Right(strFullPath, Len(strFullPath) - lngStart + 1) Else

lngStart = lngPos + 1 End If

Loop While lngPos > 0

ParseFileName = strFilename End Function

1.1.7.3 Mid函数

Mid函数可以从字符串中提取任何指定的子字符串,返回包含字符串中指定数量的字符的字符串。其语法为:

Mid(String,Start[,Len])

其中,如果参数String包含Null,则返回Null;如果参数Start超过了String的字符数,则返回零长度字符串(“”);如果参数Len省略或超过了文本的字符数,则返回字符串从Start到最后的所有字符。 例如,下面的代码:

Str=Mid(“This is a pig.”,6,2) 将返回文本“is”。 下面的代码:

MyString = \"Mid Function Demo\" '建立一个字符串 FirstWord = Mid(MyString, 1, 3) '返回 \"Mid\" LastWord = Mid(MyString, 14, 4) '返回 \"Demo\"

MidWords = Mid(MyString, 5) '返回 \"Funcion Demo\"

Mid函数常用于在字符串中循环,例如,下面的代码将逐个输出字符: Dim str As String Dim i As Integer

Str=”Print Out each Character” For i=1 to Len(str)

Debug.Print Mid(str,i,1) Next i

1.1.7.4 Mid语句

Mid语句可以用另一个字符串中的字符替换某字符串中指定数量的字符。其语法为: Mid(Stringvar,Start[,Len])=string

其中,参数Stringvar代表为要被更改的字符串;参数Start表示被替换的字符开头位置;参数Len表示被替换的字符数,若省略则全部使用string;参数string表示进行替换的字符串。

被替换的字符数量总小于或等于Stringvar的字符数;如果string的数量大于Len所指定的数量,则只取string的部分字符。示例如下: MyString = \"The dog jumps\" ' 设置字符串初值

Mid(MyString, 5, 3) = \"fox\" ' MyString = \"The fox jumps\" Mid(MyString, 5) = \"cow\" ' MyString = \"The cow jumps\"

Mid(MyString, 5) = \"cow jumped over\" ' MyString = \"The cow jumpe\" Mid(MyString, 5, 3) = \"duck\" ' MyString = \"The duc jumpe\" - - - - - - - - - - - - - - - - - - - - - - -

1.1.7.5 删除空格

LTrim函数删除字符串前面的空格; RTrim函数删除字符串后面的空格; Trim函数删除两头的空格。 示例如下:

MyString = \" <-Trim-> \" ' 设置字符串初值

TrimString = LTrim(MyString) ' TrimString = \"<-Trim-> \" TrimString = RTrim(MyString) ' TrimString = \" <-Trim->\"

TrimString = LTrim(RTrim(MyString)) ' TrimString = \"<-Trim->\" ' 只使用 Trim 函数也同样将两头空格去除

TrimString = Trim(MyString) ' TrimString = \"<-Trim->\" - - - - - - - - - - - - - - - - - - - - - - -

1.1.7.6 返回字符代码

Asc函数返回指定字符串表达式中第一个字符的字符代码。示例如下: MyNumber = Asc(\"A\") ' 返回 65 MyNumber = Asc(\"a\") ' 返回 97

MyNumber = Asc(\"Apple\") ' 返回 65 [编程方法和技巧]

(1) 在数据验证中用Asc来决定一些条件,如第一个字符是大写还是小写、是字母还是数字。

Private Sub CommandButton1_Click() Dim sTest As String Dim iChar As Integer sTest = TextBox1.Text If Len(sTest) > 0 Then iChar = Asc(sTest)

If iChar >= 65 And iChar <= 90 Then MsgBox \"第一个字符是大写\"

ElseIf iChar >= 97 And iChar <= 122 Then MsgBox \"第一个字符是小写\" Else

MsgBox \"第一个字符不是字母\" End If Else

MsgBox \"请在文本框中输入\" End If End Sub

(2) 用Asc函数和Chr函数来创建基本加密的方法。 Private Sub CommandButton2_Click()

Dim MyName As String, MyEncryptedString As String Dim MyDecryptedString As String Dim i As Integer MyName = \"fanjy\"

For i = 1 To Len(MyName)

MyEncryptedString = MyEncryptedString & Chr(Asc(Mid(MyName, i, 1)) + 25) Next i

MsgBox \"您好!我的名字是\" & MyEncryptedString For i = 1 To Len(MyName)

MyDecryptedString = MyDecryptedString & Chr(Asc(Mid(MyEncryptedString, i, 1)) - 25) Next i

MsgBox \"您好!我的名字是\" & MyDecryptedString End Sub

- - - - - - - - - - - - - - - - - - - - - - -

1.1.7.7 返回数值代表的相应字符

Chr函数返回指定字符码所代表的字符,其语法为:

Chr(charcode)

其中参数charcode代表字符码,一般为0~255。例如: MyChar = Chr(65) ' 返回 A MyChar = Chr(97) ' 返回 a MyChar = Chr(62) ' 返回 > MyChar = Chr(37) ' 返回 % [编程方法和技巧]

(1) 使用Chr(34)将引号嵌入字符串,如 Chr(34) & sString & Chr(34)

(2) 下面列出了在调用Chr函数时比较常用的字符代码: 代码 值 描述

0 Null 相当于vbNullChar常数 8 BS 相当于vbBack常数 9 TAB 相当于vbTab常数

10 CR 相当于vbCr和vbCrLf常数 13 LF 相当于vbLf和vbCrLf常数 34 “” 引号

- - - - - - - - - - - - - - - - - - - - - - -

1.1.7.8 使用字节的函数

VBA中返回字符串的函数有两种格式,一种以$结尾,返回字符串,不需要进行类型转换,所以速度较快,但如果输入值是包含Null的Viarant,则会发生运行错误;一种没有$,返回Viarant数据类型,如果输入值是包含Null的Viarant,则返回Null。因而,如果要使得程序运行速度快,则使用带有$的函数且要避免向这些函数传递空值。 - - - - - - - - - - - - - - - - - - - - - - -

1.1.7.9 返回数组的函数

Filter函数

Filter函数返回一个下标从零开始的数组,该数组包含基于指定筛选条件的一个字符串数组的子集。其语法为:

Filter(sourcearray,match[,include[,compare]])

其中,参数sourcearray必需,是要执行搜索的一维字符串数组;参数match必需,是要搜索的字符串;参数include可选,Boolean值,表示返回子串包含还是不包含match字符串,如果include为True,返回包含match子字符串的数组子集,如果include为False,返回不包含match子字符串的数组子集;参数compare可选,表示所使用的字符串比较类型,其设置值为:-1(常数为vbUseCompareOption)表示使用Option Compare语句的设置值来执行比较;0(常数为vbBinaryCompare)表示执行二进制比较;1(常数为vbTextCompare)表示执行文字比较;2(常数为vbDatabaseCompare)只用于Microsoft Access,表示基于数据库信息来执行比较。

如果在sourcearray中没有发现与match相匹配的值,Filter函数返回一个空数组;如果sourcearray是Null或不是一个一维数组,则产生错误。 Filter函数所返回的数组,其元素数是所找到的匹配项目数。 [编程方法和技巧]

(1) Filter函数也可以过滤数字值。此时,应指定Variant类型的字符串sourcearray,并用数字值给数组赋值。同时,也可以将字符串、Variant、Long或Integer数据传递给match。但应注意,返回的字符串表现为被过滤数字的字符串的形式。例如: Sub test()

Dim varSource As Variant, varResult As Variant Dim strMatch As String, i strMatch = CStr(2)

varSource = Array(10, 20, 30, 21, 22, 32)

varResult = Filter(varSource, strMatch, True, vbBinaryCompare) For Each i In varResult Debug.Print i Next End Sub

将返回20,21,22,32

(2) Filter函数可以和Dictionary对象很好地配合使用。可以把Dictionary对象产生的Key值作为一种过滤Dictionary对象成员的快速方法传递给Filter函数,如: Sub test()

Dim i As Integer

Dim sKeys() As Variant Dim sFiltered() As String Dim sMatch As String Dim blnSwitch As Boolean Dim oDict As Dictionary Set oDict = New Dictionary

oDict.Add \"Microsoft\ oDict.Add \"AnyMicro Inc\ oDict.Add \"Landbor Data\

oDict.Add \"Micron Co.\ sKeys = oDict.Keys sMatch = \"micro\" blnSwitch = True

'寻找包含字符串macro(不区分大小写)的所有键

sFiltered() = Filter(sKeys, sMatch, blnSwitch, vbTextCompare) For i = 1 To UBound(sFiltered)

Debug.Print sFiltered(i) & \ Next i End Sub

1.1.7.10 Split函数

Split函数返回一个下标从零开始的一维数组,包含指定数目的子字符串。其语法为: Split(expression[,delimiter[,limit[,compare]]])

其中,参数expression必需,表示包含子字符串和分隔符的字符串,若expression是一个长度为零的字符串(“”),该函数则返回一个没有元素和数据的空数组;参数

delimiter用于标识子字符串边界的字符串字符,若忽略则使用空格(“ “)作为分隔符,若是一个长度为零的字符串则返回仅包含一个元素的数组,该元素是expression所表示的字符串;参数limit表示要返回的子字符串数,-1表示返回所有的子字符串;参数compare表示判别子字符串时使用的比较方式,其值与Filter函数的设置值相同。 - - - - - - - - - - - - - - - - - - - - - - -

1.1.7.11 连接字符串

Join函数返回连接某数组中的多个子字符串而组成的字符串,即将数组中的字符串连接起来。其语法为:

Join(sourcearray[,delimiter])

其中,参数sourcearray必需,是包含被连接子字符串的一维数组;参数delimiter可选,代表在所返回的字符串中用于分隔子字符串的字符,若忽略则使用空(“ ”)来分隔,若为零长字符串(“”),则所有项目都连接在一起,中间没有分隔符。 - - - - - - - - - - - - - - - - - - - - - - -

1.1.7.12 替换字符串

Replace函数返回一个被替换了的字符串,该字符串中指定的子字符串已被替换成另一个子字符串,并且替换指定次数。其语法为:

Replace(expression,find,replace[,start[,count[,compare]]])

其中,参数expression必需,表示所要替换的子字符串;参数find必需,表示要搜索到的子字符串;参数replace必需,表示用来替换的子字符串;参数start表示开始搜索的位置,若忽略,则从1开始;参数count表示进行替换的次数,缺省值是-1,表示进行所有可能的替换;参数compare表示判别子字符串时所用的比较方式,与Filter函数的设置值相同。

如果expression的长度为零,Replace返回零长度字符串(“”);如果expression为Null,则返回错误;如果find的长度为零,则返回expression的副本;如果replace的长度为零,则返回删除了所有出现find的字符串的副本;如果start的值大于

expression的长度,则返回长度为零的字符串;如果count为0,则返回expression的副本。

Replace函数返回的字符串是从参数start所指定的位置开始到expression结尾已经进行过替换的字符串。 注意:

(1) 如果没有使用参数count,那么当替换较短字符串时就要注意,防止形成一个不相关的字符。

(2) 如果start值大于1,返回的字符串将从start开始,而不是从原有字符串的第一个字符开始。

- - - - - - - - - - - - - - - - - - - - - - -

1.1.7.13 反向字符串

StrReverse函数返回与指定字符串顺序相反的字符串,其语法为: StrReverse(expression)

其中,参数expression是一个字符串,应用StrReverse函数后将返回与该字符串顺序相反的字符串。如果expression是一个长度为零的字符串(“”),则返回一个长度为零的字符串;如果expression为Null,则产生一个错误。

使用字符串函数

不同的类中都定义有字符串函数。这些类包括 Microsoft.VisualBasic.Strings 类和 System.String 类。

使用 Microsoft.VisualBasic.Strings 类中的字符串函数 下列函数是 Microsoft.VisualBasic.Strings 类中定义的字符串函数。

注意:要使用字符串函数,请通过在源代码开始处添加以下代码将命名空间 Microsoft.VisualBasic.Strings 导入到项目中: Imports Microsoft.VisualBasic.Strings Asc 和 AscW

Asc 函数和 AscW 函数返回一个整数值,表示与指定的字符相对应的字符代码。这两个函数接受任何有效的字符表达式或字符串表达式作为参数。当字符串是输入参数时,则仅输入字符串的第一个字符。当字符串不包含任何字符时,将出现 ArgumentException 错误。Asc 返回输入字符的代码数据点或字符代码。对于单字节字符集 (SBCS) 值,返回值可以是 0 到 255 之间的数字。对于双字节字符集 (DBCS) 值,返回值可以是 -32768 到 32767 之间的数字。AscW 为输入字符返回 0 到 65535 之间的 Unicode 代码数据点。

示例:

Dim MyInt As Integer

MyInt = Asc(\"A\") ' MyInt is set to 65. MyInt = Asc(\"a\") ' MyInt is set to 97. MyInt = Asc(\"Apple\") ' MyInt is set to 65. Chr 和 ChrW

Chr 函数和 ChrW 函数返回与指定的字符代码相关联的字符。当 CharCode 超出 -32768 到 65535 的范围时,将出现 ArgumentException 错误。

示例:

本示例使用 Chr 函数返回与指定的字符代码相关联的字符。 Dim MyChar As Char

MyChar = Chr(65) ' Returns \"A\". MyChar = Chr(97) ' Returns \"a\". MyChar = Chr(62) ' Returns \">\". MyChar = Chr(37) ' Returns \"%\". GetChar

GetChar 函数返回一个 Char 值,表示指定字符串的指定索引中的字符。当索引小于 1 或大于指定输入参数中最后一个字符的索引时,将出现 ArgumentException 错误。

示例:

本示例显示了如何使用 GetChar 函数从字符串的指定索引中返回字符。 Dim myString As String = \"ABCDE\" Dim myChar As Char

myChar = GetChar(myString, 4) ' myChar = \"D\" InStr

InStr 函数返回一个整数,指定一个字符串在另一个字符串中首次出现的起始位置。

示例:

以下示例使用 InStr 函数返回一个字符串在另一个字符串中首次出现的位置: Dim SearchString, SearchChar As String Dim MyPos As Integer

SearchString =\"XXpXXpXXPXXP\" ' String to search in. SearchChar = \"P\" ' Search for \"P\".

' A textual comparison starting at position 4. Returns 6.

MyPos = InStr(4, SearchString, SearchChar, CompareMethod.Text) Join

Join 函数返回一个字符串,该字符串是通过连接数组中包含的子字符串创建的。包含必须连接的子字符串的一维数组将作为参数传递给 Join 函数。该函数使用 Delimiter、String 作为可选参数来分隔返回的字符串中的子字符串。当省略 Delimiter 时,将使用空格(“ ”)作为子字符串之间的分隔符。当 Delimiter 是零长度字符串 (\"\") 时,数组中的子字符串将不使用分隔符,而是直接相连。

示例:

以下示例显示了如何使用 Join 函数: Dim myItem(2) As String

Dim myShoppingList As String myItem(0) = \"Pickle\" myItem(1) = \"Pineapple\" myItem(2) = \"Papaya\"

' Returns \"Pickle, Pineapple, Papaya\" myShoppingList = Join(myItem, \LCase

LCase 函数返回已经转换为小写的字符串或字符。只有大写字母被转换为小写。所有小写字母和非字母字符均保持不变。

示例:

以下示例使用 LCase 函数返回字符串的小写形式: Dim UpperCase, LowerCase As String

Uppercase = \"Hello WORLD 1234\" ' String to convert.

Lowercase = LCase(UpperCase) ' Returns \"hello world 1234\". LTrim、RTrim 和 Trim

这些函数会返回一个包含指定字符串的副本的字符串。在使用 LTrim 时,没有起始空格。在使用 RTrim 时,没有尾随空格。在使用 Trim 时,既没有起始空格也没有尾随空格。

示例:

以下示例使用 LTrim 函数删除字符串变量中的起始空格,使用 RTrim 函数删除字符串变量中的尾随空格,以及使用 Trim 函数删除字符串变量中的起始空格和尾随空格: Dim MyString, TrimString As String

MyString = \" <-Trim-> \" ' Initializes string.

TrimString = LTrim(MyString) ' TrimString = \"<-Trim-> \". TrimString = RTrim(MyString) ' TrimString = \" <-Trim->\".

TrimString = LTrim(RTrim(MyString)) ' TrimString = \"<-Trim->\". ' Using the Trim function alone achieves the same result. TrimString = Trim(MyString) ' TrimString = \"<-Trim->\". Replace

Replace 函数返回一个字符串,其中指定的子字符串按指定的次数替换为另一个子字符串。Replace 函数的返回值是一个字符串,该字符串在 Start 参数指定的位置开始,然后在指定字符串的末尾以 Find 参数和 Replace 参数中的值所指定的替换内容结束。

示例:

本示例演示了 Replace 函数:

Dim myString As String = \"Shopping List\" Dim aString As String

' Returns \"Shipping List\".

aString = Replace(myString, \"o\StrComp

StrComp 函数返回 –1、0 或 1。这将基于字符串比较的结果。字符串将从第一个字符开始按字母数字顺序排列的值进行比较。

示例:

以下示例使用 StrComp 函数返回字符串比较的结果。如果省略第三个参数,则使用选项比较语句或项目默认设置中定义的比较类型。 Dim MyStr1, MyStr2 As String Dim MyComp As Integer MyStr1 = \"ABCD\"

MyStr2 = \"abcd\" ' Defines variables. ' The two strings sort equally. Returns 0.

MyComp = StrComp(MyStr1, MyStr2, CompareMethod.Text) ' MyStr1 sorts after MyStr2. Returns -1.

MyComp = StrComp(MyStr1, MyStr2, CompareMethod.Binary) ' MyStr2 sorts before MyStr1. Returns 1. MyComp = StrComp(MyStr2, MyStr1) StrConv

StrConv 函数返回一个字符串,该字符串转换为输入参数中指定的值。StrConv 函数将转换字符串。这种转换基于 Conversion 参数中的值。Conversion 参数中的值是 VbStrConv 枚举的成员。

Conversion 参数的设置为: 枚举成员 说明

VbStrConv.None 不执行转换

VbStrConv.LinguisticCasing - 使用语言规则而不是文件系统(默认值)来区分大小写 - 仅对大写和小写字母有效

VbStrConv.UpperCase 将字符串转换为大写字符 VbStrConv.LowerCase 将字符串转换为小写字符

VbStrConv.ProperCase 将字符串中每个单词的第一个字母转换为大写

1.1.8 示例:

以下示例将文本转换为小写字母: Dim sText, sNewText As String sText = \"Hello World\"

sNewText = StrConv(sText, VbStrConv.LowerCase)

Debug.WriteLine (sNewText) ' Outputs \"hello world\". StrDup

StrDup 函数返回一个由指定的字符重复指定的次数而形成的字符串或对象。StrDup 函数具有两个参数:Number 参数和 Character 参数。Number 参数指定函数必须返回的字符串的长度。StrDup 函数仅使用 Character 参数中的第一个字符。Character 参数可以是 Char 数据类型、String 数据类型或 Object 数据类型。

示例:

以下示例使用 StrDup 函数返回由重复字符组成的字符串: Dim aString As String = \"Wow! What a string!\" Dim aObject As New Object() Dim myString As String

aObject = \"This is a String that is contained in an Object\" myString = StrDup(5, \"P\") ' Returns \"PPPPP\"

myString = StrDup(10, aString) ' Returns \"WWWWWWWWWW\" myString = StrDup(6, aObject) ' Returns \"TTTTTT\" StrReverse

StrReverse 函数返回一个字符串,该字符串将指定字符串的字符顺序颠倒过来。

示例:

Dim myString As String = \"ABCDEFG\" Dim revString As String ' Returns \"GFEDCBA\".

revString = StrReverse(myString) UCase

UCase 函数返回一个字符串或字符,包含已转换为大写的指定字符串。只有小写字母被转换为大写字母。所有大写字母和非字母字符均保持不变。

示例:

以下示例使用 UCase 函数返回字符串的大写形式: Dim LowerCase, UpperCase As String

LowerCase = \"Hello World 1234\" ' String to convert.

UpperCase = UCase(LowerCase) ' Returns \"HELLO WORLD 1234\".

使用 System.String 类中的字符串函数

以下是 System 命名空间的 String 类中的字符串函数。

注意:要使用字符串函数,请通过在源代码开始处添加以下代码将 System.String 命名空间导入到项目中: Imports System.String Compare

Compare 函数比较输入参数中的两个字符串。通过使用单词排序规则来执行比较。发现不相等情况或比较完两个字符串后,比较将终止。

Compare 示例:

' Code is not compiled unless it is put in a Sub or in a Function. Dim s1, s2 As String s1 = \"testexample\" s2 = \"testex\"

MsgBox(Compare(s2, s1)) 'Returns -1.

MsgBox(Compare(s1, s2)) 'Returns 1.Concat

Concat 函数将一个或多个字符串相连接,然后返回连接后的字符串。

Concat 示例:

以下示例显示了如何使用 Concat 的重载版本:

' Code is not compiled unless it is put in a Sub or in a Function. Dim s1, s2, sa(3) As String sa(0) = \"A\" sa(1) = \"B\" sa(2) = \"C\" s1 = \"test\"

s2 = \"example\"

s1 = Concat(s1, s2) 'Returns testexample. MsgBox(s1)

MsgBox(Concat(sa)) 'Returns ABC.Copy

Copy 函数将指定字符串中的值复制到另一个字符串中。

Copy 示例:

' Code is not compiled unless it is put in a Sub or in a Function. Dim s1, s2 As String s1 = \"Hello World\"

'Copy the string s1 to s2. s2 = Copy(s1)

MsgBox(s2) 'Displays Hello World.Remove

Remove 函数从指定字符串的指定位置开始删除指定数目的字符。Remove 函数有两个参数。分别是 StartIndex 参数和 Count 参数。Startindex 参数指定开始删除字符的字符串位置。Count 参数指定要删除的字符数。

Remove 示例:

' Code is not compiled unless it is put in a Sub or in a Function. Dim s1, s2 As String s1 = \"Hello World\"

'Removes 3 characters starting from character e. s2 = s1.Remove(1, 3)

MsgBox(s2) 'Displays Hello World. Substring

Substring 函数从指定字符串的指定位置开始检索字符串。

Substring 示例:

以下示例将从指定的字符位置开始并按指定的长度来检索子字符串: ' Code is not compiled unless it is put in a Sub or in a Function. Dim s1, s2 As String s1 = \"Hello World\"

s2 = s1.Substring(6, 5) 'Returns World. MsgBox(s2)ToCharArray

ToCharArray 函数将字符串中的字符复制到 Unicode 字符数组中。

ToCharArray 示例:

以下示例将指定位置中的字符复制到 Character 数组中:

' Code is not compiled unless it is put in a Sub or in a Function. Dim s1 As String Dim ch(10) As Char s1 = \"Hello World\"

'Copies the characters starting from W to d to a Character array. ch = s1.ToCharArray(6, 5)

MsgBox(ch(3)) 'Displays l.ToLower

ToLower 函数采用一个字符串作为参数,然后以小写形式返回该字符串的副本。

ToLower 示例:

' Code is not compiled unless it is put in a Sub or in a Function. Dim s1, s2 As String s1 = \"Hello World\"

s2 = s1.ToLower() 'Converts any uppercase characters to lowercase. MsgBox(s2) 'Displays hello world.ToUpper

ToUpper 函数采用一个字符串作为参数,然后以大写形式返回该字符串的副本。

ToUpper 示例:

' Code is not compiled unless it is put in a Sub or in a Function. Dim s1, s2 As String s1 = \"Hello World\"

s2 = s1.ToUpper() 'Converts any lowercase characters to uppercase. MsgBox(s2) 'Displays HELLO WORLD.Trim、TrimStart 和 TrimEnd

这些函数会返回一个包含指定字符串的副本的字符串。使用 Trim 函数时,既没有起始空格也没有尾随空格。使用 TrimStart 函数时,没有起始空格。使用 TrimEnd 函数时,没有尾随空格。

示例:

以下示例使用 TrimStart 函数删除字符串变量开始处的空格,使用 TrimEnd 函数删除字符串变量末尾的空格,以及使用 Trim 函数删除字符串变量中的起始空格和尾随空格: ' Code is not compiled unless it is put in a Sub or in a Function. Dim s1, s2 As String s1 = \" Hello World \"

s2 = s1.Trim() 'Returns Hello World without any white spaces. s2 = s1.TrimStart 'Removes the spaces at the start. s2 = s1.TrimEnd 'Removes the white spaces at the end.

1.2 关闭屏幕刷新

application.ScreenUpdating=False

1.3 Msgbox 内换行

msgbox '1\" & vbcrlf & \"2\" & vbnewline & \"3\"

Vbcrlf和vbnewline是VB以及VBA中两个特殊的常量,Vbcrlf为换行,Vbnewline为起一空行

1.4 在VBA中设置一个变量的小数点位数

Round函数

返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。

示例:

b = Round(1.5555, 2)

保留2位小数,结果b=1.56 语法

Round(expression [,numdecimalplaces]) Round函数语法有如下几部分:

expression 必需的。要进行四舍五入运算的数值表达式。

numdecimalplaces 可选的。数字值,表示进行四舍五入运算时,小数点右边应保留的位数。如果忽略,则Round函数返回整数。

1.5 类型转换函数

每个函数都可以强制将一个表达式转换成某种特定数据类型。 语法

CBool(expression)

CByte(expression)

CCur(expression)

CDate(expression)

CDbl(expression)

CDec(expression)

CInt(expression)

CLng(expression)

CSng(expression)

CStr(expression)

CVar(expression)

CStr(expression)

必要的 expression 参数可以是任何字符串表达式或数值表达式。

返回类型

函数名称决定返回类型,如下所示:

函数 返回类型 expression 参数范围

CBool Boolean 任何有效的字符串或数值表达式。 CByte Byte 0 至 255。

CCur Currency -922,337,203,685,477.5808 至922,337,203,685,477.5807。 CDate Date 任何有效的日期表达式。

CDbl Double 负数从 -1.79769313486231E308 至 -4.94065645841247E-324;正数从 4.94065645841247E-324 至 1.79769313486232E308。 CDec Decimal 零变比数值,即无小数位数值,为

+/-79,228,162,514,264,337,593,543,950,335。对于 28 位小数的数值,范围则为 +/-7.9228162514264337593543950335;最小的可能非零值是 0.0000000000000000000000000001。

CInt Integer -32,768 至 32,767,小数部分四舍五入。

CLng Long -2,147,483,648 至 2,147,483,647,小数部分四舍五入。

CSng Single 负数为 -3.402823E38 至 -1.401298E-45;正数为 1.401298E-45 至 3.402823E38。

CStr String 依据 expression 参数返回 Cstr。

CVar Variant 若为数值,则范围与 Double 相同;若不为数值,则范围与 String 相同。 说明

如果传递给函数的 expression 超过转换目标数据类型的范围,将发生错误。

通常,在编码时可以使用数据类型转换函数,来体现某些操作的结果应该表示为特定的数据类型,而不是缺省的数据类型。例如,当单精度、双精度或整数运算发生的情况下,使用 CCur 来强制执行货币运算。

应该使用数据类型转换函数来代替 Val,以使国际版的数据转换可以从一种数据类型转换为另一种。例如,当使用 Ccur 时,不同的小数点分隔符、千分位分隔符和各种货币选项,依据系统的区域设置都会被妥善识别。

当小数部分恰好为 0.5 时,Cint 和 CLng 函数会将它转换为最接近的偶数值。例如,0.5 转换为 0、1.5 转换为 2。Cint 和 CLng 函数不同于 Fix 和 Int 函数,Fix 和 Int 函数会将小数部分截断而不是四舍五入。并且 Fix 和 Int 函数总是返回与传入的数据类型相同的值。

使用 IsDate 函数,可判断 date 是否可以被转换为日期或时间。Cdate 可用来识别日期文字和时间文字,以及落入可接受的日期范围内的数值。当转换一个数字成为日期时,是将整数部分转换为日期,小数部分转换为从午夜起算的时间。

CDate 依据系统上的区域设置来决定日期的格式。如果提供的格式为不可识别的日期设置,则不能正确判断年、月、日的顺序。另外,长日期格式,若包含有星期的字符串,也不能被识别。

CVDate 函数也提供对早期 Visual Basic 版本的兼容性。CVDate 函数的语法与 CDate 函数是完全相同的,不过,CVDate 是返回一个 Variant,它的子类型是 Date,而不是实际的 Date 类型。因为现在已有真正的 Date 类型,所以 CVDate 也不再需要了。转换一个表达式成为 Date,再赋值给一个 Variant,也可以达到同样的效果。也可以使用这种技巧将其他真正的数据类型转换为对等的 Variant 子类型。

注意 CDec 函数不能返回独立的数据类型,而总是返回一个 Variant,它的值已经被转换为 Decimal 子类型。

1.6 Select Case 语句

根据表达式的值,来决定执行几组语句中的其中之一。

1.6.1 语法

Select Case testexpression [Case expressionlist-n [statements-n]] ... [Case Else

[elsestatements]] End Select

Select Case 语句的语法具有以下几个部分:

部分 描述

必要参数。任何数值表达式或字符串表达式。

如果有 Case 出现,则为必要参数。其形式为 expression,expression To expression,Is comparisonoperator

expression的一个或多个组成的分界列表。To 关键字可用来指定一个数值范围。如果使用 To 关键字,则较小的数值要出现在 To 之前。使用 Is 关键字时,则可以配合比较运算符(除 Is 和 Like 之外)来指定一个数值范围。如果没有提供,则 Is 关键字会被自动插入。

可选参数。一条或多条语句,当 testexpression 匹配expressionlist-n中的任何部分时执行。

可选参数。一条或多条语句,当 testexpression 不匹配 Case 子句的任何部分时执行。

testexpression expressionlist-n

statements-n elsestatements

1.6.2 说明

如果 testexpression 匹配某个 Case expressionlist 表达式, 则在 Case 子句之后,直到下一个 Case 子句的 statements 会被执行;如果是最后一个子句,则会执行到 End Select。然后控制权会转移到 End Select 之后的语句。如果 testexpression 匹配一个以上的 Case 子句中的 expressionlist 表达式,则只有第一个匹配后面的语句会被执行。

Case Else 子句用于指明 elsestatements,当 testexpression 和所有的 Case 子句中的 expressionlist 都不匹配时,则会执行这些语句。虽然不是必要的,但是在 Select Case 区块中,最好还是加上 Case Else 语句来处理不可预见的 testexpression 值。如果没有 Case expressionlist 匹配 testexpression,而且也没有 Case Else 语句,则程序会从 End Select 之后的语句继续执行。

可以在每个 Case 子句中使用多重表达式或使用范围,例如,下面的语句是正确的: Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber

注意 Is 比较运算符和使用在 Select Case 语句中的 Is 关键字并不相同。

也可以针对字符串指定范围和多重表达式。在下面的例子中,Case 所匹配的字符串为:等于 everything、按英文字母顺序落入从 nuts 到 soup 之间的字符串、以及 TestItem 所代表的当前值。

Case \"everything\

1.6.3 Select Case 语句也可以是嵌套的

但每个嵌套的 Select Case 语句必须要有相应的 End Select 语句。

了避免难以弄清的复杂的嵌套的If语句,你可以使用Select Case语句代替。它的语法为:

Select Case 测试表达式 Case 表达式1

如果表达式1匹配测试表达式的语句 Case 表达式2

如果表达式2匹配测试表达式的语句 Case 表达式N

如果表达式N匹配测试表达式的语句 Case Else

如果没有表达式匹配测试表达式要执行的语句 End Select

你在关键字Select Case和End Select之间放置任意多个条件以测试。子句Case Else是可选的,当你希望可能有条件表达式返回假时使用它。在Select Case语句里,VB将每个表达式和测试表达式相比较。

这里是Select Case语句背后的逻辑。当VB遇到Select Case子句,它记下测试表达式的值。然后它前进到下面的第一个Case子句,如果这个表达式的值和测试表达式的值匹配的话,VB就会执行语句直到遇到另外一个Case子句并且跳到End Select语句。然而,如果第一个Case子句后面的表达式测试结果和测试表达式不匹配时,VB就会检查每一个Case子句,直到它找到一个匹配的为止。如果没有一个Case子句后面的表达式匹配测试表达式的值的话,VB就会跳到Case Else子句并执行该语句直到遇到关键字End Select。注意,Case Else子句是可选的,如果你的程序里面没有使用Case Else并且没有一个Case子句的表达式和测试表达式相匹配,VB就会跳到End Select后面的语句,并且继续执行你的程序。

我们来一个使用Select Case语句的程序例子。在第四章里,你学习了MsgBox函数允许你显示带有一个或多个按钮的信息,你也学习了MsgBox函数的结果可以赋予一个变量。使用Select Case语句,你现在可以基于用户按下的按钮决定采取哪个行动。 1. 在当前工程里插入一新模块 2. 重命名新模块SelectCase. 3. 输入下述过程TestButtons: Sub TestButtons()

Dim question As String Dim bts As Integer Dim myTitle As String Dim myButton As Integer

question = \"Do you want to open a new workbook?\" bts = vbYesNoCancel + vbQuestion + vbDefaultButton1 myTitle = \"New Workbook\"

myButton = MsgBox(prompt:=question, buttons:=bts, _ title:=myTitle)

Select Case myButton Case 6

Workbooks.Add Case 7

MsgBox \"You can open a new book manually later.\" Case Else

MsgBox \"You pressed Cancel.\" End Select

End Sub

过程TestButtons的第一部分显示一个带有三个按钮的信息框:是,否和取消。用户选择按钮的值赋予变量myButton。

如果用户点击“是”,那么变量myButton就会被赋值常量vbYes或它对应的值6;如果用户点击“否”,那么变量myButton则赋值为常量vbNo或它对应的值7;最后,如果点击了“取消”,变量myButton的内容就等于vbCancel或2。

Select Case语句对照储存在变量myButton里的值检查Case子句提供的值。当有匹配时,就会执行适当的Case语句。

如果你使用常量,而不是按钮值,过程TestButtons同样会运行一致。 Select Case myButton Case vbYes Workbooks.Add Case vbNo

MsgBox \"You can open a new book manually later.\" Case Else

MsgBox \"You pressed Cancel.\" End Select

你可以忽略Else子句,可以按下述方法修改一下Select Case语句: Select Case myButton Case vbYes Workbooks.Add Case vbNo

MsgBox \"You can open a new book manually later.\" Case vbCancel

MsgBox \"You pressed Cancel.\"

End Select

4. 运行过程TestButtons三次,每次选择一个不同的按钮。

技巧5-6 通过Case Else捕捉错误

尽管在Select Case语句里使用Case Else不是强制的,使用它总是很好的,以防止万一测试有没有预料到的值。Case Else子句是个放置错误信息的好地方。

1.6.4 和Case子句一起使用Is

有时候,作决定是基于测试表达式的条件,例如它是否大于,小于,等于或使用一些其它的关系运算符(参见表5-1)。关键字Is使你能够在Case子句里使用条件表达式。使用关键字Is的Select Case语句的语法如下: Select Case 测试表达式 Case Is 条件1

如果条件1为真时执行的语句 Case Is 条件2

如果条件2为真时执行的语句 Case Is 条件N

如果条件N为真时执行的语句 End Select

例如,我们来比较几个数字: Select Case myNumber Case Is <10

MsgBox \"The number is less than 10\" Case 11

MsgBox \"You entered eleven.\" Case Is >=100

MsgBox \"The number is greater than or equal to 100.\" Case Else

MsgBox \"The number is between 12 and 99.\" End Select

假设变量myNumber为120,那么第三个Case子句为真,并且只有Case Is >=100和Case Else之间的语句会被执行。

1.6.5 确定Case子句里数值的范围

在前面的例子里,你看到了在每个Case子句里使用一个简单表达式。然而,很多时候,你可能需要在Case子句里确定一个数值范围。可以通过关键字To用于表达式的数值之间来实现它,如下所示: Select Case unitsSold Case 1 to 100

Discount = 0.05 Case Is <= 500 Discount = 0.1 Case 501 to 1000 Discount = 0.15 Case Is >1000 Discount = 0.2 End Select

我们来分析一下上面的Select Case代码块,假设变量unitsSold当前值为99。VB将变量unitsSold的值与Case子句的条件表达式进行比较。第一和第三条Case子句示范如何通过使用关键字To在条件表达式里使用数值范围。因为unitsSold=99,第一个Case子句里的条件表达式为真,因此,VB将0.05赋给变量Discount。第二个Case子句如何呢?它也为真。尽管,很明显99小于等于500,VB不会执行相关的语句Discount=0.1。原因是,一旦VB找到了一个真条件的Case子句,它就不会去管其它的Case子句,它将跳过那些代码,继续执行End Select语句后面可能有的语句。

我们来练练使用Select Case语句,在函数过程里使用它。回想在第四章里,函数过程允许你将结果返回给一个子过程。假设该子过程必须根据销售的套数来显示一个折扣,你可以从用户那里获得销售套数,然后允许一个函数来确定需要的折扣: 1. 在模块SelectCase里输入下列子过程: Sub DisplayDiscount() Dim unitsSold As Integer Dim myDiscount As Single

unitsSold = InputBox(\"Enter the number of sold units:\") myDiscount = GetDiscount(unitsSold) MsgBox myDiscount End Sub

2. 输入下列函数过程:

Function GetDiscount(unitsSold As Integer) Select Case unitsSold Case 1 To 200

GetDiscount = 0.05 Case Is <=500 GetDiscount = 0.1 Case 501 To 1000 GetDiscount = 0.15 Case Is >1000 GetDiscount = 0.2 End Select End Function

3. 将光标放在过程DisplayDiscount的任意地方并且按下F5来运行它。

过程DisplayDiscount将储存于变量unitsSold的值传递给函数GetDiscount。当VB遇到Select Case语句时,它检查第一个Case子句里的值是否合储存于unitsSold里面的值是否匹配。如果匹配,VB给函数名称赋值百分之五(0.05),并且跳到关键字End Select。因为,在函数过程里面没有更多需要运行的语句,VB就返回主调过程——

DisplayDiscount,在这里,它将函数的结果赋予变量myDiscount。最后的语句用信息框来显示获得的折扣。

1.6.6 在Case子句里确定多个表达式

你可以使用逗号明确单一Case子句里的多个表达式: Select Case myMonth

Case \"January\Debug.Print myMonth & \": 1st Qtr.\" Case \"April\

Debug.Print myMonth & \": 2nd Qtr.\" Case \"July\Debug.Print myMonth & \": 3rd Qtr.\"

Case \"October\Debug.Print myMonth & \": 4th Qtr.\" End Select

技巧5-7 Case子句的多个条件

用来分隔开Case子句里面多个条件的逗号,和用于If语句里的运算符OR意义一样。只要这些条件有一个为真,Case子句就为真。

1.7 Vba暂停几秒的代码

当我们在使用VBA操作OFFICE文档时,如何让循环代码或者是普通代码甚至是选择语句,在执行的过程中,中途暂停几秒之后,再继续往下执行语句?

如果您需要这方面的知识,请使用如下两种办法来解决。

1.7.1

'用户代码行1 '用户代码行2

'用户代码行3„„

自动式的VBA暂停语句

waitTime = TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 10) Application.Wait waitTime

'用户代码行4 '用户代码行5

'用户代码行N„„

以上代码中,绿色的那两行代码就是暂停代码,后面的+10代表暂停10秒。 实现代码暂停几秒的依据是:

Application.Wait waitTime 意思是从现在开始暂停至waitTime这个时间,然后才开始往下执行。 方法是:waitTime = TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 秒数),先使用Hour(Now()), Minute(Now()), Second(Now()) 获取现在时间,再加上秒数,就可以让Application.Wait暂停到N秒后才执行后面语句。

1.7.2 手工暂停VBA语句的办法

当VBA在运行的时候,我们可以通过按下键盘的 Ctrl+PauseBreak 键来暂停,想暂停多久就多久,完全由人控制。

如果想让代码继续运行,当我们看到对话框时,点击“继续”按钮即可。

1.8 TreeView 控件 1.8.1

打开TreeView控件

在控件工具箱中点击其它控件,从中选择“Microsoft TreeView Control”。

如果是以VBA中为窗体添加,菜单:工具->附加控件,从中选择“Microsoft TreeView Control”

1.8.2 点击时加入子节点,找出树中当前节点的级数

对TreeView的点击,对于TreeView控件本身,并没有为哪一个级别的Node编写点击(选择)事件处理程序,而是把所有节点的点击事件都写入了一个AfterSelect事件中。因此,在编写点击加入子节点的程序之前,我们还必须编写一个查找点击的节点是哪一级节点的方法。

Public Function NodeLevel(ByVal n As TreeNode) As Byte

'* 找出树中当前节点的级数

Dim i As Byte = 1

Dim m As String

Do Until n.Parent Is Nothing

n = n.Parent

i += 1

Loop

Return i

End Function

通过这个函数,就可以很方便地得到节点的级别。现在我们可以放心地编写节点选择事件处理程序,以实现动态加载各级节点的子节点。 Private Sub TreeView1_AfterSelect

(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect

Select Case NodeLevel(e.Node).ToString

Case \"1\"

If e.Node.GetNodeCount(False) = 0 Then

mycommand.CommandText =

\"select 第一级子节点编号,第一级子节点名称

from 第一级子节点 where 根节点编号 ='\" & e.Node.Tag & \"'\"

fill_treeleaf()

End If

Case \"2\"

If e.Node.GetNodeCount(False) = 0 Then

mycommand.CommandText =

\"select 第二级子节点编号,第二级子节点名称 from 第二级子节点

where 第一级子节点编号 ='\" & e.Node.Tag & \"'\"

fill_treeleaf()

End If

End Select End Sub

Public Sub fill_treeleaf()

mycommand.Connection = myconnection

Try

myconnection.Open()

Dim mysqlreader As OleDb.OleDbDataReader = mycommand.ExecuteReader

While mysqlreader.Read()

Dim tree_leaf As New TreeNode()

tree_leaf.Tag = mysqlreader.GetString(0)

tree_leaf.Text = mysqlreader.GetString(1)

TreeView1.SelectedNode.Nodes.Add(tree_leaf)

End While

Catch ex As Exception

MsgBox(ex.Message)

Finally

myconnection.Close()

End Try End Sub

本文作者提醒大家:请大家要熟悉Text与Tag的作用,在使用时会达到很好的效果。

不知道大家注意没有,本文出自于早些年,作者采用的后台数据源是传统的数据库形式,如果用现在流行的XML格式

作为后台数据源呢?效果会怎样呢?....我试过,用XML作为后台数据源更为方便,在运行速率上更好.改天我把代码

贴上来与大家一起分享.

1.9 VBA listview控件用法

1.9.1 应用帮助(vba)

ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有

列标头的列,并显示伴随的图标和文本。 语法 ListView 说明

可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:

   

大(标准)图标 小图标 列表 报表

View 属性决定在列表中控件使用何种视图显示项目。还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示。另外,还可管理列表中项目的排序方法和选定项目的外观。

ListView 控件包括 ListItem 和 ColumnHeader 对象。ListItem 对象定义 ListView 控件中项目的各种特性,诸如:

  

项目的简要描述。

由 ImageList 控件提供的与项目一起出现的图标。

附加的文本片段,称作子项目,它们与显示在报表视图中的 ListItem 对象关联。

可以使用 HideColumnHeaders 属性决定是否在 ListView 控件中显示列标头。列标头可以在设计时添加,也可以在运行时添加。设计时,使用 ListView“控件属性”对话框的“列首”选项卡添加列标头。运行时,使用 Add 方法添加 ColumnHeader 对象到 ColumnHeaders 集合中。

发行注意 ListView 控件是 Mscomctl.ocx 文件中一组 ActiveX 控件的一部分。若要在应用程序中使用 ListView 控件,则必须将 Mscomctl.ocx 文件添加到工程中。当发行应用程序时,请将 Mscomctl.ocx 文件安装到用户的 Microsoft Windows System 或 System32 目录下。关于如何将 ActiveX 控件添加到 Visual Basic 工程的详细信息,请参阅 Visual Basic《程序员指南》。

VBA listview控件

1、在Listview控件中,用ColumnHeaders对象来操作列,而添加新的列可以用ColumnHeaders对象的ADD方法。具体如下:

ListView1.ColumnHeaders.Add 序号,唯一的字符串标识,列标显示文字,列宽,列的内容对齐方式,所使用的图标序号。

对齐方式有:lvwColumnLeft 、 lvwColumnCenter 、lvwColumnRight

其中第1列只能左对齐,而不能采取其他对齐方式

2、Listview控件的View 属性决定着它的显示的方式,具体如下:

ListView1.View = lvwIcon '图标显示

ListView1.View = lvwSmallIcon '小图标显示

ListView1.View = lvwList '列表显示

ListView1.View = lvwReport '报表显示

3、SelectedItem属性即是指当前选取的记录

4、清空listview控件中的内容:ListView1.ListItems.Clear

1.9.2 显示数据表内容

显示数据表内容:

Private Sub UserForm_Initialize()

With ListView1 '初始化listview

.ColumnHeaders.Add , , \"学号\ .ColumnHeaders.Add , , \"姓名\ .ColumnHeaders.Add , , \"班级\

.View = lvwReport '以报表的格式显示 .LabelEdit = lvwManual '使内容不可编辑 End With

Dim cn As ADODB.Connection Dim rs As ADODB.Recordset

Set cn = New ADODB.Connection '连接数据库 Set rs = New ADODB.Recordset

cn.Open \"provider=microsoft.jet.oledb.4.0;data source=D:/db1.mdb\"

rs.Open \"student\数据表student Do While Not rs.EOF

With ListView1.ListItems.Add() '添加记录

.Text = rs.Fields(\"stu_num\") '添加第一列内容

.SubItems(1) = rs.Fields(\"stu_name\") '添加第二列内容 .SubItems(2) = rs.Fields(\"stu_class\") '添加第三列内容 End With rs.MoveNext Loop rs.Close

Set rs = Nothing cn.Close End Sub

读取listview选择的内容:

将选中的内容分别显示在UserForm1的文本框中 With UserForm1

.stu_num.Value = ListView1.SelectedItem.Text '学号

.stu_name.Text = ListView1.SelectedItem.SubItems(1) '姓名 .stu_class.Text = ListView1.SelectedItem.SubItems(2) '班级 End With

1.9.3 VBA 点 listview 列名时自动排序(超有用)

'点 listview 列名时自动排序

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

If ListView1.SortOrder = lvwAscending Then ListView1.SortOrder = lvwDescending Else

ListView1.SortOrder = lvwAscending End If

ListView1.Sorted = True

ListView1.SortKey = ColumnHeader.Index - 1 ListView1.Sorted = False End Sub

1.10 窗体上显示图表

1.10.1

其实装载的只是一个图片

根据数据源在Form窗体显示图表

Option Explicit Sub ShowChart() Dim UserRow As Long UserRow = ActiveCell.Row

If UserRow < 2 Or IsEmpty(Cells(UserRow, 1)) Then

MsgBox \"Move the cell pointer to a row that contains data.\" Exit Sub '选中数据源区域 End If

CreateChart (UserRow) '生成图表 UserForm1.Show End Sub

Sub CreateChart(r) Dim TempChart As Chart Dim CatTitles As Range

Dim SrcRange As Range, SourceData As Range Dim fname As String

Set CatTitles = ActiveSheet.Range(\"A2:F2\") '数据源区域的设置 Set SrcRange = ActiveSheet.Range(Cells(r, 1), Cells(r, 6)) Set SourceData = Union(CatTitles, SrcRange) ' 添加图标

Application.ScreenUpdating = False

Set TempChart = ActiveSheet.Shapes.AddChart.Chart TempChart.SetSourceData Source:=SourceData

' 设置图标的样式 With TempChart

.ChartType = xlColumnClustered '柱状图

.SetSourceData Source:=SourceData, PlotBy:=xlRows '以行分类 .HasLegend = False '不显示图例

.PlotArea.Interior.ColorIndex = xlNone '绘图去无颜色 .Axes(xlValue).MajorGridlines.Delete '删除主要网格线

.ApplyDataLabels Type:=xlDataLabelsShowValue, LegendKey:=False '显示数据标签

.Axes(xlValue).MaximumScale = 0.6 '最大刻度0.6

.ChartArea.Format.Line.Visible = False '图表区域线条不可见 End With

' 调整图标大小

With ActiveSheet.ChartObjects(1) .Width = 300 .Height = 200 .Activate End With ' 保存为gif 图片

fname = ThisWorkbook.Path & Application.PathSeparator & \"temp.gif\" TempChart.Export Filename:=fname, filterName:=\"GIF\" ActiveSheet.ChartObjects(1).Delete '删除图表 Application.ScreenUpdating = True End Sub

Private Sub UserForm_Initialize() Dim fname As String

fname = ThisWorkbook.Path & Application.PathSeparator & \"temp.gif\" UserForm1.Image1.Picture = LoadPicture(fname) '其实装载的只是一个图片 End Sub

Private Sub CloseButton_Click() Unload Me End Sub

1.10.2 在窗体上显示图表

前几天我准备写一个在窗体上显示图表的模块,结果用Google查遍了整个网络,关于利用Excel VBA实现此功能的网页寥若晨星,而反复搜寻之后也终于让我有所得,有2位网友的解决方法比较好:

1、 http://club.excelhome.net/thread-345009-1-1.html ,

第4楼的HLAI网友提供方法很直接,其特点是容易实现,几乎不需要用VBA编程。但缺点也很明显,就是缺乏更复杂的扩展能力。

2、 http://club.excelhome.net/thread-243472-1-1.html

网友andysky 在 Excel home 论坛分享的一个方法,这个方法非常精妙,虽然复杂一点,但是跟用chartspace控件比起来要轻松多了。 这种思路是:

创建图表 →修改图表→存为图形文件→导入窗体的图形控件中→删除图形文件

编程中我认为比较重要的几个要点: 1、绘制图表前一定要先删除所有图表;

2、准备的数据必须有列标题,否则生成的图表很难看

3、一定要给生成的图表命名,这样后续的处理就比较容易了,否则非常麻烦。 4、生成的图表修改到多大合适,需要反复调试才行,不同的人有不同的口味。 5、别忘了删除图形文件,那只是一个临时的玩意。

我正是在andysky 网友解决思路的基础上,为自己刚开发的一个管理系统增加了一个完整的能耗数据的图表分析模块。(代码将近1500行,目前已经集成了31张表格)

真要感谢伟大的网络!如果没有网络,没有Excel吧吧主bengdeng的帮助,没有网上那么多网友的分享,很难想像我这样的计算机外行居然能够编写出一个近万行代码的管理软件。

在此,我也贴出我写的关于生成图表的代码中最核心的那一段,为其他网友再次编写类似

代码时提供参考,主要是把我通过录制宏弄清楚的部分图表代码的含义与大家做一个分享。

调用该子程序前,需要编写为sheets(\"图表专用\")准备数据的代码,相信对于需要这段代码的人而言没有困难。

能耗分析.分输量趋势图...等等之类都是窗体上创建的图形控件,当然可以随心所欲地另建。

Sub 绘制图表(图表类型 As Integer, 图表对象 As Integer)

Dim 数据区域 As Range Dim 新图表 As ChartObject Dim 文件名 As String

'选中要绘制图表的区域 On Error Resume Next

Set 数据区域 = Range(Cells(2, 1), Cells(数据区域最后一行, 数据区域最后一列)) Set 数据区域 = Range(Cells(2, 1), Cells(数据区域最后一行, 数据区域最后一列)) 数据区域.Activate

Sheets(\"图表专用\").ChartObjects.Delete '删除已经存在的图表

Set 新图表 = Sheets(\"图表专用\").ChartObjects.Add(100, 0, 500, 290) '左边距,顶边距,宽,高

'Charts.Add '绘制图表 Select Case 图表类型 Case 1

新图表.Chart.ChartType = xlLineMarkers '图表类型为折线图 Case 2

新图表.Chart.ChartType = xlColumnStacked '图表类型为堆积柱形图 Case 3

新图表.Chart.ChartType = xl3DPie '图表类型为三维饼图 Case 4

新图表.Chart.ChartType = xlColumnClustered '图表类型为默认的柱形图 End Select '图表数据源

新图表.Chart.SetSourceData Source:=数据区域, PlotBy:= _ xlColumns '图表数据源,产生在列

新图表.Chart.Location Where:=xlLocationAsObject, Name:=\"图表专用\" '嵌入图表 '保留X轴刻度,保留Y轴刻度 If 图表类型 <> 3 Then With 新图表.Chart

.HasAxis(xlCategory, xlPrimary) = True '有X轴 .HasAxis(xlvalue, xlPrimary) = True '有Y轴 End With

'X、Y轴线的类型自动

新图表.Chart.Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic '调整X轴格式

'新图表.Chart.Axes(xlCategory).TickLabels.NumberFormatLocal = \"m\"\".\"\"d\" '日期格式为 “月.日”

With 新图表.Chart.Axes(xlCategory).TickLabels .Alignment = xlCenter .Offset = 100

.Orientation = xlUpward .ReadingOrder = xlContext

.NumberFormatLocal = \"d\"\"日\"\"\" End With

With 新图表.Chart.Axes(xlCategory).TickLabels.Font .FontStyle = \"常规\" .Size = 10

.Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False

.Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic .Background = xlAutomatic End With End If

'关闭图例选项

新图表.Chart.HasLegend = False

'对于能耗组分堆积图或是饼图,必须显示图例选项 If 单位能耗.value = True Or 图表类型 = 3 Then 新图表.Chart.HasLegend = True '打开图例选项 新图表.Chart.Legend.Position = xlRight '靠右 End If

'如果绘制饼图,重新设置图例位置、绘图区位置及范围 If 图表类型 = 3 Then '图例位置向上调,

With 新图表.Chart.Legend .Left = 420 .Top = 40 End With

'绘图区适当拉伸

With 新图表.Chart.PlotArea .Left = 25 .Top = 85

.Width = 445 .Height = 180 End With End If

'图表缩放

ActiveSheet.Shapes(新图表.Name).ScaleWidth 0.61, msoFalse, msoScaleFromTopLeft ActiveSheet.Shapes(新图表.Name).ScaleHeight 0.98, msoFalse, msoScaleFromTopLeft '设置边框

With Selection.Border .Weight = 2 .LineStyle = -1 End With '颜色

With Selection.Interior .ColorIndex = 34

.PatternColorIndex = 1 .Pattern = 1 End With

'图表边框倒圆角

Sheets(\"图表专用\").DrawingObjects(新图表.Name).RoundedCorners = True Sheets(\"图表专用\").DrawingObjects(新图表.Name).Shadow = False '设置标题内容 With 新图表.Chart .HasTitle = True

.ChartTitle.Characters.Text = WS2.Range(\"A1\").Text End With

'设置标题格式,红色是3

新图表.Chart.ChartTitle.Select '选中标题 'Selection.AutoScaleFont = True

新图表.Chart.ChartTitle.AutoScaleFont = True With Selection.Font .Name = \"黑体\" .FontStyle = \"常规\" .Size = 14

.Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False

.Underline = xlUnderlineStyleNone .ColorIndex = 3

.Background = xlAutomatic End With

'设置绘图区的颜色

新图表.Chart.PlotArea.Select With Selection.Border .ColorIndex = 16 .Weight = xlThin

.LineStyle = xlContinuous End With

'设置绘图区的填充色及填充方法

Selection.Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=1, _ Degree:=0.231372549019608 With Selection

.Fill.Visible = True

.Fill.ForeColor.SchemeColor = 2 End With

' 将绘制并重新设置后的图表保存为一个临时的图片文件 → 导入窗体 文件名 = ThisWorkbook.Path & Application.PathSeparator & \"temp.gif\" 新图表.Chart.Export Filename:=文件名, filtername:=\"gif\" ' 将临时的图片文件 → 导入窗体 Select Case 图表对象 Case 1

能耗分析.分输量趋势图.Picture = LoadPicture(文件名) 能耗分析.分输量趋势图.Visible = False 能耗分析.分输量趋势图.Visible = True Case 2

能耗分析.输差趋势图.Picture = LoadPicture(文件名) 能耗分析.输差趋势图.Visible = False 能耗分析.输差趋势图.Visible = True Case 3

能耗分析.单位能耗趋势图.Picture = LoadPicture(文件名) 能耗分析.单位能耗趋势图.Visible = False 能耗分析.单位能耗趋势图.Visible = True Case 4

能耗分析.能耗指标趋势图.Picture = LoadPicture(文件名) 能耗分析.能耗指标趋势图.Visible = False 能耗分析.能耗指标趋势图.Visible = True Case 5

能耗分析.绘制其它图表.Picture = LoadPicture(文件名) 能耗分析.绘制其它图表.Visible = False 能耗分析.绘制其它图表.Visible = True End Select

'删除临时的图片文件

VBA.Kill 文件名

End Sub

Function 数据区域最后一行() Sheets(\"图表专用\").Select Cells(2, 1).Select

Selection.End(xlDown).Select

数据区域最后一行 = ActiveCell.Row End Function

Function 数据区域最后一列() Sheets(\"图表专用\").Select Cells(2, 1).Select

Selection.End(xlToRight).Select

数据区域最后一列 = ActiveCell.Column End Function

大家注意程序里的这一段重复的代码: On Error Resume Next

Set 数据区域 = Range(Cells(2, 1), Cells(数据区域最后一行, 数据区域最后一列)) Set 数据区域 = Range(Cells(2, 1), Cells(数据区域最后一行, 数据区域最后一列))

这个代码还是有一点意义的。我在Excel吧和bengdeng版主探讨过这个问题(见

http://www.excelba.com/bbs/Show.asp?bid=1&aid=2399 ),如果在调用该子程序之前,在程序里加一行

Sheets(”图表专用”).select

确实是可以避免产生 Error ‘1004’,但是我对其它类似的代码反复调试之后,认为象这样即便在发生错误的时候也能使程序继续运行的方法,还是很值得保留在程序里的。

1.11 如何让VBA制作的窗体即在前端显示又不影响表使用

可以设置窗体的ShowModal属性为false

2 应用实例

2.1 获取工作表使用的最大行数

Worksheet.UsedRange 属性

已用范围包含曾经使用过的任何单元格。例如,如果单元格“A1”包含一个值,随后您删除了该值,则单元格“A1”被视为已用。在这种情况下,UsedRange 属性将返回一个包含单元格“A1”的范围。在Excel2007中则只包含有存储值或有格式设置的单元格。 下面的代码示例使用 UsedRange 属性选择工作表上所使用的单元格的范围。该示例首先将当前工作表上 A1 至 C3 的单元格范围设置为值 23。如果该工作表可见,则该示例使用 UsedRange 属性选择所使用的单元格的

Private Sub SelectUsedRange() Me.Activate()

Me.Range(\"A1\

If Me.Visible = Excel.XlSheetVisibility.xlSheetVisible Then Me.UsedRange.Select() End If End Sub

判断一个工作表是否为空或取得工作表已使用区域的行、列数:

Worksheet.UsedRange 是工作表的使用到的最大范围,直接使用UsedRange的属性: Worksheets(1).UsedRange.Row ' 起始行 Worksheets(1).UsedRange.Column ' 起始列 Worksheets(1).UsedRange.Rows.Count ' 行数 Worksheets(1).UsedRange.Columns.Count ' 列数 Range.CurrentRegion 属性

当前的区域是由任意组合的空行和空列所包围的范围。此属性不适用于受保护的工作表。 (被填充的单元格块,包括当前被选中的一个单元格或者多个单元格。该区域延伸到各个方向上第一个碰到的空行或者空列) 关于CurrentRegion和UsedRange的困惑

CurrentRegion和UsedRange是很有用的,但是遇到一些极端情况,可能不那么如人意 set a = activesheet.cells.currentregion set b= activesheet.usedrange

对于下图中的情况,除了C1:C3,A3:B3,A4外的所有格子为空(没有任何内容和格式),A4仅仅是加了特殊格式对于上述定义 a 为A1 b为A1:C4

但是我希望数据清单的范围是A1:C3 用usedrange挺好,就是怕有时候不经意在本来的数据清单的周围作了一些操作,而没有彻底清除,这样usedrange就不是想要的数据范围,进而导致程序出错或程序结果输出不理想 怎么有效地解决这个问题呢

currentregion只的是连续单元格组成的矩形区域,除了边界的单元格,一般单元格有8个相邻单元格,(下图中红线区域)

usedrange是当前工作表已经使用的单元格组成的矩形区域,设置格式也属于已经使用(下图中的兰线区域)

这两个区域有时相同,有时不同,本图中,二者结果不同的原因在于黄色区域是空白的 Range.End(xlup)

Sub GetMaxRow()

Dim MaxRow As Long

MaxRow = Me.Cells(1048576, 1).End(xlUp).Row MsgBox MaxRow End Sub

这一程序返回工作表中最后一个包含非空内容的单元格所在的行号,而不管这一单元格与Me.Cells(1,1)之间是否有包含空白内容的单元格。而且这一方法将跳过或者说忽略被隐藏的单元格,比如,数据表有连续的50行,如果第48到50行隐藏了,则这一程序只返回47。 补救方法:

MaxRow = Application.Evaluate(\"=MAX((A1:A1048576<>\"\"\"\")*ROW(1:1048576))\") '数组公式

如果表A列中没有空行也可以:

MaxRow = Application.WorksheetFunction.CountA(Me.Columns(1)) Worksheet.Rows 属性

Private Sub DisplayRowCount() MsgBox(\"This worksheet contains \" & _ Me.Rows.Count.ToString() & \" rows.\")End Sub

2.2 利用动态数组获取当前目录下指定文件类型的文件 Sub FileNames() Dim sFName As String Dim asFNames() As String Dim sFType As String Dim i As Integer

sFType = \"*.xls?\" '设置文件类型含有xls的各种类型包括,这里具有通配符 sFName = Dir(sFType) '获取该类型所有文件 Do Until sFName = \"\" i = i + 1

ReDim Preserve asFNames(1 To i) '重新定义多维数组 asFNames(i) = sFName '将文件名依次赋值给数组 sFName = Dir '获取下一个文件 Loop '循环获取所有的文件 If i = 0 Then

MsgBox \"No files found\" Else

For i = 1 To UBound(asFNames)

MsgBox asFNames(i) '依次显示所有文件名 Next i End If End Sub

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务