VBA学习笔记

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 工作区)

方法:

  • 使用ConnectSourceTableName属性设置或返回有关链接表的信息,并使用RefreshLink方法更新与链接表的连接;
  • 使用ValidationRuleValidationText属性设置或返回验证条件;
  • 对于本地表,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()可保存当前记录以及对它所做的任何更改,该方法保存从调用AddNewEdit方法以来,或更改现有记录中的任何字段值之后 所做的所有更改
3.0.4.6 Recordsets(DAO)

Recordsets 集合包含 ConnectionDatabase 对象中所有打开的 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必填。 指定文件模式的关键字:AppendBinaryInputOutputRandom。 如果未指定,则以 Random 访问模式打开文件。
access可选。 指定可对打开的文件执行的操作的关键字:ReadWriteRead Write
lock可选。 用于指定受其他进程限制对打开文件的操作的关键字 :Shared、Lock Read、Lock WriteLock 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")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值