3.0 VBA语法
Microsoft Visual Basic for Applications
DAO(数据访问对象)是Microsoft Jet数据库引擎(用于Microsoft Access)的第一个面向对象的接口,允许VB开发者直接链接到Access数据表,并且可以通过ODBC用于其他数据库。DAO是用于单个系统应用程序或小型的、局域网开发的最佳套件。
RDO(远程数据对象)是一个面向对象的、通向ODBC的数据访问接口,结合DAO容易使用的风格,提供了一个接口,该接口暴露了ODBC几乎所有的底层能力及其灵活性。RDO是有限的,它不能很好的访问Jet或ISAM数据库,并且它只能通过已有的ODBC驱动来访问关系型数据库。然而,RDO已经被证明是大量SQL Server、Oracle及其他大型数据库开发者所选择的接口。RDO提供了访问面向复杂的存储过程,及复杂结果集所需要的对象、属性及方法。
ADO(Active数据对象)是DAO/RDO的继承者。ADO2.0提供的功能与RDO很相似, 并且在两个模型之间存在通用的相似的映射关系。ADO的“平面化”对象模型也被用于DAO和RDO,这意味着ADO包含更少的对象,及更多属性,方法(和参数),及事件。例如,ADO中没有与 rdoEngine 和rdoEnvironment 对象的等价物,来暴露ODBC驱动管理和hEnv接口。需要注意的是,ADO现在还不支持所有的DAO功能。
我的理解:ADO适用于网络;DAO适用于本地;ADO似乎更先进。
3.0.1 基础
3.0.1.1 <> 运算符
<>
是比较运算符,代表不等于的意思
3.0.2 循环
3.0.2.1 while-wend 循环
While condition
statements
Wend
在While...Wend
循环中,如果条件为True
,则会执行所有语句,直到遇到Wend
关键字。如果条件为false
,则退出循环,然后控件跳转到Wend
关键字后面的下一个语句。
3.0.2.2 for-next 循环
如果开始与结束值相同,那么会执行一次,然后结束
For 计数器 = 开始 To 结束 [步长] For counter = 1 To 5 Step 3 For ii = mm To 1 Step -1
语句
Next [计数器] Next counter Next ii
注意:Step参数可正可负。如果Step为正,则 Start 必须小于等于 end,否则不能执行循环内的语句。如果Step为负,则 Start 必须大于等于 end,这样才能执行循环体。如果没有设置 Step,则缺省值为 1。
3.0.2.3 do-loop 循环
do while condition Do Do Until condition
statements statements statements
Loop Loop While condition Loop
3.0.3 函数
3.0.3.1 mid() 函数
mid(string,起始位置,长度)
,从一个字符串中的指定位置截取出指定数量的字符,如果长度缺省就是到最后;相似的还有Left( )/Right( );
MyString = "Mid Function Demo"
FirstWord = Mid(MyString,1,3) '返回"Mid"
LastWord = Mid(MyString,14,4) '返回"Demo"
MidWord = Mid(MyString,5) '返回"Function Demo"
3.0.3.2 EOF() 函数
EOF(filenumber)
,当到达一个已经打开的用于进行随机或顺序Input的文件的末尾时,将返回一个包含Boolean值True的Integer。
filenumber是包含任何有效文件编号的Integer
Dim InputData
Open "MYFILE" For Input As #1 ' Open file for input.
Do While Not EOF(1) ' Check for end of file. 有效文件编号:1
Line Input #1, InputData ' Read line of data.
Debug.Print InputData ' Print to the Immediate window.
Loop
Close #1 ' Close file.
3.0.4 对象
3.0.4.1 TableDef(DAO)
**定义:**TableDef 对象代表已存储的本地表或链接表(仅限 Microsoft Access 工作区)
方法:
- 使用
Connect
和SourceTableName
属性设置或返回有关链接表的信息,并使用RefreshLink
方法更新与链接表的连接; - 使用
ValidationRule
和ValidationText
属性设置或返回验证条件; - 对于本地表,
RecordCount
属性包含指定数据库表中的记录数;对于链接表,RecordCount
属性设置始终为 -1; - 新建 TableDef 对象,使用
CreateTableDef
方法;
应用1:
循环遍历一组 TableDef,如何确定每个 TableDef 是否代表链接表,而不是本地表?
对于链接表,.Connect
属性包含连接信息;但是对于本地表,.Connect
属性是一个空字符串。因此,可以通过检查 Len()
来判断;
如何更改链接表链接?
通常的方法是遍历TableDefs集合,然后检查是否存在Connect
字符串,如果链接确实存在,则需要更改Connect
属性。对于链接表TableDef对象,Connect
属性设置由一个或两个部分(数据库类型说明符和指向该数据库的路径,路径前应该加上DATABASE=
)组成,其中每个部分都以分号结尾。
If Len(tbl.Connect) > 0 Then
PFName = tbl.Connect
tbl.Connect = ";DATABASE=" & XPath & MdbName
tbl.RefreshLink
End If
3.0.4.2 TableDefs(DAO)
**定义:**TableDefs集合包含数据库中所有存储的 TableDef 对象(仅适用于 Microsoft Access 工作区)
方法:
- 若要按照序号或 Name 属性来引用集合中的 TableDef 对象,可以用
TableDefs(0)/TableDefs("name")/TableDefs![name]
; - 使用
Count
属性返回指定集合中的对象数; - 有
Append/Delete/Refresh
方法
**应用1:**遍历TableDef
For ii = 0 To db.TableDefs.Count - 1'TableDef的编号从0开始
Set tbl = db.TableDefs(ii)
If Len(tbl.Connect) > 0 Then
tbl.RefreshLink
End If
Next ii
3.0.4.3 QueryDef(DAO)
QueryDef 对象是 Microsoft Access 数据库中的查询的存储定义
3.0.4.4 QueryDefs(DAO)
QueryDefs 集合包含数据库中所有 QueryDef 对象。
3.0.4.5 Recordset(DAO)
Recordset 对象表示本地表中的记录或运行查询所生成的记录、结果集
属性:
RecordCount
属性,为表类型Recordset或TableDef 对象中的记录总数。使用 RecordCount 属性可以了解Recordset或TableDef 对象中已经访问的对象数。在访问完所有记录之前,RecordCount 属性不指示动态集类型、快照类型或仅向前类型的 Recordset 对象中包含的记录数。一旦访问完最后一条记录,RecordCount 属性就会指示Recordset或TableDef 对象中未被删除的记录的总数。若要强制访问最后一条记录,请对 Recordset 对象使用MoveLast方法。
Set srec = CurrentDb.OpenRecordset("select * from 90_气象站 order by XStaID")
srec.MoveLast
nSta = srec.RecordCount
srec.Close
方法:
MoveNext
移动至当前Recordset对象中的下一条记录,然后将该记录作为当前记录,有种指针的感觉:如Set prec = CurrentDb.OpenRecordset( )
,那么prec其实指向的是当前Recordset对象的首地址,也就是第一条记录,prec.MoveNext
就是向后移动一条记录。AddNew(FieldList,Values)
能够向Recordset对象添加新纪录,FieldList 和 Values 参数是可选的。 FieldList 可以是新记录中字段的单个名称、名称数组或序号位置;Values 参数是新记录中字段的单个值或值的数组。当希望添加单个记录时,可以调用不带任何参数的 AddNew 方法,然后调用 Update 或 UpdateBatch 更新Recordset对象。update()
可保存当前记录以及对它所做的任何更改,该方法保存从调用AddNew
或Edit
方法以来,或更改现有记录中的任何字段值之后 所做的所有更改
3.0.4.6 Recordsets(DAO)
Recordsets 集合包含 Connection 或 Database 对象中所有打开的 Recordset 对象
3.0.4.x Application
方法:
(1)CurrentDb
方法返回一个 Database 类型的对象变量,该对象变量代表当前在 Microsoft Access 窗口中打开的数据库;
若要用 DAO 操作数据库必须使用 DAO (对象) 。 CurrentDb方法提供了一种方法,通过它无需知道数据库的名称,即可从 Visual Basic 代码中访问当前数据库。 在具有指向当前数据库的变量后,还可以访问和处理 DAO 层次结构中的其他对象和集合
可以使用CurrentDb.OpenRecordset( )
来打开某个临时查询结果集,使用Close方法将其会自动从Recordsets集合中将其删除
- 打个比方,Set RS=CurrentDB.OpenRecordset(“麻烦服务器帮我查下AAAA数据表里2003年以前的所有记录”) 'SQL语句翻译:"Select * From AAAA Where dDate<‘2003-1-1’"服务器查询后,也许查到了20条记录,把结果返回、装在了RS里,RS里存的就是结果集数据,RS就是结果集类型(Recordset)。
Set trec = CurrentDb.OpenRecordset("select * from 编码_输出文件 where 类型= " & XName)'找出"编码..."文件中类型为XName的记录放到临时RS:trec中
FName = PathName & trec("文本文件名") '取出临时RS:trec中的部分信息
ss = trec("文件头行数") '标题行数
mm = trec("文件变量数") '文本文件列数
TName = trec("库表文件名")
trec.Close '关闭临时RS:trec
属性:
CurrentProject
属性可用于访问当前项目及其相关的集合、 属性和方法,如Application.CurrentProject.Path
返回当前mdb所在文件夹路径
3.0.5 语句
3.0.5.1 Open
功能: 启用对文件的输入/输出 (I/O)
语法: Open pathname for mode [access] [lock] As #filenumber
Part | 说明 |
---|---|
pathname | 必填。 指定文件名的字符串表达式,可包括目录或文件夹和驱动器。 |
mode | 必填。 指定文件模式的关键字:Append、Binary、Input、Output 或 Random。 如果未指定,则以 Random 访问模式打开文件。 |
access | 可选。 指定可对打开的文件执行的操作的关键字:Read、Write 或 Read Write。 |
lock | 可选。 用于指定受其他进程限制对打开文件的操作的关键字 :Shared、Lock Read、Lock Write 和 Lock Read Write。 |
filenumber | 必填。 一个有效文件号,范围为 1 到 511(含 1 和 511)。 使用FreeFile函数获取下一个可用的文件编号。 |
举例:
3.0.5.2 Input
语法:Input #FileNumber, VarList
,filenumber为有效文件编号,varlist为由逗号分隔的变量列表,这些变量分配有从文件读取的值。
我的理解:line input为按行读取;input能实现按个读取
3.0.5.3 Line Input
语法:Line Input #FileNumber, VarName
,filenumber为有效文件编号,varname为有效变量名称
从打开的顺序文件中读取一行,并将其分配给字符串变量;Line Input # 语句从文件中一次读取一行字符,直到它遇到回车 (Chr (13) ) 或回车换行符 (Chr (13) + Chr (10) ) 序列。 回车-换行序列将被跳过,而不是附加到字符串后面。
3.0.6 可视化
3.0.6.1 MsgBox
临时输出示例:MsgBox (tbl.Connect + "string")