<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>O I P O P - 私人领域 &#187; 编程</title>
	<atom:link href="http://blog.oipop.com/archives/tag/%e7%bc%96%e7%a8%8b/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.oipop.com</link>
	<description>From the Internet, For the Internet.</description>
	<lastBuildDate>Mon, 21 Jun 2010 21:13:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>解决VS2008程序独立运行问题</title>
		<link>http://blog.oipop.com/archives/94</link>
		<comments>http://blog.oipop.com/archives/94#comments</comments>
		<pubDate>Fri, 29 Jan 2010 06:24:02 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[VC++]]></category>
		<category><![CDATA[微软的东东]]></category>
		<category><![CDATA[VS2008]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=94</guid>
		<description><![CDATA[许多刚接触 VS2008 的程序员，编写应用程序会遇到这种情况，即在开发用的机器上可以正常运行，但是换了没装VS2008的机器，你写的程序就有可能运行不了了。其实当初我也是遇到这个问题，但是对于MFC程序来说，如果采用MFC静态链接发布，那么这个问题将会被简单解决。但是如果换了Win32项目，情况就不同了，因为它没有使用MFC，但是编译出来的程序，同样无法独立运行。这个问题本人曾在网上寻找过答案，不过没有找到对题的答案。
有一天，我在研究用于使用DLL的导入库LIB的兼容性问题(VC6使用VS2008产生的库时，总会发生一些链接错误)。解决了这个菜鸟问题。
VS2008编译的Win32程序独立运行的解决方案是：
1. 保证发布的是Release版本；
2. 右键点击项目，选择“属性(Properties)”；
3. 在“C/C++ &#124; 代码生成(Code Generation) &#124; 运行时库(Runtime Library)”中选择“多线程(Muti-threaded)(/MT)”。
PS：本人曾多次听到一些人抱怨VS2008写的程序不能独立运行，说VS2008太垃圾了。其实如果你有脑子的话，你就想想，一个成功的软件集团何况是MS，怎么可能让自己的软件功能不如以前？其实问题往往来源于自己的无知。
]]></description>
			<content:encoded><![CDATA[<p>许多刚接触 VS2008 的程序员，编写应用程序会遇到这种情况，即在开发用的机器上可以正常运行，但是换了没装VS2008的机器，你写的程序就有可能运行不了了。其实当初我也是遇到这个问题，但是对于MFC程序来说，如果采用MFC静态链接发布，那么这个问题将会被简单解决。但是如果换了Win32项目，情况就不同了，因为它没有使用MFC，但是编译出来的程序，同样无法独立运行。这个问题本人曾在网上寻找过答案，不过没有找到对题的答案。</p>
<p>有一天，我在研究用于使用DLL的导入库LIB的兼容性问题(VC6使用VS2008产生的库时，总会发生一些链接错误)。解决了这个菜鸟问题。</p>
<p>VS2008编译的Win32程序独立运行的解决方案是：<span id="more-94"></span><br />
1. 保证发布的是Release版本；<br />
2. 右键点击项目，选择“属性(Properties)”；<br />
3. 在“C/C++ | 代码生成(Code Generation) | 运行时库(Runtime Library)”中选择“多线程(Muti-threaded)(/MT)”。</p>
<p>PS：本人曾多次听到一些人抱怨VS2008写的程序不能独立运行，说VS2008太垃圾了。其实如果你有脑子的话，你就想想，一个成功的软件集团何况是MS，怎么可能让自己的软件功能不如以前？其实问题往往来源于自己的无知。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/94/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>API限制鼠标光标范围</title>
		<link>http://blog.oipop.com/archives/91</link>
		<comments>http://blog.oipop.com/archives/91#comments</comments>
		<pubDate>Tue, 19 Jan 2010 07:45:19 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=91</guid>
		<description><![CDATA[ClipCursor
ClipCursorByNum
Option Explicit
Dim R As RECT
Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Private Declare Function ClipCursor Lib &#8220;user32&#8243; (lpRect As RECT) As Long
&#8216;lpRect-鼠标光标限制到的矩形
Private Declare Function ClipCursorByNum Lib &#8220;user32&#8243; Alias &#8220;ClipCursor&#8221; (lpRect As Long) As Long
&#8216;lpRect-传0，取消鼠标光标限制
Private Declare Function SetRect Lib &#8220;user32&#8243; (lpRect As RECT, ByVal X1 As Long, ByVal [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000; font-size: large;"><strong><em><span style="text-decoration: underline;">ClipCursor<br />
ClipCursorByNum</span></em></strong></span></p>
<p>Option Explicit<br />
Dim R As RECT<br />
Private Type RECT<br />
        Left As Long<br />
        Top As Long<br />
        Right As Long<br />
        Bottom As Long<br />
End Type<br />
<span style="color: #0000ff;">Private Declare Function ClipCursor Lib &#8220;user32&#8243; (lpRect As RECT) As Long<br />
&#8216;lpRect-鼠标光标限制到的矩形<br />
Private Declare Function ClipCursorByNum Lib &#8220;user32&#8243; Alias &#8220;ClipCursor&#8221; (lpRect As Long) As Long<br />
&#8216;lpRect-传0，取消鼠标光标限制<br />
</span>Private Declare Function SetRect Lib &#8220;user32&#8243; (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long</p>
<p>Private Sub Form_Load() &#8216;窗体载入后，鼠标只能在窗体范围内移动<br />
SetRect R, Left / Screen.TwipsPerPixelX, Top / Screen.TwipsPerPixelY, (Left + Width) / Screen.TwipsPerPixelX, (Top + Height) / Screen.TwipsPerPixelY<br />
ClipCursor R<br />
End Sub</p>
<p>Private Sub Form_Unload(Cancel As Integer) &#8216;窗体退出时，取消鼠标光标限制范围<br />
ClipCursorByNum 0<br />
End Sub</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/91/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VBA字符串处理</title>
		<link>http://blog.oipop.com/archives/79</link>
		<comments>http://blog.oipop.com/archives/79#comments</comments>
		<pubDate>Wed, 04 Nov 2009 15:50:21 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=79</guid>
		<description><![CDATA[1 VBA中的字符串
2 VBA中处理字符串的函数
2.1 比较字符串
2.2 转换字符串
2.3 创建字符串
2.4 获取字符串的长度
2.5 格式化字符串
2.6 查找字符串
2.7 提取字符/字符串
2.8 删除空格
2.9 返回字符代码
2.10 返回数值代表的相应字符
2.11 使用字节的函数
2.12 返回数组的函数
2.13 连接字符串
2.14 替换字符串
2.15 反向字符串
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - -
1 VBA中的字符串
VBA不仅可以处理数字，也可以处理文本(字符串)。VBA提供了两类字符串：
一类为固定长度的字符串，声明时包含指字的字符数。例如，下面的语句
Dim strFixedLong As String*100
声明字符串变量后，无论赋予该变量多少个字符，总是只包含100个字符，但字符串最长不超过65526个字符，且需要使用Trim函数去掉字符串中多余的空格。定长字符串只有在必要时才使用。
另一类为动态字符串。例如，声明字符串变量Dim strDynamic As String后，可以给该变量任意赋值，最多可包含20亿个字符。
- &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>1 VBA中的字符串<br />
2 VBA中处理字符串的函数<br />
2.1 比较字符串<br />
2.2 转换字符串<br />
2.3 创建字符串<br />
2.4 获取字符串的长度<br />
2.5 格式化字符串<br />
2.6 查找字符串<br />
2.7 提取字符/字符串<br />
2.8 删除空格<br />
2.9 返回字符代码<br />
2.10 返回数值代表的相应字符<br />
2.11 使用字节的函数<br />
2.12 返回数组的函数<br />
2.13 连接字符串<br />
2.14 替换字符串<br />
2.15 反向字符串</p>
<p><span id="more-79"></span>- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - -<br />
1 VBA中的字符串<br />
VBA不仅可以处理数字，也可以处理文本(字符串)。VBA提供了两类字符串：<br />
一类为固定长度的字符串，声明时包含指字的字符数。例如，下面的语句<br />
Dim strFixedLong As String*100<br />
声明字符串变量后，无论赋予该变量多少个字符，总是只包含100个字符，但字符串最长不超过65526个字符，且需要使用Trim函数去掉字符串中多余的空格。定长字符串只有在必要时才使用。<br />
另一类为动态字符串。例如，声明字符串变量Dim strDynamic As String后，可以给该变量任意赋值，最多可包含20亿个字符。<br />
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - -<br />
2 VBA中处理字符串的函数<br />
2.1 比较字符串<br />
通常，在VBA中进行字符串比较时，会用到比较运算符(如=、&gt;等)、Like运算符和StrComp函数。此外，在模块的开头用Option Compare语句指定比较方式。<br />
2.1.1 比较运算符<br />
可以采用简单的逻辑运算符进行两个字符串的比较，即&lt;(小于)、&lt;=(小于或等于)、&gt;(大于)、&gt;=(大于或等于)、=(等于)、&lt;&gt;(不等于)。此外，还可以使用Like运算符进行比较。<br />
2.1.2 StrComp函数<br />
StrComp函数返回字符串比较的结果。其语法为：<br />
StrComp(string1,string2[,compare])<br />
其中，参数string1和strng2为必需的参数，可以是任何有效的字符串表达式。<br />
参数Compare为可选参数，如果该参数为Null，将发生错误。如果参数Compare设置为常数vbUseCompareOption或-1或忽略该参数，将使用Option Compare语句设置进行比较；如果忽略该参数且没有设置Option Compare语句，则按二进制进行比较；如果参数Compare设置为常数vbBinaryCompare或0，则用二进制进行比较；如果参数Compare设置为常数vbTextCompare或1，则按文本进行比较；如果参数Compare设置为常数vbDatabaseCompare或2，此时仅适用于Microsoft Access，进行基于数据库信息的比较。<br />
StrComp函数的返回值为：如果String1String2，则返回值为1；如果String1或String2为Null，则返回值为Null。<br />
看看下面的示例：<br />
Sub testStringCompare()<br />
Dim MyStr1 As String, MyStr2 As String, MyComp1, MyComp2, MyComp3, MyComp4<br />
MyStr1 = &#8220;ABCD&#8221;<br />
MyStr2 = &#8220;abcd&#8221;<br />
MyComp1 = StrComp(MyStr1, MyStr2, 1) &#8216; 返回 0<br />
MyComp2 = StrComp(MyStr1, MyStr2, 0) &#8216; 返回 -1<br />
MyComp3 = StrComp(MyStr1, MyStr2) &#8216; 返回 -1<br />
MyComp4 = StrComp(MyStr2, MyStr1) &#8216;返回1<br />
MsgBox &#8220;StrComp(MyStr1, MyStr2, 1)的结果为:&#8221; &amp; MyComp1<br />
MsgBox &#8220;StrComp(MyStr1, MyStr2, 0)的结果为:&#8221; &amp; MyComp2<br />
MsgBox &#8220;StrComp(MyStr1, MyStr2)的结果为:&#8221; &amp; MyComp3<br />
MsgBox &#8220;StrComp(MyStr2, MyStr1)的结果为:&#8221; &amp; MyComp4<br />
End Sub<br />
示例说明：如果StrComp函数的第三个参数值为1，则以文本比较的方式进行字符串比较；如果第三个参数值为0或忽略该参数，则以二进制比较的方式进行字符串比较。注意，文本比较的方式不区分字母大小写，而二进制比较方式则区分大小写。<br />
[编程方法和技巧] 完成一次简单的单一比较，如<br />
If UCase(sString1) 比使用StrComp函数：<br />
If StrComp(sString1,sString2,vbTextCompare)=-1 Then<br />
在性能上要提高30%，且更容易阅读和理解。<br />
2.2 转换字符串<br />
2.2.1 StrConv函数<br />
使用StrConv函数来按指定类型转换字符串。其语法为：<br />
StrConv(string,conversion,LCID)<br />
其中，参数string为要转换的字符串，参数conversion为指定转换的类型，参数LCID为可选参数。<br />
如果将参数conversion设置为vbUpperCase或1，则将字符串转换成大写；设置为vbLowerCase或2，则将字符串转换成小写；设置为vbProperCase或3，则将字符串中每个字的开头字母转换成大写；设置为vbUnicode或64，则根据系统的缺省码页将字符串转换成Unicode；设置为vbFromUnicode或128，则将字符串由Unicode转换成系统的缺省码页。<br />
在将ANSI格式的Byte数组转换成字符串时，应使用StrConv函数；转换Unicode格式的数组时，使用赋值语句。下面的例子使用StrConv函数将Unicode字符串转换成ANSI字符串：<br />
Sub testConverseString()<br />
Dim i As Long<br />
Dim x() As Byte<br />
x = StrConv(&#8220;ABCDEFG&#8221;, vbFromUnicode) &#8216; 转换字符串。<br />
For i = 0 To UBound(x)<br />
Debug.Print x(i)<br />
Next<br />
End Sub<br />
下面的例子将句子中每个词语的首字母转换为大写：<br />
Sub testConverseString2()<br />
Debug.Print StrConv(&#8220;my book is this book.&#8221;, vbProperCase)<br />
End Sub<br />
程序运行后，在VBE窗口中的立即窗口中将会看到上述结果。<br />
下面的示例演示了如何把一个字符串转换为字节数组，以便使用在API函数调用中：<br />
Sub Test()<br />
Dim byArray() As Byte<br />
Dim sString As String<br />
sString = &#8220;Some stuff&#8221;<br />
byArray = StrConv(sString, vbFromUnicode)<br />
End Sub<br />
StrConv函数将下面的字符看成是字的分隔符：<br />
Null：Chr$(0)<br />
水平制表符：Chr$(9)<br />
换行符：Chr$(10)<br />
垂直制表符：Chr$(11)<br />
换页符：Chr$(12)<br />
回车符：Chr$(13)<br />
空格：Chr$(32)<br />
[编程方法和技巧] 在使用API时该函数很重要，很多程序调用都要求传递给它们Unicode字符，或者赋给返回变量Unicode字符。<br />
2.2.2 Str函数<br />
将数值转换成字符串，即返回代表一个数值的字符串。其语法为：<br />
Str(number)<br />
当一个数字转成字符串时，总会在前面保留一个空位来表示正负，即字符串的第一位一定是空格或正负号。如果参数number为正，返回的字符串前面包含一空格。Str函数将句点(.)作为有效的小数点。示例如下：<br />
MyString = Str(459) &#8216; 返回 &#8221; 459&#8243;<br />
MyString = Str(-459.65) &#8216; 返回 &#8220;-459.65&#8243;<br />
MyString = Str(459.001) &#8216; 返回 &#8221; 459.001&#8243;<br />
[编程方法和技巧] 使用LTrim函数可删除Str函数在返回的字符串开头添加的前导空格。此外，CStr函数和Format函数已经取代了Str函数，CStr函数不用为正数的符号而添加前导空格，Format函数能够用来识别小数点。<br />
2.2.3 CStr函数<br />
CStr将数值表达式转换成String数据类型。示例如下：<br />
MyDouble = 437.324 &#8216; MyDouble 为 Double 类型<br />
MyString = CStr(MyDouble) &#8216; MyString 的内容为&#8221;437.324&#8243;<br />
[编程方法和技巧] 传递给CStr的未初始化的数字数据类型返回“0”，传递给CStr的未初始化的日期变量返回“0:00:00”。<br />
2.3 创建字符串<br />
2.3.1 Space函数<br />
该函数返回指定数的空格的字符串。语法为：<br />
Space(number)<br />
其中，参数number必须，为字符串中指定的空格数。<br />
如下例所示：<br />
Sub CreateString1()<br />
Dim MyString<br />
&#8216; 返回 10 个空格的字符串。<br />
MyString = Space(10)<br />
&#8216; 将 10 个空格插入两个字符串中间。<br />
MyString = &#8220;Hello&#8221; &amp; Space(10) &amp; &#8220;World&#8221;<br />
End Sub<br />
该函数可用于在调用外部DLL时建立字符串缓冲区，特别是在调用Window API时。此外，使用该函数还可以使字符串在特定长度的缓冲区左对齐或右对齐。<br />
注意，如果参数number是负数，则会产生运行时错误5：“无效的过程调用或参数”。<br />
[编程方法和技巧] 可以使用Space函数添加和清除存储在定长字符串中的数据，例如，下面的代码用空格填充一个定长字符串：<br />
Dim strFixed As String * 32<br />
……<br />
strFixed = Space(Len(strFixed))<br />
2.3.2 String函数<br />
该函数返回重复的字符或字符串。其语法为：<br />
String(number,character)<br />
其中，参数number必须，指定所返回的字符串的长度；参数character必须，指定字符的字符代码或字符串表达式。<br />
例如，下面使用String函数生成指定长度且只含单一字符的字符串。<br />
Sub CreateString2()<br />
Dim MyString<br />
MyString = String(5, &#8220;*&#8221;) &#8216; 返回 &#8220;*****&#8221;<br />
MyString = String(5, 42) &#8216; 返回 &#8220;*****&#8221;<br />
MyString = String(10, &#8220;ABC&#8221;) &#8216; 返回 &#8220;AAAAAAAAAA&#8221;<br />
End Sub<br />
如果参数number包含Null，则返回Null；如果参数character包含Null，则返回Null；参数character可以指定为字符串或者是ANSI字符代码，如：<br />
strString1=String(128,”=”) ‘用”=”填充<br />
strString2=String(128,0) ‘用Chr$(0)填充<br />
[编程方法和技巧]<br />
(1) String函数在用于创建较长的“_”，“-”，或者“=”构成的水平线以便给报表分段时十分有用。<br />
(2) 当调用API函数向缓冲区写入字符串值时，首先要用String函数创建一个长度合适的字符串变量，并且用诸如Chr$(0)之类的单个字符来填充。<br />
2.4 获取字符串的长度<br />
可以使用Len函数来确定任何字符串或字符串表达式的长度，其语法为：<br />
Len(string|varname)<br />
其中，参数string为任何有效的字符串表达式；参数varname为任何有效的变量名称。两个参数必须取一。<br />
利用LenB函数可以确定存储某变量所需的实际字节数。<br />
下面的示例使用Len函数来获取某字符串的长度(字符数)或某变量的大小(位数)。<br />
Type CustomerRecord &#8216; 定义用户自定义的数据类型<br />
ID As Integer &#8216; 将此定义放在常规模块中<br />
Name As String * 10<br />
Address As String * 30<br />
End Type<br />
Sub GetStrLen()<br />
Dim Customer As CustomerRecord &#8216; 声明变量<br />
Dim MyInt As Integer, MyCur As Currency<br />
Dim MyString, MyLen<br />
MyString = &#8220;Hello World&#8221; &#8216; 设置变量初值<br />
MyLen = Len(MyInt) &#8216; 返回 2<br />
MyLen = Len(Customer) &#8216; 返回 42<br />
MyLen = Len(MyString) &#8216; 返回 11<br />
MyLen = Len(MyCur) &#8216; 返回 8<br />
End Sub<br />
此外，在需要大量判断是否为空字符串的代码中，使用Len函数也可以加快代码执行的速度。例如：<br />
If strTemp = &#8220;&#8221; Then<br />
&#8216;要执行的代码<br />
End If<br />
上面的代码可以用以下代码代替：<br />
If Len(strTemp) = 0 Then<br />
&#8216;要执行的代码<br />
End If<br />
注意：<br />
(1) 参数string和参数varname互不相容，即只能指定这两个参数中的某一个，不能同时指定这两个参数。<br />
(2) 如果参数string或参数varname中包含Null，则Len函数会返回Null。<br />
(3) 在向文件写入某种用户自定义类型数据时，Len函数会返回数据的大小(字符数)。<br />
(4) LenB函数返回用户自定义类型数据实际占用的内存大小。<br />
(5) 在对字节数据或Unicode字符串使用LenB函数时，LenB函数返回表示数据或字符串的字节数。<br />
(6) 不能对对象变量使用Len函数。<br />
(7) 如果参数varname是一个数组，则必须指定一个有效的下标，即Len函数不能确定数组中元素的总数或数组占用内存的大小。<br />
(8) Len函数对Variant类型变量的处理和字符串变量一样，Len函数返回变量所存储的实际字符数，如下面的代码：<br />
Dim vVar<br />
vVar=100<br />
MsgBox Len(vVar)<br />
结果为3。<br />
(9) 由于VB本质上使用的是Unicode字符串(用两个字节的空间来存储一个字符)，因此当相同的字符串变量传递给Len函数和LenB函数时会出现不同的返回值。例如，对于一个包含4个字符的字符串，使用Len函数时返回值为4，使用LenB函数则为8。<br />
(10) 使用强类型变量(即强制声明该变量的类型)时，Len函数会返回存储该变量所需的字节数。例如，长整型变量的长度为4。<br />
下面的示例说明了为什么要显式声明数据类型：<br />
Sub test()<br />
Dim lVar As Long<br />
Dim vVar<br />
lVar = 10000000<br />
vVar = 10000000<br />
MsgBox LenB(lVar) &#8216;返回4<br />
MsgBox LenB(vVar)&#8217;返回16<br />
End Sub<br />
很显然，Variant类型变量比强制声明的类型变量要占用更多的内存。</p>
<p>2.5 格式化字符串<br />
可以使用Format函数规定输出的字符串的格式，其语法为：<br />
Format(expression[,format[,firstdayofweek[,firstweekofyear]]])<br />
其中，参数expression必须，为任何有效的表达式；其余参数均可选。参数format表示所要采用的格式，参数firstdayofweek使用常数，表示一星期的第一天，参数firstweekofyear使用常数，表示一年的第一周。<br />
在参数format中，使用字符“@”，表示空格或字符占位符，如果在输入的字符串相应位置有字符，则显示该字符，否则显示空格；使用字符“&amp;”，表示空或字符占位符，如果在输入的字符串的相应位置有字符，则显示该字符，否则不显示；使用字符“&lt;”，则将所有字符显示为小写格式；使用字符“&gt;”，则将所有字符显示为大写格式；使用字符“！”，强制占位符从左向右填满， 满足默认为从右向左。<br />
例如下面的代码：<br />
Dim strOut<br />
strOut = Format(&#8220;8888888&#8243;, &#8220;(@@@)&amp;&amp;&amp;-&amp;&amp;&amp;&amp;&#8221;) &#8216;返回( )888-8888<br />
strOut = Format(&#8220;8888888&#8243;, &#8220;(&amp;&amp;&amp;)&amp;&amp;&amp;-&amp;&amp;&amp;&amp;&#8221;) &#8216;返回()888-8888<br />
在Format函数中，还可以同时格式化普通字符串和空字符串，只须在指定的格式中用分号隔开两个部分，第一部分用于非空字符串，第二部分用于空字符串。例如：<br />
strOut = Format(&#8220;6666666&#8243;, &#8220;(@@@)&amp;&amp;&amp;-&amp;&amp;&amp;&amp;;No Phone&#8221;) &#8216;返回( )666-6666<br />
strOut = Format(&#8220;&#8221;, &#8220;(@@@)&amp;&amp;&amp;-&amp;&amp;&amp;&amp;;No Phone&#8221;) &#8216;返回No Phone<br />
又如，下面的代码将字母全部转换为大写：<br />
Dim strOut<br />
strOut = Format(&#8220;Hello&#8221;, &#8220;&gt;@@@@@&#8221;) ‘返回HELLO<br />
同理，可以使用“&lt;”将字母全部转换为小写。<br />
Format函数的简要使用规则：<br />
(1) 允许用预先定义或用户定义的格式来建立多种用于输出字符串、数字和日期/时间数据的方法。<br />
(2) 创建用户定义的数值格式最多可以有四个部分，每个部分代表一种不同类型的数值，且用分号分隔。第一部分在单独命名使用时可用于所有值，与其它多个部分一起使用时只用于正数；第二部分用于负数；第三部分用于零值；第四部分用于Null值。<br />
在参数format中不必包括所有四部分，但所用部分的数目决定了每一个部分所定义的数值类型：只有一个部分，则应用于所有数值；有两个部分，则第一部分应用于正数和零值，第二部分应用于负数；有三个部分，则第一部分用于正数，第二部分应用于负数，第三部分应用于零值；有四个部分，则每部分的使用如前所述。<br />
如果忽略了一个部分，则该部分使用与定义正数的部分一样的格式，例如：<br />
“#.00;;#,##”<br />
表示负数值与正数值使用同一种格式显示。<br />
如果参数含有命名格式，则只能有一个部分。<br />
(3) 字符串值的用户定义格式有两个部分，第一部分可应用于所有值，第二部分只应用于Null值或零长字符串。<br />
(4) 预定义的日期和时间格式如下：<br />
General Date<br />
范例： Format(&#8220;28/02/2007&#8243;,&#8221;General Date&#8221;)<br />
返回： 2007-2-28<br />
Long Date<br />
范例： Format(&#8220;28/02/2007&#8243;,&#8221;Long Date&#8221;)<br />
返回： 2007年2月28日<br />
Medium Date<br />
范例： Format(&#8220;28/02/2007&#8243;,&#8221;Medium Date&#8221;)<br />
返回： 07-02-28<br />
Short Date<br />
范例： Format(&#8220;28/02/2007&#8243;,&#8221;Short Date&#8221;)<br />
返回： 2007-2-28<br />
Long Time<br />
范例： Format(&#8220;17:30:03&#8243;,&#8221;Long Time&#8221;)<br />
返回： 17:30:03<br />
Medium Time<br />
范例： Format(&#8220;17:30:03&#8243;,&#8221;Medium Time&#8221;)<br />
返回： 下午 05:30<br />
Short Time<br />
范例： Format(&#8220;17:30:03&#8243;,&#8221;Short Time&#8221;)<br />
返回： 17:30<br />
(5) 预定义的数值格式如下：<br />
General Number<br />
范例： Format(123456.0789,&#8221;General Number&#8221;)<br />
返回： 123456.0789<br />
Currency<br />
范例： Format(123456.0789,&#8221;Currency&#8221;)<br />
返回： ￥123,456.08<br />
Fixed<br />
范例： Format(0.2,&#8221;Fixed&#8221;)<br />
返回： 0.20<br />
Standard<br />
范例： Format(123456.0789,&#8221;Standard&#8221;)<br />
返回： 123,456.08<br />
Percent<br />
范例： Format(.7321,&#8221;Percent&#8221;)<br />
返回： 73.21%<br />
Scientific<br />
范例： Format(123456.0789,&#8221;Scientific&#8221;)<br />
返回： 1.23E+05<br />
Yes/No<br />
范例1： Format(0,&#8221;Yes/No&#8221;)<br />
返回： No<br />
范例2： Format(23,&#8221;Yes/No&#8221;)<br />
返回： Yes<br />
True/False<br />
范例1： Format(0,&#8221;True/False&#8221;)<br />
返回： False<br />
范例2： Format(23,&#8221;True/False&#8221;)<br />
返回： True<br />
On/Off<br />
范例1： Format(0,&#8221;On/Off&#8221;)<br />
返回： Off<br />
范例2： Format(23,&#8221;On/Off&#8221;)<br />
返回： On<br />
(6) 创建用户自定义的日期和时间格式的字符：<br />
C<br />
元素：日期<br />
显示：基于当前Windows系统的短日期和短时间国际设置格式的日期或时间。<br />
范例：Format(&#8220;28/02/2007 17:30:03&#8243;,&#8221;c&#8221;)<br />
返回：2007-2-28 17:30:03<br />
dddddd<br />
元素：日期<br />
显示：基于当前Windows系统的长日期国际设置格式的完整日期。<br />
范例：Format(&#8220;28/02/2007&#8243;,&#8221;dddddd&#8221;)<br />
返回：2007年2月28日<br />
/<br />
元素：日期分隔符<br />
范例：Format(&#8220;28/02/2007&#8243;,&#8221;mm-dd-yyyy&#8221;)<br />
返回：02-28-2007<br />
d<br />
元素：日<br />
显示：1～31范围内的一个数字，无前导0。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;d&#8221;)<br />
返回：2<br />
dd<br />
元素：日<br />
显示：01～31范围内的一个数字，有前导0。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;dd&#8221;)<br />
返回：02<br />
ddd<br />
元素：日<br />
显示：英文简写(Sun～Sat)<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;ddd&#8221;)<br />
返回：Fri<br />
dddd<br />
元素：日<br />
显示：英文全称(Sunday～Saturday)<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;dddd&#8221;)<br />
返回：Friday<br />
ddddd<br />
元素：日期<br />
显示：基于计算机Windows国际设置短日期格式的日期。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;ddddd&#8221;)<br />
返回：2007-2-2<br />
h<br />
元素：小时<br />
显示：0～23范围内的一个数字，无前导0。<br />
范例：Format(&#8220;05:08:06&#8243;,&#8221;h&#8221;)<br />
返回：5<br />
hh<br />
元素：小时<br />
显示：00～23范围内的一个数字，有前导0。<br />
范例：Format(&#8220;05:08:06&#8243;,&#8221;hh&#8221;)<br />
返回：05<br />
n<br />
元素：分<br />
显示：0～59范围内的一个数字，无前导0。<br />
范例：Format(&#8220;05:08:06&#8243;,&#8221;n&#8221;)<br />
返回：8<br />
nn<br />
元素：分<br />
显示：00～59范围内的一个数字，有前导0。<br />
范例：Format(&#8220;05:08:06&#8243;,&#8221;nn&#8221;)<br />
返回：08<br />
s<br />
元素：秒<br />
显示：0～59范围内的一个数字，无前导0。<br />
范例：Format(&#8220;05:08:06&#8243;,&#8221;s&#8221;)<br />
返回：6<br />
ss<br />
元素：秒<br />
显示：00～59范围内的一个数字，有前导0。<br />
范例：Format(&#8220;05:08:06&#8243;,&#8221;ss&#8221;)<br />
返回：06<br />
ttttt<br />
元素：时间<br />
显示：基于12小时制的时间，包含Windows区域设置中指定的时间分隔符和前导0。<br />
范例：Format(&#8220;05:08:06&#8243;,&#8221;ttttt&#8221;)<br />
返回：5:08:06<br />
AM/PM<br />
元素：时间<br />
显示：用大写的AM和PM表示的12小时制的时钟格式。<br />
范例：Format(&#8220;17:08:06&#8243;,&#8221;hh:mm:ss AM/PM&#8221;)<br />
返回：05:08:06 PM<br />
am/pm<br />
元素：时间<br />
显示：用小写的am和pm表示的12小时制时钟格式。<br />
范例：Format(&#8220;17:08:06&#8243;,&#8221;hh:mm:ss am/pm&#8221;)<br />
返回：05:08:06 pm<br />
A/P<br />
元素：时间<br />
显示：12小时制时钟格式，用大写“A”表示AM，大写“P”表示PM。<br />
范例：Format(&#8220;17:08:06&#8243;,&#8221;hh:mm:ss A/P&#8221;)<br />
返回：05:08:06 P<br />
a/p<br />
元素：时间<br />
显示：12小时制时钟格式，用小写“a”表示am，小写“p”表示pm。<br />
范例：Format(&#8220;17:08:06&#8243;,&#8221;hh:mm:ss a/p&#8221;)<br />
返回：05:08:06 p<br />
：<br />
元素：时间分隔符<br />
显示：时间格式<br />
范例：Format(&#8220;17:08:06&#8243;,&#8221;hh:mm:ss&#8221;)<br />
返回：17:08:06<br />
w<br />
元素：星期几<br />
显示：1～7范围内的一个数字(1～7分别表示星期天到星期六)。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;w&#8221;)<br />
返回：6<br />
ww<br />
元素：周<br />
显示：1～54范围内的一个数字。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;ww&#8221;)<br />
返回：5<br />
m<br />
元素：月<br />
显示：1～12范围内的一个数字，无前导0。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;m&#8221;)<br />
返回：2<br />
mm<br />
元素：月<br />
显示：01～12范围内的一个数字，有前导0。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;mm&#8221;)<br />
返回：02<br />
mmm<br />
元素：月<br />
显示：英文月份简写(Jan～Dec)<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;mmm&#8221;)<br />
返回：Feb<br />
mmmm<br />
元素：月<br />
显示：英文月份全称(January～December)<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;mmmm&#8221;)<br />
返回：February<br />
q<br />
元素：季度<br />
显示：1～4范围内的一个数字<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;q&#8221;)<br />
返回：1<br />
y<br />
元素：一年中的某天<br />
显示：1～366范围内的一个数字。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;y&#8221;)<br />
返回：33<br />
yy<br />
元素：年<br />
显示：00～99范围内的一个两位数字。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;yy&#8221;)<br />
返回：07<br />
yyyy<br />
元素：年<br />
显示：100～9999范围内的一个四位数字。<br />
范例：Format(&#8220;02/02/2007&#8243;,&#8221;yyyy&#8221;)<br />
返回：2007<br />
(7)用于创建用户自定义数字格式的字符<br />
0<br />
说明：数字占位符。如果参数expression所代表的数值在相应的0位置上有一个数字，则显示这个数字，否则显示0。所指定的小数点后的位数，使数值舍入为给定的小数位数，但不影响小数点左边的数字位数。<br />
范例1：Format(23.675,&#8221;00.0000&#8243;) 返回：23.6750<br />
范例2：Format(23.675,&#8221;00.00&#8243;) 返回：23.68<br />
范例3：Format(2345,&#8221;00000&#8243;) 返回：02345<br />
范例4：Format(2345,&#8221;00.00&#8243;) 返回：2345.00<br />
#<br />
说明：数字占位符。如果参数expression所代表的数值在相应的#位置上有一个数字，则显示这个数字，否则什么也不显示。<br />
范例1：Format(23.675,&#8221;##.##&#8221;) 返回：23.68<br />
范例2：Format(23.675,&#8221;##.####&#8221;) 返回：23.675<br />
范例3：Format(12345.25,&#8221;#,###.##&#8221;) 返回：12,345.25<br />
.<br />
说明：小数点占位符。小数点占位符实际显示的字符由本机Windows系统国际设置格式决定。<br />
%<br />
说明：百分数占位符。首先将参数expression所代表的数值乘以100，然后把它作为百分数显示。<br />
范例：Format(0.25,&#8221;##.00%&#8221;) 返回：25.00%<br />
，<br />
说明：千位分隔符。实际显示的字符由本机Windows系统国际设置格式决定。在格式定义中只需要给出一个千位分隔符。<br />
范例：Format(1000000,&#8221;#,###&#8221;) 返回：1,000,000<br />
E-E+ e-e+<br />
说明：科学计数法格式。如果格式表达式在E-、E+或e-、e+的右边至少有一个数字占位符(0或#)，数字就以科学计数法格式显示数字，参数Format中所用的字母E或e在该数字和它的指数之间显示。右边的数字占位符数目决定了要在指数中显示的位数。使用E-或e-可以在负指数前插入一个减号，使用E+或e+可以在正指数前插入一个正号。<br />
范例：Format(1.09837555,&#8221;######E-###&#8221;) 返回：109838E-5<br />
-+$<br />
说明：显示一个直接量字符。<br />
范例：Format(2345.25,&#8221;$#,###.##&#8221;) 返回：$2,345.25<br />
\<br />
说明：反斜杠后的字符以直接量字符显示。可以用反斜杠将某个特定格式的字符以直接量字符显示。<br />
范例：Format(0.25,&#8221;##.##\%&#8221;) 返回：.25%<br />
(8) 用于创建用户自定义字符串格式的字符<br />
@<br />
说明：字符占位符。如果expression在相应的@位置上有一个字符，就显示这个字符，否则显示一个空格。<br />
范例：Format(&#8220;VBA&#8221;,&#8221;\*@\*@@@@@&#8221;) 返回：* * VBA<br />
&amp;<br />
说明：字符占位符。如果expression在相应的&amp;位置上有一个字符，就显示这个字符，否则什么也不显示。<br />
范例：Format(&#8220;VBA&#8221;,&#8221;\*&amp;&amp;\*&amp;&amp;&amp;&amp;&#8221;) 返回：**VBA<br />
&lt;<br />
说明：用小写形式显示所有字符。<br />
范例：Format(&#8220;VBA&#8221;,&#8221;&lt;&#8221;) 返回：vba &gt;<br />
说明：用大写形式显示所有字符。<br />
范例：Format(&#8220;vba&#8221;,&#8221;&gt;&#8221;) 返回：VBA<br />
！<br />
说明：从左向右处理占位符(缺省情况为从右向左处理占位符)。<br />
[编程方法和技巧]<br />
(1) 使用没有格式定义的Format函数格式化数字比使用Str函数格式化数字更好。Format函数与Str函数不同，它会把正数中一般保留用于表示符号的前导空格清除掉。<br />
(2) 可以使用Format函数以1000为单位对数字进行标度，做法是在语句中小数点的左边用一个千位分隔符(，)表示标度数字的一个千位；可以使用多个千位分隔符。例如：<br />
Format(1000000,&#8221;##0,.&#8221;) 返回：1000.<br />
Format(1000000,&#8221;##0,,.&#8221;) 返回：1.<br />
2.6 查找字符串<br />
2.6.1 InStr函数<br />
可使用InStr函数返回一字符串在另一字符串中的位置，因此，也可以使用该函数确定一个字符串中是否包含有另一个字符串。其语法为：<br />
InStr([Start,]string1,string2[,compare])<br />
其中，参数Start为可选参数，设置查找的起点，如果省略，则从第一个字符的位置开始查找，当指定了参数Compare时，则要指定此参数。参数string1为被查找的字符串，参数string2为要查找的字符串，这两个参数都是必需的。<br />
如果在String1中没有找到String2，返回0；如果找到String2，则返回String2第一个出现的首字符位置(即1到String1的长度)；如果String2的长度为零，返回Start。<br />
可看看下面的示例：<br />
Sub test()<br />
Dim SearchString, SearchChar, MyPos<br />
SearchString = &#8220;XXpXXpXXPXXP&#8221; &#8216;被搜索的字符串<br />
SearchChar = &#8220;P&#8221; &#8216;要查找字符串 &#8220;P&#8221;<br />
&#8216;从第四个字符开始，以文本比较的方式找起，返回值为 6(小写 p)<br />
&#8216;小写 p 和大写 P 在文本比较下是一样的<br />
MyPos = InStr(4, SearchString, SearchChar, 1)<br />
Debug.Print MyPos<br />
&#8216;从第一个字符开使，以二进制比较的方式找起，返回值为 9(大写 P)<br />
&#8216;小写 p 和大写 P 在二进制比较下是不一样的<br />
MyPos = InStr(1, SearchString, SearchChar, 0)<br />
Debug.Print MyPos<br />
&#8216;缺省的比对方式为二进制比较(最后一个参数可省略)<br />
MyPos = InStr(SearchString, SearchChar) &#8216;返回 9<br />
Debug.Print MyPos<br />
MyPos = InStr(1, SearchString, &#8220;W&#8221;) &#8216;返回 0<br />
Debug.Print MyPos<br />
End Sub<br />
2.6.2 InStrRev函数<br />
也可以使用InStrRev函数返回一个字符串在另一个字符串中出现的位置，与InStr函数不同的是，从字符串的末尾算起。其语法为：<br />
InStrRev(String1,String2[,[Start[,compare])<br />
参数String1为被查找的字符串，参数String2为要查找的字符串，这两个参数都是必需的。参数Start为可选参数，设置每次查找开始的位置，若忽略则使用-1，表示从上一个字符位置开始查找。参数Compare为可选参数，表示所使用的比较方法，如果忽略则执行二进制比较。<br />
下面的示例使用了InStr函数和InStrRev函数，相应的结果不同：<br />
Sub test()<br />
Dim myString As String<br />
Dim sSearch As String<br />
myString = &#8220;I like the functionality that InsStrRev gives&#8221;<br />
sSearch = &#8220;th&#8221;<br />
Debug.Print InStr(myString, sSearch) &#8216;返回8<br />
Debug.Print InStrRev(myString, sSearch) &#8216;返回26<br />
End Sub<br />
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; -<br />
2.7 提取字符/字符串<br />
2.7.1 Left函数<br />
Left函数可以从字符串的左边开始提取字符或指定长度的字符串，即返回包含字符串中从左边算起指定数量的字符。其语法为：<br />
Left(String,CharNum)<br />
其中，如果参数String包含Null，则返回Null；如果参数CharNum的值大于或等于String的字符数，则返回整个字符串。<br />
例如，下面的代码返回指定字符串的前两个字符：<br />
strLeft=Left(“This is a pig.”，2)<br />
Left函数与InStr函数结合，返回指定字符串的第一个词，例如下面的代码：<br />
str = &#8220;This is a pig.&#8221;<br />
FirstWord = Left(str, InStr(str, &#8221; &#8220;) &#8211; 1)<br />
2.7.2 Right函数<br />
与Left函数不同的是，Right函数从字符串的右边开始提取字符或指定长度的字符串，即返回包含字符串中从右边起指定数量的字符。其语法为：<br />
Right(String,CharNum)<br />
例如：<br />
AnyString = &#8220;Hello World&#8221; &#8216; 定义字符串<br />
MyStr = Right(AnyString, 1) &#8216; 返回 &#8220;d&#8221;<br />
MyStr = Right(AnyString, 6) &#8216; 返回 &#8221; World&#8221;<br />
MyStr = Right(AnyString, 20) &#8216; 返回 &#8220;Hello World&#8221;<br />
如果存放文件名的字符串中没有反斜杠(\)，下面的代码将反斜杠(\)添加到该字符串中：<br />
If Right(strFileName,1) &lt;&gt; “” Then<br />
strFileName=strFileName &amp; “\”<br />
End If<br />
下面的函数假设传递给它的参数或者是文件名，或者是包含完整路径的文件名，从字符串的末尾开始返回文件名。<br />
Private Function ParseFileName(strFullPath As String)<br />
Dim lngPos As Long, lngStart As Long<br />
Dim strFilename As String<br />
lngStart = 1<br />
Do<br />
lngPos = InStr(lngStart, strFullPath, &#8220;\&#8221;)<br />
If lngPos = 0 Then<br />
strFilename = Right(strFullPath, Len(strFullPath) &#8211; lngStart + 1)<br />
Else<br />
lngStart = lngPos + 1<br />
End If<br />
Loop While lngPos &gt; 0<br />
ParseFileName = strFilename<br />
End Function<br />
2.7.3 Mid函数<br />
Mid函数可以从字符串中提取任何指定的子字符串，返回包含字符串中指定数量的字符的字符串。其语法为：<br />
Mid(String,Start[,Len])<br />
其中，如果参数String包含Null，则返回Null；如果参数Start超过了String的字符数，则返回零长度字符串(“”)；如果参数Len省略或超过了文本的字符数，则返回字符串从Start到最后的所有字符。<br />
例如，下面的代码：<br />
Str=Mid(“This is a pig.”,6,2)<br />
将返回文本“is”。<br />
下面的代码：<br />
MyString = &#8220;Mid Function Demo&#8221; &#8216;建立一个字符串<br />
FirstWord = Mid(MyString, 1, 3) &#8216;返回 &#8220;Mid&#8221;<br />
LastWord = Mid(MyString, 14, 4) &#8216;返回 &#8220;Demo&#8221;<br />
MidWords = Mid(MyString, 5) &#8216;返回 &#8220;Funcion Demo&#8221;<br />
Mid函数常用于在字符串中循环，例如，下面的代码将逐个输出字符：<br />
Dim str As String<br />
Dim i As Integer<br />
Str=”Print Out each Character”<br />
For i=1 to Len(str)<br />
Debug.Print Mid(str,i,1)<br />
Next i<br />
2.7.4 Mid语句<br />
Mid语句可以用另一个字符串中的字符替换某字符串中指定数量的字符。其语法为：<br />
Mid(Stringvar,Start[,Len])=string<br />
其中，参数Stringvar代表为要被更改的字符串；参数Start表示被替换的字符开头位置；参数Len表示被替换的字符数，若省略则全部使用string；参数string表示进行替换的字符串。<br />
被替换的字符数量总小于或等于Stringvar的字符数；如果string的数量大于Len所指定的数量，则只取string的部分字符。示例如下：<br />
MyString = &#8220;The dog jumps&#8221; &#8216; 设置字符串初值<br />
Mid(MyString, 5, 3) = &#8220;fox&#8221; &#8216; MyString = &#8220;The fox jumps&#8221;<br />
Mid(MyString, 5) = &#8220;cow&#8221; &#8216; MyString = &#8220;The cow jumps&#8221;<br />
Mid(MyString, 5) = &#8220;cow jumped over&#8221; &#8216; MyString = &#8220;The cow jumpe&#8221;<br />
Mid(MyString, 5, 3) = &#8220;duck&#8221; &#8216; MyString = &#8220;The duc jumpe&#8221;<br />
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; -<br />
2.8 删除空格<br />
LTrim函数删除字符串前面的空格；<br />
RTrim函数删除字符串后面的空格；<br />
Trim函数删除两头的空格。<br />
示例如下：<br />
MyString = &#8221; &lt;-Trim-&gt; &#8221; &#8216; 设置字符串初值<br />
TrimString = LTrim(MyString) &#8216; TrimString = &#8220;&lt;-Trim-&gt; &#8221;<br />
TrimString = RTrim(MyString) &#8216; TrimString = &#8221; &lt;-Trim-&gt;&#8221;<br />
TrimString = LTrim(RTrim(MyString)) &#8216; TrimString = &#8220;&lt;-Trim-&gt;&#8221;<br />
&#8216; 只使用 Trim 函数也同样将两头空格去除<br />
TrimString = Trim(MyString) &#8216; TrimString = &#8220;&lt;-Trim-&gt;&#8221;<br />
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; -<br />
2.9 返回字符代码<br />
Asc函数返回指定字符串表达式中第一个字符的字符代码。示例如下：<br />
MyNumber = Asc(&#8220;A&#8221;) &#8216; 返回 65<br />
MyNumber = Asc(&#8220;a&#8221;) &#8216; 返回 97<br />
MyNumber = Asc(&#8220;Apple&#8221;) &#8216; 返回 65<br />
[编程方法和技巧]<br />
(1) 在数据验证中用Asc来决定一些条件，如第一个字符是大写还是小写、是字母还是数字。<br />
Private Sub CommandButton1_Click()<br />
Dim sTest As String<br />
Dim iChar As Integer<br />
sTest = TextBox1.Text<br />
If Len(sTest) &gt; 0 Then<br />
iChar = Asc(sTest)<br />
If iChar &gt;= 65 And iChar &lt;= 90 Then MsgBox &#8220;第一个字符是大写&#8221; ElseIf iChar &gt;= 97 And iChar &lt;= 122 Then MsgBox &#8220;第一个字符是小写&#8221; Else MsgBox &#8220;第一个字符不是字母&#8221; End If Else MsgBox &#8220;请在文本框中输入&#8221; 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 = &#8220;fanjy&#8221; For i = 1 To Len(MyName) MyEncryptedString = MyEncryptedString &amp; Chr(Asc(Mid(MyName, i, 1)) + 25) Next i MsgBox &#8220;您好!我的名字是&#8221; &amp; MyEncryptedString For i = 1 To Len(MyName) MyDecryptedString = MyDecryptedString &amp; Chr(Asc(Mid(MyEncryptedString, i, 1)) &#8211; 25) Next i MsgBox &#8220;您好!我的名字是&#8221; &amp; MyDecryptedString End Sub &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; 2.10 返回数值代表的相应字符 Chr函数返回指定字符码所代表的字符，其语法为： Chr(charcode) 其中参数charcode代表字符码，一般为0～255。例如： MyChar = Chr(65) &#8216; 返回 A MyChar = Chr(97) &#8216; 返回 a MyChar = Chr(62) &#8216; 返回 &gt;<br />
MyChar = Chr(37) &#8216; 返回 %<br />
[编程方法和技巧]<br />
(1) 使用Chr(34)将引号嵌入字符串，如<br />
Chr(34) &amp; sString &amp; Chr(34)<br />
(2) 下面列出了在调用Chr函数时比较常用的字符代码：<br />
代码 值 描述<br />
0 Null 相当于vbNullChar常数<br />
8 BS 相当于vbBack常数<br />
9 TAB 相当于vbTab常数<br />
10 CR 相当于vbCr和vbCrLf常数<br />
13 LF 相当于vbLf和vbCrLf常数<br />
34 “” 引号<br />
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; -<br />
2.11 使用字节的函数<br />
VBA中返回字符串的函数有两种格式，一种以$结尾，返回字符串，不需要进行类型转换，所以速度较快，但如果输入值是包含Null的Viarant，则会发生运行错误；一种没有$，返回Viarant数据类型，如果输入值是包含Null的Viarant，则返回Null。因而，如果要使得程序运行速度快，则使用带有$的函数且要避免向这些函数传递空值。<br />
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; -<br />
2.12 返回数组的函数<br />
2.12.1 Filter函数<br />
Filter函数返回一个下标从零开始的数组，该数组包含基于指定筛选条件的一个字符串数组的子集。其语法为：<br />
Filter(sourcearray,match[,include[,compare]])<br />
其中，参数sourcearray必需，是要执行搜索的一维字符串数组；参数match必需，是要搜索的字符串；参数include可选，Boolean值，表示返回子串包含还是不包含match字符串，如果include为True，返回包含match子字符串的数组子集，如果include为False，返回不包含match子字符串的数组子集；参数compare可选，表示所使用的字符串比较类型，其设置值为：-1(常数为vbUseCompareOption)表示使用Option Compare语句的设置值来执行比较；0(常数为vbBinaryCompare)表示执行二进制比较；1(常数为vbTextCompare)表示执行文字比较；2(常数为vbDatabaseCompare)只用于Microsoft Access，表示基于数据库信息来执行比较。<br />
如果在sourcearray中没有发现与match相匹配的值，Filter函数返回一个空数组；如果sourcearray是Null或不是一个一维数组，则产生错误。<br />
Filter函数所返回的数组，其元素数是所找到的匹配项目数。<br />
[编程方法和技巧]<br />
(1) Filter函数也可以过滤数字值。此时，应指定Variant类型的字符串sourcearray，并用数字值给数组赋值。同时，也可以将字符串、Variant、Long或Integer数据传递给match。但应注意，返回的字符串表现为被过滤数字的字符串的形式。例如：<br />
Sub test()<br />
Dim varSource As Variant, varResult As Variant<br />
Dim strMatch As String, i<br />
strMatch = CStr(2)<br />
varSource = Array(10, 20, 30, 21, 22, 32)<br />
varResult = Filter(varSource, strMatch, True, vbBinaryCompare)<br />
For Each i In varResult<br />
Debug.Print i<br />
Next<br />
End Sub<br />
将返回20，21，22，32<br />
(2) Filter函数可以和Dictionary对象很好地配合使用。可以把Dictionary对象产生的Key值作为一种过滤Dictionary对象成员的快速方法传递给Filter函数，如：<br />
Sub test()<br />
Dim i As Integer<br />
Dim sKeys() As Variant<br />
Dim sFiltered() As String<br />
Dim sMatch As String<br />
Dim blnSwitch As Boolean<br />
Dim oDict As Dictionary<br />
Set oDict = New Dictionary<br />
oDict.Add &#8220;Microsoft&#8221;, &#8220;One Microsoft Way&#8221;<br />
oDict.Add &#8220;AnyMicro Inc&#8221;, &#8220;31 Harbour Drive&#8221;<br />
oDict.Add &#8220;Landbor Data&#8221;, &#8220;The Plaza&#8221;<br />
oDict.Add &#8220;Micron Co.&#8221;, &#8220;999 Pleasant View&#8221;<br />
sKeys = oDict.Keys<br />
sMatch = &#8220;micro&#8221;<br />
blnSwitch = True<br />
&#8216;寻找包含字符串macro(不区分大小写)的所有键<br />
sFiltered() = Filter(sKeys, sMatch, blnSwitch, vbTextCompare)<br />
For i = 1 To UBound(sFiltered)<br />
Debug.Print sFiltered(i) &amp; &#8220;,&#8221; &amp; oDict.Item(sFiltered(i))<br />
Next i<br />
End Sub<br />
2.12.2 Split函数<br />
Split函数返回一个下标从零开始的一维数组，包含指定数目的子字符串。其语法为：<br />
Split(expression[,delimiter[,limit[,compare]]])<br />
其中，参数expression必需，表示包含子字符串和分隔符的字符串，若expression是一个长度为零的字符串(“”)，该函数则返回一个没有元素和数据的空数组；参数delimiter用于标识子字符串边界的字符串字符，若忽略则使用空格(“ “)作为分隔符，若是一个长度为零的字符串则返回仅包含一个元素的数组，该元素是expression所表示的字符串；参数limit表示要返回的子字符串数，-1表示返回所有的子字符串；参数compare表示判别子字符串时使用的比较方式，其值与Filter函数的设置值相同。<br />
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; -<br />
2.13 连接字符串<br />
Join函数返回连接某数组中的多个子字符串而组成的字符串，即将数组中的字符串连接起来。其语法为：<br />
Join(sourcearray[，delimiter])<br />
其中，参数sourcearray必需，是包含被连接子字符串的一维数组；参数delimiter可选，代表在所返回的字符串中用于分隔子字符串的字符，若忽略则使用空(“ ”)来分隔，若为零长字符串(“”)，则所有项目都连接在一起，中间没有分隔符。<br />
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; -<br />
2.14 替换字符串<br />
Replace函数返回一个被替换了的字符串，该字符串中指定的子字符串已被替换成另一个子字符串，并且替换指定次数。其语法为：<br />
Replace(expression,find,replace[,start[,count[,compare]]])<br />
其中，参数expression必需，表示所要替换的子字符串；参数find必需，表示要搜索到的子字符串；参数replace必需，表示用来替换的子字符串；参数start表示开始搜索的位置，若忽略，则从1开始；参数count表示进行替换的次数，缺省值是-1，表示进行所有可能的替换；参数compare表示判别子字符串时所用的比较方式，与Filter函数的设置值相同。<br />
如果expression的长度为零，Replace返回零长度字符串(“”)；如果expression为Null，则返回错误；如果find的长度为零，则返回expression的副本；如果replace的长度为零，则返回删除了所有出现find的字符串的副本；如果start的值大于expression的长度，则返回长度为零的字符串；如果count为0，则返回expression的副本。<br />
Replace函数返回的字符串是从参数start所指定的位置开始到expression结尾已经进行过替换的字符串。<br />
注意：<br />
(1) 如果没有使用参数count，那么当替换较短字符串时就要注意，防止形成一个不相关的字符。<br />
(2) 如果start值大于1，返回的字符串将从start开始，而不是从原有字符串的第一个字符开始。<br />
- &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211; -<br />
2.15 反向字符串<br />
StrReverse函数返回与指定字符串顺序相反的字符串，其语法为：<br />
StrReverse(expression)<br />
其中，参数expression是一个字符串，应用StrReverse函数后将返回与该字符串顺序相反的字符串。如果expression是一个长度为零的字符串(“”)，则返回一个长度为零的字符串；如果expression为Null，则产生一个错误。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/79/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VB 判断手机号码</title>
		<link>http://blog.oipop.com/archives/50</link>
		<comments>http://blog.oipop.com/archives/50#comments</comments>
		<pubDate>Mon, 10 Aug 2009 07:24:50 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[杂七杂八]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=50</guid>
		<description><![CDATA[记得引用MS VBS
Function IsPhone(ByVal s As String) As Boolean
    Dim re As Regexp
    Set re = New Regexp
    re.IgnoreCase = False  &#8216;设置是否匹配大小写
    re.Pattern = &#8220;^861[3&#124;5&#124;8]\d{9}$&#8221;
    IsPhone = re.Test(s)
End Function
]]></description>
			<content:encoded><![CDATA[<p>记得引用MS VBS</p>
<p>Function IsPhone(ByVal s As String) As Boolean<br />
    Dim re As Regexp<br />
    Set re = New Regexp<br />
    re.IgnoreCase = False  &#8216;设置是否匹配大小写<br />
    re.Pattern = &#8220;^861[3|5|8]\d{9}$&#8221;<br />
    IsPhone = re.Test(s)<br />
End Function</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/50/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VB 半透明窗体(可让控件不闪烁)</title>
		<link>http://blog.oipop.com/archives/36</link>
		<comments>http://blog.oipop.com/archives/36#comments</comments>
		<pubDate>Wed, 15 Jul 2009 03:37:09 +0000</pubDate>
		<dc:creator>Kinsta</dc:creator>
				<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://blog.oipop.com/?p=36</guid>
		<description><![CDATA[函数SetLayeredWindowAttributes
　　使用这个函数，可以轻松的实现半透明窗体。按照微软的要求，透明窗体窗体在创建时应使用WS_EX_LAYERED参数（用CreateWindowEx），或者在创建后设置该参数（用SetWindowLong），我选用后者。全部函数、常量声明如下：
Private Declare Function GetWindowLong Lib &#8220;user32&#8243; Alias &#8220;GetWindowLongA&#8221; (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib &#8220;user32&#8243; Alias &#8220;SetWindowLongA&#8221; (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib &#8220;user32&#8243; (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As [...]]]></description>
			<content:encoded><![CDATA[<p>函数SetLayeredWindowAttributes<br />
　　使用这个函数，可以轻松的实现半透明窗体。按照微软的要求，透明窗体窗体在创建时应使用WS_EX_LAYERED参数（用CreateWindowEx），或者在创建后设置该参数（用SetWindowLong），我选用后者。全部函数、常量声明如下：<br />
Private Declare Function GetWindowLong Lib &#8220;user32&#8243; Alias &#8220;GetWindowLongA&#8221; (ByVal hwnd As Long, ByVal nIndex As Long) As Long<br />
Private Declare Function SetWindowLong Lib &#8220;user32&#8243; Alias &#8220;SetWindowLongA&#8221; (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long<br />
Private Declare Function SetLayeredWindowAttributes Lib &#8220;user32&#8243; (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long</p>
<p><span id="more-36"></span><br />
　 　其中hwnd是透明窗体的句柄，crKey为颜色值，bAlpha是透明度，取值范围是[0,255]，dwFlags是透明方式，可以取两个值：当取值为LWA_ALPHA时，crKey参数无效，bAlpha参数有效；当取值为LWA_COLORKEY时，bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明－－这个功能很有用：我们不必再为建立不规则形状的窗体而调用一大堆区域分析、创建、合并函数了，只需指定透明处的颜色值即可，哈哈哈哈！请看具体代码。<br />
Private Const WS_EX_LAYERED = &amp;H80000<br />
Private Const GWL_EXSTYLE = (-20)<br />
Private Const LWA_ALPHA = &amp;H2<br />
Private Const LWA_COLORKEY = &amp;H1<br />
代码一：一个半透明窗体<br />
Private Sub Form_Load()<br />
　　Dim rtn As Long<br />
　　rtn = GetWindowLong(hwnd, GWL_EXSTYLE)<br />
　　rtn = rtn Or WS_EX_LAYERED<br />
　　SetWindowLong hwnd, GWL_EXSTYLE, rtn<br />
　　SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA<br />
End Sub</p>
<p>代码二：形状不规则的窗体<br />
Private Sub Form_Load()<br />
　　Dim rtn As Long<br />
　　BorderStyler=0<br />
　　rtn = GetWindowLong(hwnd, GWL_EXSTYLE)<br />
　　rtn = rtn Or WS_EX_LAYERED<br />
　　SetWindowLong hwnd, GWL_EXSTYLE, rtn<br />
　　SetLayeredWindowAttributes hwnd, &amp;HFF0000, 0, LWA_COLORKEY &#8216;将扣去窗口中的蓝色<br />
End Sub<a href="http://www.oipop.com/catalog.asp?tags=VISUAL+BASIC"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oipop.com/archives/36/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
