一
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
DimsFileAsObject, fsoAsObjectSetfso = CreateObject("Scripting.FileSystemObject")SetsFile = fso.CreateTextFile("C:\TestFile.txt")
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
object:必需的。为一个TextStream对象的名字。
string:必需的。要写到文件中的字符串。
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
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
object:必需的。表示为一个TextStream对象的名字。
characters:必需的。从文件中要读取的字符数。
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
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
语法:object.SkipLine
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.youkuaiyun.com/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.youkuaiyun.com/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
。。。
二十三
VBA中类似switch的语句用法:
如:
Select Case Pid
Case “A101”
Price=200
Case “A102”
Price=300
……
Case Else
Price=900
End Select
分析问题主要由于对应参数的类型不符造成的。造成这种情况一般有几种情况:
1。传递参数未定义类型,如果参数在调用前未定义类型,系统自动将它定义为Variant类型,由于与过程或函数中的对就参数类型不相同,所以提示"ByRef参数类型不符"
2。传递参数类型已经定义,但由于定义方法不对,所以提示"ByRef参数类型不符"。具体情况如下:
当VB中如此定义变量时,将会出现以上错误信息的出现
Private Sub Command1_Click()
Dim i , j As Integer
i = 3
j = 4
Call get1(i, j)
Text1.Text = i
End Sub
Private Sub get1(ByRef para1 As Integer, para2 As Integer)
para1 = para1 + para2
End Sub
如将Dim i , j As Integer 改为
Dim i As Integer
Dim i As Integer
程序执行正常。也就是说,第一种方法的变量定义,只是对 J 做了定义,并未对前面的 I 进行定义
一般在过程和函数中定义参数时采用ByRef,则要求参数声明的类型和实际参数的类型完全相同,否则VB就会报告错误.
Dim AnotherVar,Choice As BoolearL,BirthDate As Date
其中AnotherVar的类型为Variant,因为声明时没有指定它的类型。
Dim i As Integer
Dim DecOut As Double
Dim Lenhex As Integer
Dim HexStep As Double
DecOut = 0
If (Mid(Trim(InputData), 1, 2) = "0x") Then
InputData = Mid(Trim(InputData), 3, Len(Trim(InputData)))
End If
InputData = UCase(InputData)
Lenhex = Len(InputData)
For i = 1 To Lenhex
If IsNumeric(Mid(InputData, i, 1)) Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "A" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "B" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "C" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "D" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "E" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "F" Then
GoTo NumOk
Else
MsgBox "This is not hexadecimal!", vbCritical
Exit Function
End If
NumOk:
Next i
HexStep = 0
For i = Lenhex To 1 Step -1
HexStep = HexStep * 16
If HexStep = 0 Then
HexStep = 1
End If
If Mid(InputData, i, 1) = "0" Then
DecOut = DecOut + (0 * HexStep)
ElseIf Mid(InputData, i, 1) = "1" Then
DecOut = DecOut + (1 * HexStep)
ElseIf Mid(InputData, i, 1) = "2" Then
DecOut = DecOut + (2 * HexStep)
ElseIf Mid(InputData, i, 1) = "3" Then
DecOut = DecOut + (3 * HexStep)
ElseIf Mid(InputData, i, 1) = "4" Then
DecOut = DecOut + (4 * HexStep)
ElseIf Mid(InputData, i, 1) = "5" Then
DecOut = DecOut + (5 * HexStep)
ElseIf Mid(InputData, i, 1) = "6" Then
DecOut = DecOut + (6 * HexStep)
ElseIf Mid(InputData, i, 1) = "7" Then
DecOut = DecOut + (7 * HexStep)
ElseIf Mid(InputData, i, 1) = "8" Then
DecOut = DecOut + (8 * HexStep)
ElseIf Mid(InputData, i, 1) = "9" Then
DecOut = DecOut + (9 * HexStep)
ElseIf Mid(InputData, i, 1) = "A" Then
DecOut = DecOut + (10 * HexStep)
ElseIf Mid(InputData, i, 1) = "B" Then
DecOut = DecOut + (11 * HexStep)
ElseIf Mid(InputData, i, 1) = "C" Then
DecOut = DecOut + (12 * HexStep)
ElseIf Mid(InputData, i, 1) = "D" Then
DecOut = DecOut + (13 * HexStep)
ElseIf Mid(InputData, i, 1) = "E" Then
DecOut = DecOut + (14 * HexStep)
ElseIf Mid(InputData, i, 1) = "F" Then
DecOut = DecOut + (15 * HexStep)
Else
'MsgBox "", vbCritical
End If
Next i
convert_0x_to_dec = DecOut
End Function
Dim arr1(2) as integer '定义数组
arr1(1)=10*m
arr1(2)=200
test=arr1 '返回数组
End Function
Sub test2()
dim arr(2) as integer '定义数组,接收test传回的值
arr=test(10) '调用test,返回arr(1)=100,arr(2)=200
' ……
End Sub
我把ture,false 从逻辑型转换成字符型的,然后有下面的式子,
我本来的目的是根据三个条件的计算后的逻辑值执行另外的代码,val("True or False or False")
对了,上面的代码我本来用的是evaluate("True or False or False"),但是系统提示出错!
s = Evaluate("1 + 1 + 0")
其中true为1(其实非0即可),false为0,and为*,or 为+
在当前文档的Visual Basic工程中添加一个模块,并输入下面的函数:
Function JS(表达式 As String)
JS = Application.Evaluate(表达式)
End Function
第二步:使用JS函数
添加完函数后,回到工作表,这时就可以和其他函数一样使用js函数了。
比如在单元格输入 =js(A1),若A1单元格内是个表达式 5*6-3,则返回这个表达式的运算结果27。