VBA开发

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

。。。


二十三

VBA中类似switch的语句用法:

Select Case…Case…End Case语句  
如: 
Select Case Pid 
Case “A101” 
Price=200 
Case “A102” 
Price=300 
…… 
Case Else 
Price=900 
End Select

二十四
vb中“byref参数类型不符”的解决办法
在VB中执行过程或函数时,提示"ByRef参数类型不符"
分析问题主要由于对应参数的类型不符造成的。造成这种情况一般有几种情况:
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就会报告错误.

VB可在同一行内声明多个变量。例如:
Dim AnotherVar,Choice As BoolearL,BirthDate As Date 
其中AnotherVar的类型为Variant,因为声明时没有指定它的类型。

二十五
VBA将十六进制转换为十进制
Function convert_0x_to_dec(ByVal InputData As String) As String
    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


二十六
VBA函数返回数组
Public Function test(byval m as integer) as integer() '这儿加()
    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

二十七
VBA接口Evaluate自动计算表达式的值。(本功能很强大,一个接口就类似于完成了一个简单的语法分析器~~!)
下面的代码中的or和and本来是字符型的数据,为了与它们连接,
我把ture,false 从逻辑型转换成字符型的,然后有下面的式子,
我本来的目的是根据三个条件的计算后的逻辑值执行另外的代码,val("True or False or False")
对了,上面的代码我本来用的是evaluate("True or False or False"),但是系统提示出错!
解决方法:
----------------------------------------------------------------------------
Dim s As Boolean
s = Evaluate("1 + 1 + 0")
其中true为1(其实非0即可),false为0,and为*,or 为+
----------------------------------------------------------------------------
split 可不可以设置多个分隔符: 可以用 replace  将想要 分割符统一 即 可实现多个分隔符.

第一步:添加自定义函数 
在当前文档的Visual Basic工程中添加一个模块,并输入下面的函数:
Function JS(表达式 As String)
   JS = Application.Evaluate(表达式)
End Function
第二步:使用JS函数
添加完函数后,回到工作表,这时就可以和其他函数一样使用js函数了。 
比如在单元格输入 =js(A1),若A1单元格内是个表达式 5*6-3,则返回这个表达式的运算结果27。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAD VBA开发是指在CAD软件中使用Visual Basic for Applications(VBA)进行编程开发的技术。CAD,全名Computer-aided design(计算机辅助设计),是指利用计算机技术辅助进行设计的过程。而VBA是一种编程语言,可以在很多软件中使用,包括CAD软件。 CAD VBA开发主要针对的是CAD软件的二次开发需求。通过使用VBA语言,开发人员可以根据自己的需求,编写自定义的功能和程序来扩展CAD软件的功能。这些功能可以自动化一些重复性的操作,提高设计效率。比如,可以编写一个VBA程序来自动绘制某种特定形状的图形,或者实现一键式批量修改图纸中的元素等等。 在CAD VBA开发中,开发人员通常需要了解CAD软件的对象模型和API(Application Programming Interface,应用程序编程接口)。CAD软件的对象模型定义了CAD软件中各种对象和其属性的结构与关系,开发人员可以根据这些对象和属性来编写程序。API则是CAD软件提供的一组接口,通过这些接口,开发人员可以与CAD软件进行交互,实现各种功能。 CAD VBA开发对于CAD软件的使用者而言,可以提供一些定制化的功能,能够更好地满足自己的设计需求。对于开发人员而言,它也是一种很好的学习和掌握编程技能的途径,可以通过开发VBA程序来提升自己的技术水平。 总之,CAD VBA开发是一种通过使用VBA编程语言对CAD软件进行二次开发的技术,可以扩展CAD软件的功能,提高设计效率,满足个性化需求。是CAD软件使用者和开发人员都可以受益的一项技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值