一
VBA FileSystemObject 用户定义类型未定义
以下VB代码,产生编译错误:用户定义类型未定义
Dim fso As New FileSystemObject, fil As FileListBox
Set fil = fso.createtextfile("c:/sam.txt", True)
产生原因:使用FileSystemObject但未引用Microsoft Scripting Runtime
解决办法:
FileSystemObject
要先点"工程-->引用-->Microsoft Scripting Runtime"
在Excel VBA使用FileSystemObject的时候,
"Alt + F11"切换到Visual Basic编辑器界面,
在"工具-->引用"中确保勾选"Microsoft Scripting Runtime"
二
创建TextStream对象的方法
http://www.cnblogs.com/winner/archive/2006/03/01/340179.html
创建TextStream对象的方法
有三个常用方法用于创建或打开一个文本文件并返回TextStram对象,如表5-13所示:
表5-13 创建TextStream对象的方法及说明
方 法
说 明
CreateTextFile
(filename,overwrite,unicode)
在磁盘上用指定的文件名filename创建一个新文本文件,并返回一个与该文件对应的TextStream对象。如果可选的overwrite参数设置为True,将覆盖具有同样路径的同名文件。缺省的overwrite是False。如果可选的unicode参数设置为False,该文件的内容将存储为Unicode格式。缺省的unicode是False
OpenTextFile
(filename,iomode,create,format)
打开或创建(如果不存在)一个名为filename的文件,并且返回与该文件对应的TextStream对象。filename参数可以包含绝对或相对路径。iomode参数说明需要的访问类型。容许值是ForReading(1)(缺省)、ForWriting(2)、ForAppending(8)。写入或追加到一个不存在的文件时,如果create参数设置为True,将创建一个新文件。缺省的create是False。format参数说明了读或写文件时的数据格式。容许值是TristateFalse(0)(缺省),说明用ASCII数据格式;TristateTrue(-1)说明用Unicode数据格式;TristateUseDefault(-2)说明数据使用系统缺省的格式
OpenAsTextStream
(iomode,format)
打开一个指定的文件并且返回一个TextStream对象,可用于对该文件的读、写或追加。iomode参数说明了需要的访问类型。容许值是ForReading(1)(缺省)、ForWriting(2)、ForAppending(8)。Format参数说明了读写文件的数据格式。容许值是TristateFalse(0)(缺省),说明用ASCII数据格式;TristateTrue(-1)说明用Unicode数据格式;TristateUseDefault(-2)说明使用系统缺省的格式
上面列出的方法在FileSystemObject、Folder和File对象中的实现有所不同。如表5-14所示:
表5-14 三个对象中包含的方法
方 法
FileSystemObject对象
Folder对象
File对象
CreateTextFile
有
有
有
OpenTextFile
有
无
无
OpenAsTextStream
无
无
有
三、FileSystemObject对象返回的TextStream对象的属性及方法说明:
http://blog.sina.com.cn/s/blog_611f50100100w5vb.html
创建TextStream对象示例:
DimsFileAsObject, fsoAsObjectSetfso = CreateObject("Scripting.FileSystemObject")SetsFile = fso.CreateTextFile("C:\TestFile.txt")
示例中的sFile便为TextStream对象。
(一)TextStream属性:
1、Line属性:只读属性,返回一个TextStream文件中的当前行号。文件初次打开后,在写任何东西之彰,Line的值为1。
语法:object.Line
2、AtEndOfStream属性:只读属性,如果文件指针在TextStream文件末尾,则返回True;否则返回False。
语法:object.AtEndOfStream
3、AtEndOfLine属性:只读属性,如果文件指针在TextStream文件行尾标记的前面,则返回True;否则返回False。
语法:object.AtEndOfLine
(二)TextStream方法:
1、WriteLine方法:写入一个指定的字符和换行符到一个TextStream文件中。
语法:object.WriteLine([string])
Object:必需的。表示一个TextStream对象的名字。
string:可选的。要写入文件的正文。如果省略,一个换行符被写入文件中。
示例:打开一个文本文件并在文本文件中写入一些字符。
SubWriteLine()DimfsoAsObject, sFileAsObjectConstForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0Setfso = CreateObject("Scripting.FileSystemObject")SetsFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForAppending, TristateFalse) sFile.WriteLine "WriteLine Test" sFile.CloseSetfso =NothingSetsFile =NothingEndSub
2、Write方法:写一个指定的字符串到一个TextStream文件中。指定的字符串被写入到文件中,在每个字符串之间没有插入空格或字符。使用WriteLine方法写入一个换行符或一个以换行符为结尾的字符串。
语法:object.Write(string)
object:必需的。为一个TextStream对象的名字。
string:必需的。要写到文件中的字符串。
示例:下列代码将一个字符串写入到文本文件中,并实现与WriteLine方法相同的效果,即加入空格或换行符。
SubWriteTest()DimfsoAsObject, sFileAsObjectConstForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0Setfso = CreateObject("Scripting.FileSystemObject")SetsFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForAppending, TristateFalse) sFile.Write "Write Test" & vbTab & vbCrLf'同时加入一个Tab位及一个换行符sFile.CloseSetfso =NothingSetsFile =NothingEndSub
3、ReadLine方法:从一个TextStream文件读取一整行(到换行符但不包括换行符)并返回得到的字符串。
语法:string=object.ReadLine
string:返回的字符串。
object:一个TextStream对象。
示例:打开一个文本文件,并读取内容。
SubReadLine()DimfsoAsObject, sFileAsObjectConstForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0Setfso = CreateObject("Scripting.FileSystemObject")SetsFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForReading) MsgBox sFile.ReadLine sFile.CloseSetfso =NothingSetsFile =NothingEndSub
4、Read方法:从一个TextStream文件中读取指定数量的字符并返回得到的字符串。
语法:object.Read(characters)
object:必需的。表示为一个TextStream对象的名字。
characters:必需的。从文件中要读取的字符数。
示例:从一个打开的文本文件中读取5个字符。
SubReadTest()DimfsoAsObject, sFileAsObjectConstForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0Setfso = CreateObject("Scripting.FileSystemObject")SetsFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForReading) MsgBox sFile.Read(5) sFile.CloseSetfso =NothingSetsFile =NothingEndSub
5、Close方法:关闭一个打开的TextStream文件。
语法:object.Close
6、WriteBlankLines方法:写入指定数量的换行符到一个TextStream文件中。
语法:object.WriteBlankLines(lines)
object:必需的。指一个TextStream对象的名字。
lines:必需的。要写入的换行符数量。
示例:在一个打开的文本文件中写入两个空行。
SubWriteBlankLines()DimfsoAsObject, sFileAsObjectConstForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0Setfso = CreateObject("Scripting.FileSystemObject")SetsFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForAppending) sFile.WriteBlankLines (2) sFile.CloseSetfso =NothingSetsFile =NothingEndSub
7、SkipLine方法:当读一个TextStream文件时跳过下一行。跳过一个是指读取放弃一行中的所有字符,一直到并包括该行的换行符。如果读的文件没有打开,则产生一个错误。
语法:object.SkipLine
8、Skip方法:当读一个TextStream文件时跳过指定数量的字符。跳过的字符将不被读取。
语法:object.Skip(characters)
object:必需的。表示一个TextStream对象的名字。
characters:必需的。当读文件时要跳过的字符的数量。
四
VBA里就没有Dictionary这种变量类型……没加载前只能先定义为对象,即Object
Dim d As As Object
Set d = CreateObject("Scripting.Dictionary")
五
VBA的转换函数
CBool(expression)
CByte(expression)
CCur(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CSng(expression)
CStr(expression)
CVar(expression)
CStr(expression)
VB中CInt(),Fix(),Int()的区别
CInt(),Int(),Fix()三个函数都能用来对浮点数进行取整运算,但是效果却有很大的差别。
(1)CInt()
CInt(-4.6) CInt(-10.2) CInt(2.5) CInt(1.5) CInt(-3.5) CInt(-4.5)
-5 -10 2 2 -4 -4
CInt的作用四舍五入后取整,如果要取整的浮点数小数部分恰好是0.5的情况,则向最接近的偶数取整。
(2)Fix()
Fix(-4.6) Fix(-10.2) Fix(2.5) Fix(1.5) Fix(-3.5) Fix(-4.5)
-4 -10 2 1 -3 -4
Fix比较容易掌握,Fix的作用是直接舍去小数部分取整。
(3)Int()
Int(-4.6) Int(-10.2) Int(2.5) Int(1.5) Int(-3.5) Int(-4.5)
-5 -11 2 1 -4 -5
Int的作用是对浮点数向下取整,即小于等于这个浮点数的最大整数。
六
VBA用if 或 goto来实现类似c语言中的continue(http://bbs.csdn.net/topics/190112914)
VBA用exit for或exit do 来实现类似c语言中的break (http://zhidao.baidu.com/question/40107002.html)
七
visual basic中选中内容用tab来缩进,用shift + tab 来反缩进。
八
删除文件用kill
九
Do循环语句的几种形式:
1.
Do While i>1 '条件为True时执行
... ... '要执行的语句
Loop
2.
Do Until i>1 '条件为False时执行
... ... '要执行的语句
Loop
3.
Do
... ... '要执行的语句
Loop While i>1 '条件为True时执行
4.
Do
... ... '要执行的语句
Loop Until i>1 '条件为False时执行
5.While...Wend 语句
While i>1 '条件为True时执行
... ... '要执行的语句
Wend
十
LOF函数:
Microsoft Visual Basic 6.0 中,LOF函数将返回某文件的字节数。例如,LOF(1)返回#1文件的长度,如果返回0值,则表示该文件是一个空文件。
十一
输入超出文件尾的错误(错误 62):
1, Input # 或 Line Input # 语句要到已读完文件或空文件中读入数据。
在 Input # 语句之前直接使用 EOF 函数来测试是否处在文件的结尾。
2, 在以 Binary 访问所打开的文件上使用 EOF 函数。
EOF 只能用在顺序 Input 访问所打开的文件上。在 Binary 访问所打开的文件上使用 Seek 和 Loc。
十二
下面这个函数可以将文本文件的数据一次读入到一个字符串(但是若包含中文时会出错,因为一个中文字占2个字节)。
Public Function ReadText(FileName As String)
Dim fnum%, isopen As Boolean
On Error GoTo erro
fnum = FreeFile()
Open FileName For Input As #fnum
isopen = True
ReadText = Input(LOF(fnum), fnum)
erro:
If isopen Then Close #fnum
If err Then Debug.Print err.Number, err.Description
End Function
十三
Replace用法:
http://wenku.baidu.com/view/e2298003eff9aef8941e0626.html
十四
可以用right 和 lift来实现对注释等特殊字符串的剔除
十五
VBA读写文件:
http://blog.csdn.net/inkstone2006/article/details/5704465
十六
'去掉字符串中所有的空格(包括字符中间的空格)
Public Function DeleteSplace(oString As String) As String
'定义DeleteSplace为string,并定义函数中的参数oString类型为String
Dim A As String
DeleteSplace = ""
For I = 1 To Len(oString)
A = Mid(oString, I, 1)
If A <> " " Then
DeleteSplace = DeleteSplace & A
End If
Next
End Function
Len()为提取字符串的字符个数
Mid()提取字符串中的字符
十七
【VBA/VB函数】16进制字符到10进制转换
' '===================================================================================== '16进制字符到10进制转换。 ' 如)"AB"(或"ab")→171 '===================================================================================== ' Public Function HexToLong(ByVal str As String) As Long Dim temp As String temp = "&h" & str '10进制变换 If (IsNumeric(temp) <> True) Then HexToLong = 0 Else HexToLong = CLng(temp) End If End Function
十八
从VBA的开发过程中体会到:
c代码的开发过程中,注释(代码)规范:统一为一行一个注释对“/* */”
十九
文本框回车键换行
1,设置文本框Multiline = true
2,设置文本框Wordwarp = true
3,设置文本框Enterkeybehavior= true
最好加个Scrollbars , vertical为垂直的
二十
用VBA清除文本框里的文字
txtDate.Text=""
cmbWayToPay.Text=""
添加listview控件
到Visual basic 编辑器里右键控件面板--附加控件-选择-micsoft... listview...
二十一
将数字转换为excel中的列所对应的字母
Public Function digi2alpha(ByVal digital As Integer) As String
Dim large As Integer
Dim small As Integer
If digital > 26 Then 'Chr(65) = "A"
large = digital \ 26
small = digital Mod 26
If small <> 0 Then
digi2alpha = Chr(large + 64) & Chr(small + 64)
Else
digi2alpha = Chr(large + 63) & "Z"
End If
ElseIf digital <= 26 Then
digi2alpha = Chr(digital + 64)
End If
'End Function
二十二
VBA帮助文档:
(3003) C:\Program Files\Microsoft Office\OFFICE11\2052路径下以VBA为前缀的chm文件,其中VBSCRIP5.CHM和VBAXL10.CHM我用的多一些。
VBSCRIP5.CHM
。。。
二十三