Excel VBA高级编程:定长字符串

发布: 2009-2-04 11:31  作者: 网络转载  查看: 2282次 共有0条评论

编程:定长串

先来看一段代码:
s = "A"
Debug.Print Len(s) = 1
Debug.Print s = "A"
你是否认为上面的输出必然是两个TRUE,答案自然是否定的。选择从这儿开始,只是为了加深你的印象。
在VBA中,字符串有两种类型,一种是变长的字符串,这是我们常用的,声明的方法可以是下面的写法之一:
Dim s As String
Dim s$
另外一种叫定长字符串,声明的方法如下:
Dim s As String * 2
上面声明了一个长度为2的字符串。
对变长的字符串,在声明后,VBA将自动将其初始化为0长度的空字符串。
Dim s$
s=""
上面两行代码的第二句是写程序的一个好习惯,但却是没有必要的。
变长字符串占用的内存空间由系统动态分配。
来看看定长字符串。
声明定长字符串后,系统将为它分配一个声明长度的字符串,并且在运行期间这个长度不可改变。在被初始化前,定长字符串的各字符用ASCII码为0的字符填充。
Sub aTest()
  Dim i%, s As String * 2
  i = 1 To Len(s)
    Debug.Print Asc(Mid(s, i, 1))
  Next i
End Sub
上面这段代码会在调试窗口输出两个0。
但定长字符串一旦被初始化或被重新赋值,则按这样的规则处理:超过长度的部分将被舍弃,不足的尾部用空格填充(后面会提到,API例外)。
我们在上段代码中加一句s=""看看:
Sub aTest()
  Dim i%, s As String * 2
  s=""
  For i = 1 To Len(s)
    Debug.Print Asc(Mid(s, i, 1))
  Next i
End Sub
将会输出两个32(32是空格的ASCII码)。
同样的,把s=""换成s="ABCD",将会输出65和66,超过长度的“CD”将被舍弃,有兴趣自己试试吧。

作为介绍的结尾,来看几个“定长字符串”的典型用途:
1.修正比较结果
记得上一篇的FILTER函数吧,使用定长字符串来保证完全匹配就是其中的一种方法,例子这里就不举了。


2.作为API函数的传递参数
在使用需要字符串传回参数的API函数时,由于API并不负责象VBA一样随时动态分配存储空间,定长字符串是常用的方法,以保证有足够的长度容纳返回值。如果使用变长的字符串,你需要这样做:
Dim l%
Dim s As String
s = Space(256)
l=GetTempPath(256, s)
也许你会发现,很多专业人士更习惯这样做(我也不知道这样哪里好,可能受C风格的影响吧):
Dim l%
Dim s As String * 256
l=GetTempPath(256, s)
上面这段代码是取得当前系统的临时目录,变量l是函数返回的目录长度,目录名称被保存在字符串s中(l长度以后的内容会保持原来的内容)。如果你想调试上面的代码,需要在模块顶部加上如下API声明:
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
顺便说一下上面的Space函数,在这里它的作用是生成长度为256的全部由空格组成的字符串,类似的函数还有一个String,呵呵,这里String成了函数的名字,String(10, "A")会返回一个由10个“A”组成的字符串。


3.代替Left函数
这个不想细说了,已经说了很多,定长字符串天然的功能,你自己写个代码试试吧,告诉你,速度比Left快10%哦。


4.文件操作
PUT/GET语句的参数是变长字符串时,会写入或读出一个额外的字符串长度,通常这并不符合需要的目的。可以使用定长字符串对变长字符串进行转换。如下面的代码所示。
Sub PGfile()
  Dim i As Long
  Dim s As String
  Dim s1 As String * 1
  s = "Hello"
  Open ThisWorkbook.Path & "\Ls.txt" For Binary As #1
  For i = 1 To Len(s)
    s1 = Mid(s, i)
    Put #1, i, s1
  Next i
  For i = 1 To LOF(1)
    Get #1, i, s1
    Debug.Print s1
  Next i
  Close #1
End Sub

 

相关阅读
大家对 Excel VBA高级编程:定长字符串 的评论
最新PPT教程
最新评论
PPT问答