01 ACCESS基础操作技巧 001 显示VBA编辑器 共有四种方法 分别是 A.数据库工具下的 vaual basic 按钮 B.ALT+F11 C.事件生成器 D.事件按钮 002 调用编辑工具栏 单击VBA编辑器菜单下的视图按钮,在弹出的菜单中选择工具栏/编辑 003 设置代码的显示效果 TAB键 tab+shiht键 rem关键字 tab 代码缩进 默认缩进4个字符 可以在工具/选项中设置缩进的宽度 tab+shiht键 代码突出 REM 或' 代表注释 加在代码前面 一个长行代码 要用在半角状态下的空格" "和"_"来实现 多行代码 显示在一行 ,可以用":"来实现 "例如 Dim a%:Dim b& 004 打开立即 对象 本地 属性窗口 监视 在VBA编辑器下的视图菜单里 立即窗口的快捷键 是ctrl+G 005 设置强制性声明变量 设置强制性声明变量有两种方式 A 在代码前加 Option Explicit 语句 B ”工具/选项“对话框复选 要求声明变量 006 创建 Sub 过程 创建 Sub 过程有两种方式 A 在插入/过程里单击添加过程对话框,选中子程序单选按钮,设置名称即可创建 Sub 过程 B 在 VBA 编辑器中输入 sub 过程名 "例如 创建一个 Sub 过程,输入两个对话框,并求和 将求和结果显示在对话框 Sub 求和() Dim m%,n%,sum2% '# 是 as integer 的简写 m=inputbox("第一个加数") n=inputbox("第二个加数") sum2=m+n msgbox m & "+" & n & "=" & sum2 End sub 007 创建 function 程序 Function 程序又称为函数,需要返回计算的记过。制作出 funciton 程序之后, 可以 在窗体名查询中使用该函数,将其当做自定义函数。 与 Sub 过程相比,function 程序过程中必须含有"程序名=返回值"这样的代码 创建function程序 有两种方法 A 在插入/过程里单击添加过程对话框,选中函数单选按钮,设置名称即可创建 function 过程 B 在VBA编辑器中直接输入funciton 程序名来创建 "例如 创建一个求积 然后在sub中调用,并用F5查看结果 Function 求积(m#, n#) '# 是 as double 的简写 求积 = m * n End Function Sub 调用求积() Dim x#, y# x = InputBox("第一个乘数") y = InputBox("第二个乘数") MsgBox x & "*" & y & "=" & 求积(x, y) End Sub 008 定义作用域的过程 如果希望在所有模块中通用,在过程前在 Public 关键字,如果只是本过程使用,添加 Private 关键字 009 创建标准模块和类模块 和创建 sub 关不多 010 模块导入和导出 便于多数据库调用相同模块 模块导入 ctrl+m 模块导出 ctrl+e 011 删除指定模块 012 快速定位过程 事件 013 拆分代码窗口 014 调用 Sub 过程 Call 关键字可调用 sub 过程 "例如 在单击 调用测试按钮时,调用信息过程 '演示附件为c01 步骤 在窗体中添加按钮 在代码中输入信息过程 '代码为 sub 信息() 在代码中输入单击按钮的过程 '代码为Private Sub cmd_调用调试_Click() 单击按钮 Sub 信息() MsgBox "调用演示" End Sub Private Sub cmd_调用调试_Click() Call 信息 End Sub 015 递归调用中的参数传递 If Then Else 递归调用 "例如 创建一个求解阶乘的函数,关调用该函数求解阶乘 'c01 递归调用中的参数传递 步骤 1在窗体中插入两个文本框和计算阶乘按钮 '输入框是text26 结果是text30 按钮是Command38 2在代码中创建function函数 3在代码中插入cmd_阶乘_click事件过程 4单击阶乘按钮运行程序 Public Function 阶乘(n As Variant) On Error GoTo 信息框 If Int(n) - n = 0 And n >= 0 Then If n = 0 Then 阶乘 = 1 Else 阶乘 = 阶乘(n - 1) * n End If Else 信息框: MsgBox "请输入不超过170正整数" End If End Function Private Sub Command38_Click() Text30 = 阶乘(Text26) End Sub 016 显示消息队话框 "msgbox" msgbox()函数 Sub msg() msgbox "中午了",16,"提示" '第一参数是对话框中的内容。第二参数为按钮、图标、及缺省按钮的和,第三参数是对话的标题 2 3 参数可以省略 End Sub 按钮有6种 0 只有确定 vbokonly 1 有确定和取消 vbokcancel 2 终止 重试 和忽略 vbabortretrylgore 3 是 否 取消 vbyesnocancel 4 是 否 vbyesno 5 重试 取消 vbretrycancel 图标有4种 16 关键信息 X标志 vbctitical 32 警告询问 ?标志 vbquestion 48 警告消息 !标志 vbexclamation 64 通知消息 I标志 vbinformation 缺省按钮可先4个 分别为 0 第一按钮 vbdefaultbutton1 256 第二按钮 vbdefaultbutton2 512 第三按钮 vbdefaultbutton3 768 第四按钮 vbdefaultbutton4 msgbox的返回值 msgbox的返回值有7个 分别是 vbok 1 确定 vbcancel 2 取消 vbabort 3 终止 vbretry 4 重试 vblgnore 5 忽略 vbyes 6 是 vbno 7 否 "例如 在单击按钮时,弹出提示信息 'c01 显示消息对话框1 步骤:窗体插入按钮 命名为提示 在代码输入提示按钮单击的命令 'sub 提示_click() 过程 单击按钮查看效果 Sub 提示() msgbox "此处为提示内容",,"提示框标题" End Sub "例如 在弹出的对话框单击不同的按钮时,响应不同的动作 'c01 显示消息对话框2 Private Sub 提示_Click() If MsgBox("提示消息", 1, "提示") = 1 Then MsgBox "您单击了确定按钮" Else MsgBox "您单击了取消按钮" End If End Sub 018 显示输入对话框 "inputbox" inputbox函数的格式如下 [变量]=inputbox("提示内容","标题","默认值")'2 3 参数可省略 "例如 单击输入数据按钮时,弹出对话框,在对话框中输入数据,将数据显示在窗体的文本框中 步骤:在窗体中插入文本框和输入数据按钮 '文本框为text_数据 按钮为cmd_输入 在cmd_输入_click事件过程中输入代码 ' Sub cmd_输入_click() 单击按钮完成 Sub cmd_输入_() text_数据= inputbox("请在以下文本框中输入数据","输入数据对话框","请修改默认值") End Sub 019 根据条件表达式的结果返回不同值 "iif" iif函数的使用方法为 [变量]=iif("条件表达式","条件为真时结果","不符合条件时结果")'第三参数可省略 "例如 检查文本框数字,判断的结果是正数还是负数 Sub 检查_click() Dim Str As String Str = iif(txt_数据>0,"你输入的数据为正数","你输入的数据不是正数") 'text_数据为数据文本框 msgbox Str End Sub 020 判断是否为空值 "isnull" isnull函数 "例如 单击判断按钮后,如果数据为值,用消息对话框返回结果 Sub 判断_click() If isnull(text_数据) Then msgbox "当前没有输入数据" Else msgbox "当前输入的数据为" & text_数据 End sub 021 判断变量是否为初始化 "isempty" isepmty(变量) 常与if来一起使用,和isnull用法差不多 022 取得字符串长度 "len" Len(变量) "例如 对text_数据文本框判断,检查字符长度,并将字符串长度用对话框显示 步骤 窗体中插入文本框和按钮 文本框为"text_数据" 按钮为"长度" Sub 长度_click() On Error GoTo 空值 Dim Str As integer Str =Len(text_数据) If 0 then 空值: Str =0 End If msgbox "当前文本框输入的字符长度为" & str End Sub 023 设置颜色 "RGB() INT() RND()函数 rgb函数为调用颜色,具体用法为 RGB([红色值],[绿色值],[蓝色值]) '各色值为数字 "例如 当单击颜色按钮时,按钮边框颜色随机变换 步骤 在窗体中添加一个颜色按钮 为颜色按钮添加单击动作事件 Sub 颜色_click() Dim r%,g&,b& r=int(rnd()*255)' 不大于255的非负整数 g=int(rnd()*255) r=int(rnd()*255) 颜色.bordercolor=rgb(r,g,b) End sub 026 定义常量 "Const 定义常量的方法是 Const [常量名] As [数据类型] =[常量值] 027 定义变量 "dim 定义变量的语法格式为 Dim [变量名] As [数据类型] 数据类型 常见的有 Byte 0-255的整数 Integer % -32768-32768的整数 Long & -2147483648-2147483648的整数 Single ! 包含小数 Double # 包含小数 Date 日期 String % 1-65400字符 028 用dim定义数组 Dim [数组名]([数组下标界限]) As [数据类型] "例如要定义一个3 行 4 列的二维数据,用以下的代码" Dim myarray(3,4) As Integer 029 定义动态数组 "redim 动态数组,指的是先不定义数组大小,后面用的时候重新用 ReDim 启用 "例如 Dim myarray()As Integer ReDim myarray(3,4) 030 自定义数据类型 "type "例如 需要定义一个包含两个值的数据类型的people 然后在事例过程志使用该类型的数据 Option Compare database Option Explicit type people name As String age As Integer End type Sub shifan() Dim ppme As people ppme.name="张三" ppme.age=34 msgbox ppme.name & "的年龄为:" & ppme.age End sub 031 定义具有作用域的变量 Public Private 在 dim 前面加上 public 代表为公共模块变量 公共模块变量可以所有模块使用 私有模块变量只在当前模块使用 公共流程变量在该模块所有过程可以,其他模块不可用 私用流程变量只在该过程可以用 032 定义静态变量 "static 静态变量 指的是变量的一直存在 "例如 在事件过程中编写vba代码,定义变量,实现累加,使用消息对话框返回结果 步骤:插入按钮 为按钮添加单击动作 Sub cmd_(测试) Dim num1% Static num2% num1=num1+1 num2=mum2+1 msgbox &num1+Char(15)&num2 End sub 033 使用定义的常量 "Const 定义方法见 026 使用方法和变量一样 034 使用内置常量 使用方法和变量一样 035 直线流程结构 036 简单条件分支结构 "if then else"语句 037 多条件分支结构 "if then elseif then else" 语句 如果只有一个条件 ElseIf 就可以省略 If [条件表达式] Then [符合条件的执行代码] ElseIf [条件表达式2] Then [符合条件2的执行代码] ………… Else [不符合以上所有条件的执行代码] End if 038 多条件分支结构 "select case" 语句 Select Case [需要满足条件的数据] Case Is [满足数据条件1] [条件1成立时的代码] Case Is [满足数据条件2] [条件2成立时的代码] ………… Case Else [不满足以上所有条件时的代码] ene Select 例如:在找开的对话框里输入数字后 判断是正数 负数 等 'c01 多条件分支结构2 Sub 多分支条件() Dim numin As String numin =inputbox("请输入数据") Select Case numin Case Is >100 msgbox "输入的数据大于100" Case Is >50 msgbox "输入的数据介于50-100之间" Case Is >=0 msgbox "输入的数据介于0-50之间' Case Else msgbox "输入的数据小于0" End Select End Sub 040 循环判断 "Do …… Loop until" 语句 使用 do …… loop Until "先执行循环体 再检查是不是符合条件 Do [循环体] Loop until [结束循环的条件] 例如 需要得到方程 z=x+y^2 x和y 不大于100的正整数时,z大于等于9850的一个随机解 sub 循环判断() Dim z%,x%,y%,n% Do x=int(rnd()*100) y=int(rnd()*100) z=x+y^2 n=n+1 Loop Until z>=9850 msgbox "x=" & x & chr(13) & "y=" & y & chr(13) & "z=" & z & chr(13) & "运算次数为" & n End Sub "如果需要在不满足条件时执行循环,条件成立时就停止循环 Do Until [结束循环的条件] [循环体] Loop 例如 求两整数的最大值并计算最小公倍数 Sub 循环判断1() Dim num1%,num2%,num%,n% num1 =inputbox("请输入第一个正整数") num2 =inputbox("请输入第二个正整数") If num1>num2 Then num=num1 Else num=num2 End if Do Until int(num/num1)=num/num1 And int(num/num2)=num/num2 num=num+1 loop msgbox num1 & "和"& num2 & "的最小公倍数为" & num & Chr(13) End Sub 041 循环判断 "while …… wend"语句 使用 while [执行循环的条件] [循环体] Wend 时,会先判断是否满足指定的条件,如果满足就执行循环体 例如 求两整数的最小公倍数 Sub 循环() Dim num1%,num2%,num% num1=inputbox("请输入第一个整数") num2 =inputbox("请输入第二个整数") If num1>num2 Then num=num1 Else num=num2 End If While int(num/num1)<>num/num1 or int(num/num2)<>num/num2 num=num+1 Wend msgbox num1 & "和"& num2 & "的最小公倍数为" & num & Chr(13) End Sub 043 进行计次循环 "for next语句" For Next 的用法为为 For [计数变量]=[计数初值] To [计数终值] step[步长] [循环体] next[计数变量] 如果步长 为1的情况下 For Next 和上述循环没多大区别。 例如 当输入一个正整数后,计次循环计算出还数的阶乘 Sub 阶乘() Dim num1 as Double,num2 as Double,i% num1 = inputbox("请输入一个不大于170正整数") num2=1 For i =1 To num1 num2=i*num2 Next i msgbox num1 & "的阶乘为" & num2 End sub 044 强制跳出循环 "Exit Do 和 Exit for 语句 如果需要在do 循环或 For 循环过程中强制退出循环,可以循环语句中添加 Exit For 或 Exit do 例如 在一个扔骰子程序中,如果选择否 就不继续扔 Sub 骰子() Dim num% Do num =int(rnd()*6)+1 If msgbox("当前骰子结果为" & num & Chr(13) &"是否继续",4)=7 Then Exit Do End If Loop msgbox "已退出摇骰子程序" End sub 045 错误跳转 "On Error goto" 语句 如果希望出现错误时,自动跳转到指定的行去,可以使用 该语句,使用该语句后 要设置一个行标签 On Error GoTo [行标签名] [行标签名]: 例如 在一个整数输入框内输入非整数时 提示请输入整数 Sub 判断() Dim i% On Error GoTo 错误提示 i = inputbox("请输入一个整数") msgbox "输入的数为" & i Exit sub 错误提示: msgbox "请输入一个整数" End sub 046 获取错误的具体信息 "err.number 错误编号 err.description 错误描述 例如 在一个整数输入框内输入非整数时 提示错误原因 Sub 判断() Dim i% On Error GoTo 错误提示 i = inputbox("请输入一个整数") msgbox "输入的数为" & i Exit sub 错误提示: msgbox "请输入一个整数" & Chr (13) & "错误编号:" & Err.number & Chr (13) & "原因:" & Err.description End Sub 047 获取错误的具体信息 "error() 如果要根据错误的编号,查询具体错误原因,可用该函数 Error(编号) 如编号省略,则和err.description 返回的值一样 例如 在一个整数输入框内输入非整数时 提示错误原因 Sub 判断() Dim i% On Error GoTo 错误提示 i = inputbox("请输入一个整数") msgbox "输入的数为" & i Exit sub 错误提示: msgbox "请输入一个整数" & Chr (13) & "错误编号:" & Err.number & Chr (13) & "该错误编号的具体描述:" & Error() End Sub 02 控件和对象的使用技巧 055 快速引用当前窗体的控件 "me关键字 "[对象集名]![对象名]![控件名] 如果引用的是当前代码的控件,则可以用 Me 关键字 简写为 Me!控件名 例如 单击某按钮后 该按钮的名称自动填写到文本框中。 "文本框为 text1 按钮为cmd按钮 Private Sub cmd按钮_Click() Me.Text = Me.cmd按钮.Caption End Sub 056 快速获取报表、查询、窗体或报表的名称列表 表和查询的名称可以分别通过 tabledefs 和querydefs 对象集合获取,先用count取总数,再用for循环取每个的名称。 具体用法为 currentdb.tabledefs.count currentdb.querydefs.count ……………… currentdb.tabledefs([序号]).name '序号从0开始 currentdb.querydefs([序号]).name '序号从0开始 窗体和报表的获取方法与表及查询不一样,先要用containers和documents对象集合,再来使用 currentdb.countainers("forms").documents.count currentdb.countainers("reports").documents.count ……………… currentdb.countainers("forms").documents(序号).count '序号从0开始 currentdb.countainers("reports").documents(序号).count '序号从0开始 以下为例,在四个文本框里分别罗列所有对象 Private Sub cmd罗列_Click() Me.T报表 = Null Me.T查询 = Null Me.T窗体 = Null Me.T表 = Null '以下为列出所有表名 Dim i% For i = 0 To CurrentDb.TableDefs.Count - 1 T表 = T表 & i + 1 & ":" & CurrentDb.TableDefs(i).Name T表 = T表 & vbCrLf Next i '以下为列出所有查询名 For i = 0 To CurrentDb.QueryDefs.Count - 1 T查询 = T查询 & i + 1 & ":" & CurrentDb.QueryDefs(i).Name T查询 = T查询 & vbCrLf Next i '以下为列出所有窗体名 For i = 0 To CurrentDb.Containers("forms").Documents.Count - 1 T窗体 = T窗体 & i + 1 & ":" & CurrentDb.Containers("forms").Documents(i).Name T窗体 = T窗体 & vbCrLf Next i '以下为列出所有报表名 For i = 0 To CurrentDb.Containers("reports").Documents.Count - 1 T报表 = T报表 & i + 1 & ":" & CurrentDb.Containers("reports").Documents(i).Name T报表 = T报表 & vbCrLf Next i End Sub 057 设置控件的可见性 "visible属性 "[控件名].visible=[逻辑值] " '逻辑值为true 控件为可见 为false 控件为隐藏 例如 通过按钮控制图像控件的可见星,单击按钮为隐藏,再次单击为显示,如此循环 Private Sub cmd可见_Click() If IMG竹.Visible = True Then IMG竹.Visible = fale cmd可见.Caption = "显示图片" Else IMG竹.Visible = True cmd可见.Caption = "隐藏图片" End If End Sub 058 指定控件是否可以接受焦点 "enabled 属性 "[控件名].enabled=[逻辑值] " '逻辑值为true 控件为可以接受 为false 控件为不可接受 例如 模拟一个信息录入窗口,只有在该窗口中输入姓名以后,其余三个文本框才可用,否则不可用 Private Sub T姓名_AfterUpdate() If IsNull(Me.T姓名) Then Me.T性别.Enabled = False Me.T年龄.Enabled = False Me.T职务.Enabled = False Else Me.T性别.Enabled = True Me.T年龄.Enabled = True Me.T职务.Enabled = True End If End Sub 059 指定一个控件是否能被编辑 "locked属性 "[控件名].locked=[逻辑值] " '逻辑值为true 控件为不可以编辑 为false 控件为可编辑 例如 将第一个文本框中的数据和第二个数据的5倍求和,并将结果保存到第三个文本框中,锁定第三个文本框 Private Sub Command20_Click() T结果 = T1 * 2 + T2 * 5 T结果.Locked = True End Sub 060 在窗体中操作控件:"top 属性 left 属性 [控件名].top=[上边距值] [控件名].left=[左边距值] 其中边距的默认单位是缇 1厘米等于567缇 例如 通过按钮控制窗体中图像的位置 Private Sub cmd可见_Click() Dim leftx!, topy! '!为single的简写 leftx = InputBox("请输入图片的左边距(单位:mm)", "左边距", 0) topy = InputBox("请输入图片的上边距(单位:mm)", "上边距", 0) IMG竹.Top = topy * 56.7 IMG竹.Left = leftx * 56.7 End Sub 061 设置控件的大小 "height属性 width 属性 imageheight属性 [控件名].height=[高度] [控件名].width=[宽度] '默认单位是缇 1厘米等于567缇 如果要对控件进行缩放,可以在原度上加减乘除相应数值 [控件名].height=[高度]*[控件名].height [控件名].width=[宽度]*[控件名].width 如果控件高宽要取本自图片高宽,可用 imageheight 和imagewidth 属性 [图像控件名].height=[图像控件名].imageheight [图像控件名].width=[图像控件名].imagewidthd 例如 通过缩放和指定大小来调整框体大小 Private Sub cmd大小_Click() On Error GoTo 结束: Dim heighty!, perc!, widthx!, cmdc% cmdc = MsgBox("指定大小请单击“是”按钮,比例缩放请单击“否”按钮", 4) If cmdc = 6 Then '按大小设置控件 IMG竹.SizeMode = acOLESizeStretch heighty = InputBox("请输入指定的框体高度(单位:mm)", "高度", Int(IMG竹.ImageHeight / 56.7)) widthx = InputBox("请输入指定的框体宽度(单位:mm)", "宽度", Int(IMG竹.ImageWidth / 56.7)) IMG竹.Width = widthx * 56.7 IMG竹.Height = heighty * 56.7 ElseIf cmdc = 7 Then '按缩放调整框体大小 IMG竹.SizeMode = acOLESizeZoom perc = InputBox("请输入图片缩放比例", "缩放", 1) IMG竹.Width = IMG竹.ImageWidth * perc IMG竹.Height = IMG竹.ImageHeight * perc Else MsgBox ("您取消了调整图片的大小") End If 结束: End Sub 062 设置控件边框 "borderstyle 属性 borderwidth属性 bordercolor属性 [控件名].borderstyle=[线条常数] '常数为0-8的整数 [控件名].borderwidth=[宽度常数] '常数为0-8的整数 [].bordercolor=[颜色] '常见颜色为rgb(r,g,b) 例如 在单击边框按钮后 线条 颜色 宽度都是随机变的 Private Sub Command13_Click() Dim bsl%, bwh%, rgbr%, rgbg%, rgbb% IMG竹.BorderStyle = Int(Rnd() * 8) IMG竹.BorderWidth = Int(Rnd() * 8) IMG竹.BorderColor = RGB(Rnd() * 255, Rnd() * 255, Rnd() * 255) End Sub 063 设置控件时候透明 "backstyle属性 [控件名].backstyle=[逻辑值] '逻辑值为true是为不透明,为false为透明 例如 单击按钮时,将一个标签背景改为透明 Private Sub Command6_Click() If L透明.BackStyle = 0 Then L透明.BackStyle = 1 Else L透明.BackStyle = 0 End If End Sub 064 控件字体属性 "fontname fontweight fontsize fontitalic属性 [控件名].[字体属性]=[属性值] .fontname 字体名 .fontweight 宽度 .fontsize 字号 .fontitalic 逻辑值为true 为斜体,false为不变 065 在窗体上让标签闪烁效果 "timerlnterval属性 双击事件(dblclick) 先将窗体的计时器事件 添加 Private Sub Form_Timer() Me.L透明.Visible = Not Me.L透明.Visible Me.L透明.ForeColor = RGB(Rnd() * 255, Rnd() * 255, Rnd() * 255) End Sub 再在标签添加双击事件 标签就会闪烁了 Private Sub L透明_DblClick(Cancel As Integer) If Me.TimerInterval Then Me.TimerInterval = 0 Else Me.TimerInterval = 500 End If End Sub 066 获得焦点 失去焦点 gotfocus lostfocus事件 Private Sub 控件名_gotfocus() '获得焦点 代码 End Sub ………… Private Sub 控件名_lostfocus() '失去焦点 代码 End Sub 071 获取多列列表框的数据 "column属性 控件名.column(列,行-1) 其中行如果省略就是查看选择的行 如果没选择则不出数据 例如 控件名.column(3,1) 表示 第2行 第3列 073 引用当前数据库 "set 语句 currentdb方法 name属性 首先要申明一个变量 Dim [变量名] As dao.database 将变量赋值为数据库 Set 变量名 = currentdb() 用name属性显示路径 变量名.name 例如 获取当前数据库 并用对话框显示,关闭数据库,释放变量 代码如下 Sub 输出_click() Dim db As dao.database Set db =currentdb() msgbox db.name db.close:Set db = Nothing End Sub 074 引用指定的数据库 "opendatabase 方法 containers 属性 opendateabase(打开数据库的完整路径) countainers(容器类型) 容器类型有两种 分别是 报表 reports 窗体 Forms 例如 打开指定的数据库,对话框显示窗体个数 Sub 输出_click() On errof GoTo 没有文件 Dim db As dao.Database Set db = OpenDatabase("d:/日报.accdb") MsgBox db.Name & " 的窗体个数为" & db.Containers("Forms").Documents.Count db.Close: Set db = Nothing If 0 Then 没有文件: MsgBox "指定的文件不存在" End If End Sub 075 引用数据库中的表 "openrecordset 方法 fields属性 [数据库对象].openrecordset([表或查询名],[打开方式]) '获取表的记录集的打开方式为 dbopentable 获取记录集的字段的方法是 [记录集].fields(序号) 例如 对话框显示当前数据库日志表的所有字段 Private Sub Command6_Click() Dim db As dao.Database Dim rs As dao.Recordset, i% Dim str As String Set db = CurrentDb() Set rs = db.OpenRecordset("日志", dbOpenTable) For n = 1 To rs.Fields.Count str = str + Chr(13) + rs.Fields(n - 1).Name Next n MsgBox rs.Name & "的字段列表有:" & str, , "字段列表" End Sub 076 通过sql来引用指定记录集 "openrecordset 方法 movenext方法 用sql来引用指定的记录集的方法是 [].openrecordset(sql,dbopendynaset) 在记录集的 下一条是 [记录集].movenext 例如 要在文本框中显示日志表里的所有记录 Private Sub 日志_Click() Dim db As dao.Database Dim rs As dao.Recordset Dim strsql As String Dim i As Integer '设置SQL语句获取销售部员工的姓名、专业和部门 strsql = "SELECT 日期, 星期, 内容 FROM 日志;" '引用当前数据库 Set db = CurrentDb() '使用动态集的方式打开SQL筛选的结果作为记录集 Set rs = db.OpenRecordset(strsql, dbOpenDynaset) T记录 = "" '清空文本框 '通过判断循环输出记录集中的每条记录 Do Until rs.EOF = True '通过计次循环输出每条记录的所有字段 For i = 0 To 2 T记录 = T记录 & rs.Fields(i) & " " Next i rs.MoveNext '移动至下一条记录 T记录 = T记录 + vbCrLf '换行 Loop End Sub 077 引用窗体或报表中的记录集 。"recordsetclone属性 openfrom方法 窗体或报表中引用记录集 要用recordsetclone调用 方法是 Set [变量] =[对象集]![对象].recordsetclone 统计当前有多少个记录数的方式和 [记录集].recordsetcount 如果当前窗体未打开,要先打开,方式为 docmd.openfrom [窗体名] 例如 Sub 记录数() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb() '打开窗体"F_员工工资" DoCmd.OpenForm "F_员工档案" Set rs = Forms!F_员工档案.RecordsetClone '复制窗体的记录集 '输出窗体中的记录集的记录数 MsgBox "F_员工档案中的记录数为:" & rs.RecordCount End Sub 082 删除指定数据表 "tabledefs 数据表集合 delete方法 删除对应表的方式为 数据库.tabledefs.delete "表名" 例如 要删除T记录表 Sub cmd删除_click() On Errrt GoTo 不存在 Dim db As dao.database Set db =currentdb db.tabledefs.delete "t记录" '等同docmd.deletebject actable,"t记录" de.close Set db = Nothing 不存在: msgbox "该表不存在" End sub 上述案例也可以用docmd.deletebject actable,"t记录" 083 删除指定表的指定列 删除对应的表的指定列 的法是 表名.fields.delete("字段名") 例如 删除 查询表 姓名字段 Sub 删除() On Error GoTo 不存在 Dim db As dao.database Dim tb As dao.tabledef Set db =currentdb Set tb=db.tabledefs("查询表") tb.fields.delete("姓名") Set tb =Nothing db.close: Set db=Nothing Exit Sub 不存在: msgbox "该字段不存在" End Sub 084 为指定表增加指定字段 "attributes 属性 append方法 088 创建删除查询 "createquerydef方法 创建查询的的方法为 数据库.creatquerydef(查询名,sql查询语句) 删除查询的方法为: 数据库.querydefs.delete "查询名" Private Sub Command0_Click() '新建查询 On Error GoTo 错误 Dim db As DAO.Database Dim qr As DAO.QueryDef Dim strsql As String Set db = CurrentDb strsql = "select * from 投诉日志 where 受理局 = '北京'" Set qr = db.CreateQueryDef("Q查询", strsql) MsgBox "该查询已新建" DoCmd.OpenQuery "Q查询" db.Close: Set db = Nothing: Exit Sub 错误: MsgBox Err.Description, , "您出错了" End Sub '删除查询代码 Private Sub Command2_Click() On Error GoTo 错误 Dim db As DAO.Database Set db = CurrentDb db.QueryDefs.Delete "Q查询" MsgBox "已成功删除" db.Close: Set db = Nothing: Exit Sub 错误: MsgBox Err.Description, , "您出错了" End Sub 03 access中的对象操作技巧 089 启动和退出ACCESS "shell","quit" 启动程序的方法为 shell(完整路径,打开方式) '打开方式有vbnormalfcus 退出accesss的方法为 Application.quit 090 界面操作 最大化 最小化 "docmd对象","runcommand方法" 最大化 docmd.runcommand accmdappmaximize 最小化 docmd.runcommand accmdappminimize 还原 docmd.runcommand accmdapprestore Private Sub Command11_Click() '最大化 DoCmd.RunCommand acCmdAppMaximize End Sub Private Sub Command15_Click() '最小化 DoCmd.RunCommand acCmdAppMinimize End Sub Private Sub Command19_Click() '还原 DoCmd.RunCommand acCmdAppRestore End Sub 091 打开指定对象 "docmd.open** 打开各对象的方法为 docmd.open* 对象名,打开方式 其中opentable为表格 openquery为查询 openform为打开窗体 打开方式中 0 acviewnormal 为普通视图 1 acviewdesign 为设计视图 2 acPreview 报表视图 3 acformds 数据表视图 4 acviewreport Private Sub 打开表_Click() '普通视图 DoCmd.OpenTable "投诉日志", 1 End Sub Private Sub 打开查询_Click() DoCmd.OpenQuery "查询本", 1 End Sub Private Sub 打开窗体_Click() DoCmd.OpenForm "窗体1", 2 End Sub 092 打开窗体时指定大小 位置 "docmd.movesize方法 指定窗体大小位置的命令为 docmd.movesize 左边距,上边距,宽度,高度' 单位为缇 与厘米的换算为1cm=567缇 例如 要求打开窗体1时,高度为14厘米 宽6厘米 上边2厘米,左边3cm Dim L%,T%,H%,W% L=3*567 T=2*567 H=14*567 W=6*567 docmd.movesize L,T,W,H 093 判断窗体是否加载 "isloaded 判断某窗体是否打开 方法为 currentproject.allforms(窗体名).isloaded 例如 当指定的窗体已打开时,提示已加载,如未打开,打开该窗体 Sub Panduan() If currentproject.allforms("窗体1").isloaded Then msgbox "该窗体已加载" Else msgbox "当前窗体未加载,单击确定后重新打开" docmd.openform "窗体1",0 End If End Sub 094 窗体属性 "caption " 标题 insideheight insisewidth 高度 宽度 Me.caption="窗体1" Me.insideheight = 3*567 Me.insidewidth = 4* 567 096 窗体导航按钮 记录选择器的隐藏与显示 导航按钮 窗体名.navigatgionbuttons= [逻辑值] '逻辑值为true为显示 逻辑值为false时为隐藏 窗体名.recordselectors= [逻辑值] '逻辑值为true为显示 逻辑值为false时为隐藏 097 窗体的数据源 窗体名.recordsource= 数据源 '后面是表格 记录集或查询 098 窗体控件的数据源 窗体名.控件名.controlsource=记录集字段名 例如 设置窗体中两个文本框中的数据源为表格员工工资中的两列 Sub form_load() Dim db As dao.database Dim rb As dao.recordset Set db =currentdb Set rb =db.oprecordset("员工工资",dbopendynaset) Set Me.recordset=rb Me.t姓名.controlsource="姓名" Me.t员工工资.controlsource="实得工资" Set rb=Nothing Set db =Nothing End Sub 101 窗体的双击事件 "dblclick事件 例如 在双击时,双击姓名时,打开资料窗体,编辑该员工的基本资料 Public strname As String '先申明公共变量 Private Sub 姓名_DblClick(Cancel As Integer) '双击姓名字段时的命令 strname = Me!姓名 '取得当前字段内容 DoCmd.OpenForm "f_员工资料" '打开 F员工资料窗体 End Sub 然后在 F员工资料的加载窗体中设置以下命令: '加载窗体时,窗体记录跳转至双击的姓名字段记录 Private Sub Form_Load() On Error GoTo 1000 DoCmd.GoToControl "姓名" DoCmd.FindRecord strname 1000: End Sub 102 创建删除窗体 "creatform方法" "save方法" "deleteobject方法" 创建并保存窗体 Set 窗体变量=creatform (数据库名,窗体模板) docmd.save ,[新建的窗体名称] 删除指定窗体 docmd.deleteobject acform,[窗体名称] '等同 docmd.formdefs.delete [窗体名称] 例如 Sub cmd_创建_click() '创建新窗体 窗体1 Dim fm As form Set fm=creatform docmd.save , "窗体1" docmd.close acform,"窗体1" refreshdatabasewindow End Sub Sub cmd_删除_click() '创建删除按钮 docmd.deleteobject acform,"窗体1" refreshdatabasewindow End Sub 103 关闭所有窗体 关闭单个指定的窗体的方法是 docmd.deleteobject acform,[窗体名称] '等同 docmd.formdefs.delete [窗体名称] 如果要关闭所有的窗体 可以用forms.count 取得所有打开窗体的个数,然后用for net 或 Do While Private Sub Command0_Click() On Error GoTo 123 Dim i As Integer i = Forms.Count Do While i > 0 DoCmd.Close acForm, Forms(0).Name Loop 123: End Sub 104 设置窗体的可编辑状态 "allowedits 窗体.allowedits=逻辑值 '逻辑值为true为可编辑 逻辑值为false时为不可编辑 窗体.refresh '刷新窗体 例如 单击某按钮后 反转当前编辑状态,并将当前状态作为按钮的名称 Sub 编辑_click() Me.allowedits=Not Me.allowedits If Me.allowedits =True Then Me.编辑.caption="当前为可编辑状态" Else Me.编辑.caption="当前为不可编辑状态" End If End Sub 105 引用窗体中的控件 窗体名.controls(控件名) Me.控件名 '当前窗体 Forms(窗体名).controls(窗体名) 04 数据格式处理技巧 106 设置文本对象的前景颜色 "forecolor属性" "rgb()函数" object.forcolor=颜色 颜色的常量 0 黑色 0x0 rgb(0,0,0) 255 红色 0xff rgb(255,0,0) 65280 绿色 0xff00 rgb(0,255,0) 65535 黄色 0xffff rgb(255,255,0) 16711680 蓝色 0xff0000 rgb(0,0,255) 16711935 紫红色 0xff00ff rgb(255,0,255) 16776960 青色 0xffff00 rgb(0,255,255) 16777215 白色 0xffffff rgb(255,255,255) rgb(red,green,blue) 107 设置对象文本中的字号 "fontsize object.fontsize = 磅值 '1-127 108 文本加粗 "fontbold属性 Object.fontbold =逻辑值 '逻辑值为true为加粗 逻辑值为false时为不加粗 109 文本斜体 "fontltalic属性 Object.fontitalic =逻辑值 '逻辑值为true为斜体 逻辑值为false时为不斜体 110 文本下划线 "fontunderline 属性 Object.fontunderline =逻辑值 '逻辑值为true为有下划线 逻辑值为false时为无下划线 111 文本字体 "fontname 属性 Object.fontname=字体名称 112 文本的对齐格式 "textalign 属性 Object.textalign =常量 对齐方式的常量有: 0 默认 文本左对齐,日期,数据右对齐 1 左对齐 2 中对齐 3 右对齐 4 均匀分布 113 文本的排列方式 "vertical 属性 横排 竖排 对象.vertical =逻辑值 '逻辑值为true为竖排 逻辑值为false时为横排(默认) 114 控制文本框的输入值 "inputmask 属性 文本框.inputmask = 显示格式 显示格式有 0 数字 必须输入 9 数字 可选输入 L 字母 必须输入 Z 字母 可选输入 A 字母或数字 必须输入 a 字母或数字 可选输入 & 任一字符 必须输入 c 任一字符或空格 可选输入 < 转换为小写 >转换为大写 password 掩码显示 # 数字或空格 可选输入 允许使用+ —号 '例如 限定密码输入框为5-8个字符 Sub form_load() Me.密码.inputmask = >"AAAAAaaa" Me.密码.inputmask = "password" End Sub 115 英文字母的大小写转换 "strconv函数 StrConv(字符串,格式常数) 格式常数如下 1 大写 vbuppercase 2 小写 vblowercase 3 首字母大写 vbpropercase 4 全角 vbwide 8 半角 vbnarrow 64 系统缺省页转换为unicode vbunicode 12 8unicode转换为系统缺省 vbformunicode 116 字符串换行显示 "Chr()函数 Chr(字符编码) '字母编码为0-255 10 13 为换行 15为空格 换行时 相当于vbcrlf 117 字符查找 "InStr()函数 InStr(查找起始位置,查找字符串,被查找字符,查找方式) '查找方式默认为 vbtextcompare 查找起始位置为数字 例如1 例如 判断员工姓名是否包含指定字符 Sub 判断 () On Error GoTo 错误 Dim n As String n=InStr(1,Me.指定,Me.姓名,vbtextcompare) If n Then msgbox Me.姓名 & "第" & n & "位是" & Me.指定 Else msgbox Me.姓名 & "不包含" & Me.指定 End If:Exit Sub 错误: msgbox Err.description End Sub 118 快速对某个数据进行替换 "replace 函数 Replace(字符串,被替换字符,替换为的字符,起始位置,替换个数) ' 后2个可以省略,如替换个数缺省时,替换所有符合的字符 例如 要把所有职务 中 业务员 替换成 业务经理 Sub 替换() On Error GoTo 错误 Me.职务=Replace(Me.职务,text前,text后) 'text 前为 业务员 text后为 业务经理 Exit Sub 错误: End Sub 119 数值转换为货币 "formatcurrency 函数 formatcurency(数值) 120 四舍五入到整数 CInt(数据) 向下取整 "int(数据) "fix(数据) 负数向下取整 用fix函数 121 四舍五入到指定位数 Round() Round(数据,位数) 122 数值转成百分数 "FormatPercent 函数 FormatPercent() 123 获取指定范围内的随机数 "rnd() 获取指定 a-b区间的随机数 "(b-a+1)*rnd()+a 获取指定 a-b区间的随机整数 "int(b-a+1)*rnd()+a 124 获取系统时间 "time() 获取当前时间 time 获取当前日期 Date 获取当前日期及时间 now 132 将字符串转换为标准格式的日期 "datevalue函数 datevalues(字符串) 133 将日期格式化 "format函数 Format(欲格式的数据,格式) 标准日期 2015-1-1 格式缺省 长日期 2015年1月1日星期六 "Long date 中等日期15-01-01 "medium date" 短日期 2012-1-1 "short date" 134 获取日期的 年 月 日 year month day 135 获取日期的 时 分 秒 hour minute second 136 获取日期对应的星期 "weekday weekdayname() weekday(日期) '得到是数字 weekdayname(weekday(日期)) '得到是星期几的中文 137 获取两个日期之间的间隔 "datediff() datediff(单位,起始日期,结束日期) 单位有: yyyy 年 '不足一个单位的返回0 q 季度 m 月 d 日 ww 周 w 一周的日数 y 一年的日数 例如 计算 2016年12月31日与2016年1月1日之前的间隔 msgbox Datediff("yyyy",2016-1-1,2016-12-31) '间隔年 138 计算经过N天后的日期 "dateadd dateadd(单位,数量,日期) 单位如上,数据可以取负,代表取之前的日期 05 数据排序技巧 139 当前窗体排序 " orderby orderbyon属性 Me.orderby="排序字段名" '排序字段名 可以是文本框引用 或者列表和组合框 Me.orderbyon=true '两个属性要一起用 才会生效 140 恢复排序 Me.orderbyon =False 141 多字段排序 Me.orderby ="字段1,字段2"'主要字段放前面,次要字段放后面 142 反序 Me.orderby="字段 desc" '在字段后加空格及desc 代表从大到小 143 打开其他窗体时 对其他窗体排序 先用docmd.openform 打开窗体 然后用 forms!窗体名.orderby 排序 再用forms!窗体名.orderbyon启用排序 144 报表的排序和窗体一致 145 例如 窗体有两组合框控件 T1 T2 现要引用T1 T2 对窗体排序 ,其中t1 正序 t2降序 代码为 Me.orderby=t1 & *,*& t2 & "desc" Me.orderbyon =True 例如 Me.OrderBy = T主要 & "," & T次要 & " desc" Me.OrderByOn = True 148 报表打开时,通过对话框制定排序 例如 在报表打开时,在report_open事件中添加以下代码 [变量]=inputbox("") Me.orderby =变量 & " desc" '" desc"为反序 mne.orderbyon = true 149 对子窗体进行排序 forms!主窗体名.子窗体名.form.orderby = 排序字段 forms!主窗体名.子窗体名.form.orderbyon =True 如是当前窗体的子窗体 可以简写me.子窗体.form 150 通过选项按钮制定排序依据 "if then else" 例如 选项卡 fra_排序 为两选择 升序和降序 T排序为排序字段名 在T排序的更新后事件中添加以下代码 Dim opt_order As String If Fra_排序 = 1 Then opt_order = "" Else opt_order = " desc" End If Me.OrderBy = Me.T排序 06 数据查询技巧 169 跳转到下一条记录 "docmd对象,gotorecord方法, acnext常量" 170 跳转到第一条记录 "docmd对象,gotorecord方法, acfirst常量" 171 跳转到最后一条记录 "docmd对象,gotorecord方法, aclast常量" 172 跳转到上一条记录 "docmd对象,gotorecord方法, acprevious常量" DoCmd.GoToRecord , , 常量 在最后一条记录时跳转下一条 和在第一条跳转到上一条时,会报错,建议用on errof GoTo 语句等。 173 定位到指定行号 "docmd对象,gotorecord方法, acgoto常量" DoCmd.GoToRecord , , acGoTo, T定位 'T定位为数字 跳转行数大于表时,不会报错 也不会继续跳转 174 查询指定数据的记录 "docmd对象的gotocontrol方法 findrecord方法" docmd.gotocontrol 字段名 '字段名前后有"" docmd.findrecord 字段值'字段值前后有"" 175 通过在文本框中输入数据来查询 docmd.gotocontrol 字段名 '字段名前后有"" docmd.findrecord 文本框名 176 继续查找满足条件的记录 "docmd对象的findnext方法" 在查到在指定记录后,新增按钮添加以下代码 docmd.gotocontrol 字段名 '字段名前后有"" docmd.findnext 177 通过在下位列表中选择选项来查询 方法和文本框中一样 docmd.gotocontrol 字段名 '字段名前后有"" docmd.findrecord 组合框名 178 查询以指定数据开头的记录 docmd.gotocontrol 字段名 '字段名前后有"" docmd.findrecord 字段值 & "*"'字段值前后有"" 179 查询以指定数据结尾的记录 docmd.gotocontrol 字段名 '字段名前后有"" docmd.findrecord "*"&字段值 '字段值前后有"" 180 查询包含指定数据的记录 docmd.gotocontrol 字段名 '字段名前后有"" docmd.findrecord "*"&字段值& "*" '字段值前后有"" 181 在子窗体中查询数据 查询子窗体数据前,要先用setfocus将焦点移动到子窗体,然后再用setfocus将焦点移动到制定字段 forms!主窗体名.子窗体名.setfocus forms!主窗体名.子窗体名!字段名.setfocus 最后用docmd对象的findrecord方法查找 docmd.findrecord "*"&字段值& "*" '字段值前后有"" 字段值可以为文本框名和组合框名 182 实现继续查询 "gotocontrol方法 findrecord方法" 如果查询按钮不是只查第一条数据,希望再次单击时,继续查下一个符合的记录,再查询时把docmd对象的findrecord方法的findfirst属性设置为false docmd.gotocontrol 字段名 '字段名前后有"" docmd.findrecord "*"&字段值& "*",findfirst:=False '字段值前后有"" 183 不使用通配符查询包含某个数据的记录 "findrecord方法的acanywhere常量" docmd.gotocontrol 字段名 '字段名前后有"" docmd.findrecord 字段值,acanywhere'字段值前后有"" 184 灵活设置查询字段查询数据 例如 指定组合框T字段作为查询字段名 指定文本框T字段值作为查询字段值 If IsNull(T字段) Then Me.T字段.SetFocus MsgBox ("没有选择查询字段") Exit Sub ElseIf IsNull(T字段值) Then Me.T字段值.SetFocus Else DoCmd.GoToControl T字段 DoCmd.FindRecord T字段值, acAnywhere, FindFirst:=False End If 185 使用LiKe进行模糊查询 "findnext方法 nomatch属性,bookmark属性" 在DAO中,可以用记录集的findnext方法查找符合条件的记录 re.findnext 字段名 关系运算符 条件 '关系运算符有Like 和 = 以及not like,当是模糊数据时,不能用= 例如 在姓名文本框中数据一个姓后,查询符合条件的数据 Dim db As DAO.Database Dim rs As DAO.Recordset Dim sch As String Set db = CurrentDb() '制作当前记录集的副本 Set rs = Me.RecordsetClone '将记录集的书签与当前窗体中的书签同步 rs.Bookmark = Me.Bookmark '设置查询的字段和内容 sch = "[姓名] Like" & "'*" & txt_查询 & "*'" rs.FindNext sch '查询结果处理 If rs.NoMatch = True Then '没有匹配结果打开提示对话框 MsgBox "找不到符合条件的记录" Else '有匹配记录时,将副本中的书签同步到当前窗体中 Me.Bookmark = rs.Bookmark End If 186 在立即窗口在显示查询结果 "debug对象的print方法" DAO 例如在 立即窗口中显示记录集中的所有姓名、职务及实得工资 Dim db As dao.Database Dim rs As dao.Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("Q_员工工资") rs.MoveFirst Do Until rs.EOF = True Debug.Print rs!姓名, rs!职务, rs!实得工资 rs.MoveNext Loop rs.Close: Set rs = Nothing db.Close: Set db = Nothing 187 在立即窗口显示查询结果 ADO Dim cn As New adodb.connection Dim rs As New adodb.recordset Set cn = currentproject.comnection rs.open "Q_员工工资",cn Do Until rs.EOF = True Debug.Print rs!姓名, rs!职务, rs!实得工资 rs.MoveNext Loop rs.Close: Set rs = Nothing db.Close: Set cn = Nothing 188 查询指定日期的数据记录 dao Dim db As DAO.Database Dim rs As DAO.Recordset Dim sch As String Set db = CurrentDb() '制作当前记录集的副本 Set rs = Me.RecordsetClone '将记录集的书签与当前窗体中的书签同步 rs.Bookmark = Me.Bookmark '设置查询的字段和内容 sch = "[日期] = #" & txt_日期 & "#" rs.FindNext sch '查询结果处理 If rs.NoMatch = True Then '没有匹配结果打开提示对话框 MsgBox "找不到符合条件的记录" Else '有匹配记录时,将副本中的书签同步到当前窗体中 Me.Bookmark = rs.Bookmark End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing 189 查询日期范围内的数据 Dim db As DAO.Database Dim rs As DAO.Recordset Dim sch As String Set db = CurrentDb() '制作当前记录集的副本 Set rs = Me.RecordsetClone '将记录集的书签与当前窗体中的书签同步 rs.Bookmark = Me.Bookmark '设置查询的字段和内容 sch = "[日期] = between #" & 开始日期 & "# and #" & 结束日期 & "#" rs.FindNext sch '查询结果处理 If rs.NoMatch = True Then '没有匹配结果打开提示对话框 MsgBox "找不到符合条件的记录" Else '有匹配记录时,将副本中的书签同步到当前窗体中 Me.Bookmark = rs.Bookmark End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing 190 查询上下限数据 Dim db As DAO.Database Dim rs As DAO.Recordset Dim sch As String Set db = CurrentDb() '制作当前记录集的副本 Set rs = Me.RecordsetClone '将记录集的书签与当前窗体中的书签同步 rs.Bookmark = Me.Bookmark '设置查询的字段和内容 sch = "[金额] >=" & 下限 & "and" & "[金额] <= " & 上限 rs.FindNext sch '查询结果处理 If rs.NoMatch = True Then '没有匹配结果打开提示对话框 MsgBox "找不到符合条件的记录" Else '有匹配记录时,将副本中的书签同步到当前窗体中 Me.Bookmark = rs.Bookmark End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing 193 使用and关键字查询数据'使用 and 前 需用isnull 对 下限 上限 日期 等进行空值判定 Dim db As DAO.Database Dim rs As DAO.Recordset Dim sch As String Set db = CurrentDb() '制作当前记录集的副本 Set rs = Me.RecordsetClone '将记录集的书签与当前窗体中的书签同步 rs.Bookmark = Me.Bookmark '设置查询的字段和内容 sch = "[金额] >=" & 下限 & "and" & "[金额] <= " & 上限 & " and [日期] = between #" & 开始日期 & "# and #" & 结束日期 & "#" rs.FindNext sch '查询结果处理 If rs.NoMatch = True Then '没有匹配结果打开提示对话框 MsgBox "找不到符合条件的记录" Else '有匹配记录时,将副本中的书签同步到当前窗体中 Me.Bookmark = rs.Bookmark End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing 194 使用or 关键字查询数据 '使用 or 前 需用isnull 对 下限 上限 日期 等进行空值判定 Dim db As DAO.Database Dim rs As DAO.Recordset Dim sch As String Set db = CurrentDb() '制作当前记录集的副本 Set rs = Me.RecordsetClone '将记录集的书签与当前窗体中的书签同步 rs.Bookmark = Me.Bookmark '设置查询的字段和内容 sch = "[金额] >=" & 下限 & "and" & "[金额] <= " & 上限 & " or [日期] = between #" & 开始日期 & "# and #" & 结束日期 & "#" rs.FindNext sch '查询结果处理 If rs.NoMatch = True Then '没有匹配结果打开提示对话框 MsgBox "找不到符合条件的记录" Else '有匹配记录时,将副本中的书签同步到当前窗体中 Me.Bookmark = rs.Bookmark End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing 195 处理 Or 或 And 的出错 '用isnull 先行判定是否为空 Dim db As DAO.Database Dim rs As DAO.Recordset Dim sch1 As String Dim sch2 As String Dim sch3 As String Dim sch As String Set db = CurrentDb() Set rs = Me.RecordsetClone rs.Bookmark = Me.Bookmark '判断条件是否为空 If IsNull(txt_部门) Then MsgBox "请输入查询部门" ElseIf IsNull(txt_工资1) Then MsgBox "请输入工资条件1" ElseIf IsNull(txt_工资2) Then MsgBox "请输入工资条件2" '当所有条件都不为空时,执行查询程序 Else sch1 = "[部门] like" & "'*" & txt_部门 & "*' " sch2 = "[实得工资]>=" & txt_工资1 sch3 = "[实得工资]<=" & txt_工资2 sch = sch1 & " and (" & sch2 & " or " & sch3 & " )" rs.FindNext sch If rs.NoMatch Then MsgBox "没有满足条件的记录" Else Me.Bookmark = rs.Bookmark End If End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing 196 快速筛选制定条件的所有数据记录 "filter属性 和filteron 属性" 对象.Filter =条件 对象.filteron=True 197 恢复以前的筛选 对象.filteron=False 198 模糊筛选 Me.Filter = "[商品名称] like " & " '*" & txt_商品名称 & "*'" Me.FilterOn = True 199 DAO中模糊筛选 Dim db As DAO.Database Dim rs As DAO.Recordset '获取数据集 Set db = CurrentDb() Set rs = db.OpenRecordset("生活健康用品", dbOpenDynaset) '筛选 rs.Filter = "[商品名称] like '*" & txt_商品名称 & "*'" Set rs = rs.OpenRecordset '将筛选后的记录集设置到窗体中 Set Me.Recordset = rs Me.Requery '重绘窗体 Set rs = Nothing: Set db = Nothing 200 在子窗体中筛选指定数据范围内的所有数据记录 Dim sch As String Dim sch1 As String Dim sch2 As String '判断是否输入筛选的零售价下界 If IsNull(txt_下界) Then MsgBox ("请输入零售价下界") txt_下界.SetFocus '判断是否输入筛选的零售价下界 ElseIf IsNull(txt_上界) Then MsgBox ("请输入零售价上界") txt_上界.SetFocus Else '获取筛选条件,在子窗体中执行筛选操作 sch1 = "[零售价]>= " & txt_下界 sch2 = "[零售价]<= " & txt_上界 sch = sch1 & " and " & sch2 Forms!F_生活健康用品.FD_生活健康用品.Form.Filter = sch Forms!F_生活健康用品.FD_生活健康用品.Form.FilterOn = True End If 201 将窗体中的筛选的记录显示在报表中 docmd.openreport 报表,acviewpreview '打开报表 reports!报表.filetr=Me.Filter reports!报表.filetron =True 215 使用AND 和or 筛选符合条件的所有记录 DAO Dim db As DAO.Database Dim rs As DAO.Recordset Dim sch As String Dim sch1 As String Dim sch2 As String Dim sch3 As String '获取记录集 Set db = CurrentDb() Set rs = db.OpenRecordset("Q_员工工资", dbOpenDynaset) '判断是否输入筛选条件 If IsNull(txt_部门1) Then MsgBox "请输入欲查询的第一个部门" txt_部门1.SetFocus ElseIf IsNull(txt_部门2) Then MsgBox "请输入欲查询的第二个部门" txt_部门2.SetFocus ElseIf IsNull(txt_工资) Then MsgBox "请输入欲查询的工资界限" txt_工资.SetFocus Else '所有条件都输入后,获取筛选条件 sch1 = "[部门] like " & "'*" & txt_部门1 & "*'" sch2 = "[部门] like " & "'*" & txt_部门2 & "*'" sch3 = "[实得工资]>=" & txt_工资 '使用and和or关键字连接筛选条件 sch = "(" & sch1 & " Or " & sch2 & ")" & "and" & sch3 '筛选 rs.Filter = sch '将筛选结果保存至当前窗体中 Set rs = rs.OpenRecordset Set Me.Recordset = rs Me.Requery End If Set rs = Nothing Set db = Nothing 216 筛选的数据指定排序 dao sort Dim db As DAO.Database Dim rs As DAO.Recordset Dim sch As String Dim sch1 As String Dim sch2 As String Dim sch3 As String '获取记录集 Set db = CurrentDb() Set rs = db.OpenRecordset("Q_员工工资", dbOpenDynaset) '判断是否输入筛选条件 If IsNull(txt_部门1) Then MsgBox "请输入欲查询的第一个部门" txt_部门1.SetFocus ElseIf IsNull(txt_部门2) Then MsgBox "请输入欲查询的第二个部门" txt_部门2.SetFocus ElseIf IsNull(txt_工资) Then MsgBox "请输入欲查询的工资界限" txt_工资.SetFocus Else '所有条件都输入后,获取筛选条件 sch1 = "[部门] like " & "'*" & txt_部门1 & "*'" sch2 = "[部门] like " & "'*" & txt_部门2 & "*'" sch3 = "[实得工资]>=" & txt_工资 '使用and和or关键字连接筛选条件 sch = "(" & sch1 & " Or " & sch2 & ")" & "and" & sch3 '筛选 rs.Filter = sch rs.sort =T部门 '将筛选结果保存至当前窗体中 Set rs = rs.OpenRecordset Set Me.Recordset = rs Me.Requery End If Set rs = Nothing Set db = Nothing 217 在打开的窗体中显示所有查询记录 openform方法 Where 语句 docmd.openform 窗体名 ,,sql语句 例如 打开员工工资时,只显示财务部数据 Dim sch As String '设置用于筛选的SQL语句 sch = "select * from Q_员工工资 where 部门='财务部'" '打开窗体时执行筛选操作 DoCmd.OpenForm "F_员工工资", , sch 218 在下拉列表中设置筛选条件查询所有记录 例如 打开员工工资时,选择下拉菜单后 Dim sch As String '设置用于筛选的SQL语句 sch = "select * from Q_员工工资 where 部门='"&T文本 &"'" ' sch="select * from Q_员工工资 where 部门 like '*"&T文本 &"*'" '打开窗体时执行筛选操作 Me.RecordSource = sch Me.requery 221 Where 实现多条件筛选 Dim sch1 As String Dim sch2 As String Dim sch3 As String '设置字符串的初始值 sch1 = "select * from Q_员工工资 where " sch2 = "" sch3 = " And " '判断部门筛选条件是否为空,不为空时追加筛选条件 If cmb_部门 <> "" Then sch2 = sch2 & "[部门] like '" & cmb_部门 & "'" End If If cmb_性别 <> "" Then '判断sch2是否为空,为空则追加AND关键字 If sch2 <> "" Then sch2 = sch2 & sch3 End If sch2 = sch2 & "[性别] like '" & cmb_性别 & "'" End If If txt_提成 <> "" Then If sch2 <> "" Then sch2 = sch2 & sch3 End If sch2 = sch2 & "[提成] >=" & txt_提成 End If If txt_基本工资 <> "" Then If sch2 <> "" Then sch2 = sch2 & sch3 End If sch2 = sch2 & "[基本工资] >=" & txt_基本工资 End If If txt_实得工资 <> "" Then If sch2 <> "" Then sch2 = sch2 & sch3 End If sch2 = sch2 & "[实得工资] >=" & txt_实得工资 End If '判断sch2是否为空,为空则表示一个筛选条件也没有设置 If sch2 = "" Then MsgBox "没有输入筛选条件" Exit Sub End If '根据输入的筛选条件得到最终用于筛选数据的SQL语句 sch1 = sch1 & sch2 '通过RecordSource属性和SQL语句实现筛选 Me.RecordSource = sch1 Me.Requery 222 Where 在新打开的窗体中实现多条件筛选 Dim Sch1 As String Dim Sch2 As String Dim Sch3 As String '为字符串设置初始值 Sch1 = "select * from Q_员工工资 where " Sch2 = "" Sch3 = " And " If txt_姓名 <> "" Then Sch2 = Sch2 & "[姓名] like '*" & txt_姓名 & "*'" End If '部门查询条件不为空时执行 If cmb_部门 <> "" Then '判断字符串字符串变量Sch2是否为空,不为空时添加And关键字 If Sch2 <> "" Then Sch2 = Sch2 & Sch3 End If Sch2 = Sch2 & "[部门] like '" & cmb_部门 & "'" End If If cmb_性别 <> "" Then If Sch2 <> "" Then Sch2 = Sch2 & Sch3 End If Sch2 = Sch2 & "[性别] like '" & cmb_性别 & "'" End If If txt_职务 <> "" Then If Sch2 <> "" Then Sch2 = Sch2 & Sch3 End If Sch2 = Sch2 & "[职务] like '*" & txt_职务 & "*'" End If If txt_提成下界 <> "" Then If Sch2 <> "" Then Sch2 = Sch2 & Sch3 End If Sch2 = Sch2 & "[提成] >=" & txt_提成下界 End If If txt_提成上界 <> "" Then If Sch2 <> "" Then Sch2 = Sch2 & Sch3 End If Sch2 = Sch2 & "[提成] <=" & txt_提成上界 End If If txt_基本下界 <> "" Then If Sch2 <> "" Then Sch2 = Sch2 & Sch3 End If Sch2 = Sch2 & "[基本工资] >=" & txt_基本下界 End If If txt_基本上界 <> "" Then If Sch2 <> "" Then Sch2 = Sch2 & Sch3 End If Sch2 = Sch2 & "[基本工资] <=" & txt_基本上界 End If If txt_实得下界 <> "" Then If Sch2 <> "" Then Sch2 = Sch2 & Sch3 End If Sch2 = Sch2 & "[实得工资] >=" & txt_实得下界 End If If txt_实得上界 <> "" Then If Sch2 <> "" Then Sch2 = Sch2 & Sch3 End If Sch2 = Sch2 & "[实得工资] <=" & txt_实得上界 End If '判断是否一个查询条件也没有输入 If Sch2 = "" Then '没有输入查询条件时,弹出提示信息框,退出程序 MsgBox "没有输入筛选条件" Exit Sub End If Sch1 = Sch1 & Sch2 Debug.Print Sch1 DoCmd.OpenForm "F_员工工资", , Sch1 07 数据 223 在数据表中追加记录 docmd对象 gotorecord属性,acnewrec常量 docmd.gotorecord,,acnewrec 224 统计数据记录数 "dcount dcount("字段","表或查询") 例如:判断单击新增按钮后 有没新增数据 Dim a As Integer Dim b As Integer '得到新增之前的记录数 a = DCount("ID", "生活健康用品") DoCmd.GoToRecord , , acNewRec '得到新增之后的记录数 b = DCount("ID", "生活健康用品") '判断是否新增记录 If b > a Then '记录条数变多,弹出新增记录成功提示 MsgBox "新增记录成功" Else '记录条数没变多,弹出没有新增记录提示 MsgBox "没有新增记录" End If 225 调取最大主键数 "DMAX dmax("主键名","表或查询") 226 确认是否追加记录 beforeinset事件 227 在非绑定窗体追加记录 "dao的 addnew方法 和update方法 Dim Db As DAO.Database Dim Rs As DAO.Recordset '得到“生活健康用品”数据表中的数据集 Set Db = CurrentDb() Set Rs = Db.OpenRecordset("生活健康用品", dbOpenDynaset) '新增记录 Rs.AddNew Rs!ID = Me!txt_ID Rs!商品名称 = Me!txt_商品名称 Rs!条形码 = Me!txt_条形码 Rs!供应价 = Me!txt_供应价 Rs!零售价 = Me!txt_零售价 Rs!月销量 = Me!txt_月销量 '判断是否输入主键,主键为空时弹出提示对话框 If IsNull(txt_ID) Then '如果主键为自动编号 可省略当条 MsgBox "没输入主键" Else '更新记录 Rs.Update '更新记录后弹出已经新增记录提示 MsgBox "已新增" End If 228 在非绑定窗体追加记录 "ado的open方法 addnew方法 update方法 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "生活健康用品", cn, adOpenDynamic, adLockBatchOptimistic Me!txt_ID = DMax("ID", "生活健康用品") + 1 '如主键为自动编号,此处可不做 '新增记录 rs.AddNew rs!ID = Me!txt_ID rs!商品名称 = Me!txt_商品名称 rs!条形码 = Me!txt_条形码 rs!供应价 = Me!txt_供应价 rs!零售价 = Me!txt_零售价 rs!月销量 = Me!txt_月销量 '判断是否输入数据,以商品名称的输入为参考 If IsNull(txt_商品名称) Then MsgBox "没输入数据" Else '更新记录 rs.Update MsgBox "已新增" End If 229 删除第一条数据记录 "docmd对象,runcommand方法 On Error GoTo 退出 '跳转至第一条记录 DoCmd.GoToRecord , , acFirst '删除第一条记录 DoCmd.RunCommand acCmdDeleteRecord '单击“否”按钮时,退出程序 退出: 230 删除最后一条记录 On Error GoTo 退出 '跳转至最后一条记录 DoCmd.GoToRecord , , aclast '删除当条记录 DoCmd.RunCommand acCmdDeleteRecord '单击“否”按钮时,退出程序 退出: 231 删除指定数据记录 先跳到指定的记录 再删除 Sub T定位_afterupdate() DoCmd.GoToRecord , , acGoTo, T定位 End Sub Sub 删除_click() On Error GoTo 退出 '删除当条记录 DoCmd.RunCommand acCmdDeleteRecord '单击“否”按钮时,退出程序 退出: End Sub 232 逐条删除符合条件的记录 '判断是否输入删除条件 If IsNull(txt_部门) Then '没有输入删除条件时弹出提示对话框 MsgBox "没有输入删除条件" Else '取消删除时程序出错处理 On Error GoTo 错误处理 '筛选出符合条件的记录 Me.Filter = "[部门] like '*" & txt_部门 & "*'" Me.FilterOn = True '通过筛选出的记录的书签判断是否删除完毕 If Me.Recordset.EOF = True Then '书签位置大于最后一条记录,删除完毕 MsgBox "删除完毕!" Exit Sub Else '删除当前记录,然后退出程序 DoCmd.RunCommand acCmdDeleteRecord Exit Sub End If 错误处理: MsgBox "已取消删除!" End If 232 删除所有符合条件的记录 '删除所有部门符合指定条件的记录 Private Sub cmd_删除_Click() '当所有符合条件的数据删除完毕,或者没有符合条件的 _ 记录时,单击“删除”按钮出错 On Error GoTo 删除完毕 '禁用系统内置的删除提示对话框 Application.SetOption "Confirm Action Queries", 0 Application.SetOption "Confirm Document Deletions", 0 Application.SetOption "Confirm Record Changes", 0 '自定义删除提示对话框 Dim Msg As Integer Msg = MsgBox("确认全部删除?", vbOKCancel) '删除符合条件的对话框 If Msg = vbOK Then '删除所有符合条件的记录 Do While Me.Recordset.EOF = False Me.Filter = "[部门] like '*" & txt_部门 & "*'" Me.FilterOn = True DoCmd.RunCommand acCmdDeleteRecord Loop 删除完毕: MsgBox "删除完毕!" Else MsgBox "已取消删除!" End If '显示删除所有符合条件的记录后剩余的记录 Me.FilterOn = False '启用系统的内置对话框 Application.SetOption "Confirm Action Queries", 1 Application.SetOption "Confirm Document Deletions", 1 Application.SetOption "Confirm Record Changes", 1 End Sub 233 修改指定范围内的所有数据 '删除金额在指定数值范围内的所有记录 Private Sub cmd_删除_Click() '没有符合条件的记录时出错,将出错信息转换为删除完毕 On Error GoTo 删除完毕 '屏蔽默认的对话框 Application.SetOption "Confirm Action Queries", 0 Application.SetOption "Confirm Document Deletions", 0 Application.SetOption "Confirm Record Changes", 0 Dim Msg As Integer Dim sch As String Dim sch1 As String Dim sch2 As String '获取筛选条件 If IsNull(txt_下界) Then '没有输入金额下界时,弹出提示对话框,下界文本框获取焦点 MsgBox "请输入金额下界" txt_下界.SetFocus ElseIf IsNull(txt_上界) Then '没有输入金额上界时,弹出提示对话框,上界文本框获取焦点 MsgBox "请输入金额上界" txt_上界.SetFocus Else '上下界均输入后,将上下界转换为条件字符串 sch1 = "[金额]>=" & txt_下界 sch2 = "[金额]<=" & txt_上界 sch = sch1 & " and " & sch2 '弹出对话框,确认是否需要删除 Msg = MsgBox("确认全部删除?", vbOKCancel) If Msg = vbOK Then '逐条删除符合条件的记录,直到删除完为止 Do While Me.Recordset.EOF = False '删除出符合条件的记录 Me.Filter = sch Me.FilterOn = True '删除筛选出的记录的第一条 DoCmd.RunCommand acCmdDeleteRecord Loop 删除完毕: MsgBox "删除完毕!" Else MsgBox "已取消删除!" End If End If '显示删除之后的所有记录 Me.FilterOn = False '恢复默认的对话框设置 Application.SetOption "Confirm Action Queries", 1 Application.SetOption "Confirm Document Deletions", 1 Application.SetOption "Confirm Record Changes", 1 End Sub 234 修改指定日期范围内的所有数据 '删除所有付款期在指定日期范围内的记录 Private Sub cmd_删除_Click() '没有符合条件的记录时出错,显示删除完毕 On Error GoTo 删除完毕 '屏蔽默认的对话框 Application.SetOption "Confirm Action Queries", 0 Application.SetOption "Confirm Document Deletions", 0 Application.SetOption "Confirm Record Changes", 0 Dim Msg As Integer Dim sch As String Dim sch1 As String Dim sch2 As String '获取筛选条件 If IsNull(txt_下界) Then '没有输入起始日期时弹出提示信息 MsgBox "请输入起始日期", , "起始日期未输入" ElseIf IsNull(txt_上界) Then '输入起始日期但是没有输入结束日期弹出的提示信息 MsgBox "请输入结束日期", , "结束日期未输入" Else '日期范围完整输入后,将日期范围转换为条件字符串 sch1 = "[付款期]>=#" & txt_下界 & "#" sch2 = "[付款期]<=#" & txt_上界 & "#" sch = sch1 & " and " & sch2 '弹出对话框,确认是否需要删除 Msg = MsgBox("确认全部删除?", vbOKCancel) If Msg = vbOK Then '逐条删除指定日期范围内的记录,直至完全删除 Do While Me.Recordset.EOF = False '筛选出付款期在指定日期范围的记录 Me.Filter = sch Me.FilterOn = True '删除筛选出的记录的第一条 DoCmd.RunCommand acCmdDeleteRecord Loop 删除完毕: MsgBox "删除完毕!" Else MsgBox "已取消删除!" End If End If '显示删除之后的所有记录 Me.FilterOn = False '启用系统内置对话框 Application.SetOption "Confirm Action Queries", 1 Application.SetOption "Confirm Document Deletions", 1 Application.SetOption "Confirm Record Changes", 1 End Sub 235 修改指定位置的数据 "update事件 如果需要修改某一条数据,可以通过绑定窗体跳转到当条数据进行修改,再用afterupdate事件来实现 '跳转至指定数据,如果跳转之前修改了数据,提示是否需要修改 Private Sub txt_定位_AfterUpdate() On Error GoTo 取消更新 DoCmd.GoToRecord , , acGoTo, txt_定位 取消更新: End Sub '确认数据的更新 Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Msg As Integer Msg = MsgBox("确定要更新吗?", vbOKCancel) If Msg = vbCancel Then Cancel = True End If End Sub 236 使用SQL语句编辑记录 "Select From max()函数 1 单击主键时,预处理主键 如主键为自动编号,可省略此处 '获取数值型主键,清空其余文本框中数据 Private Sub cmd_主键_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim Sql As String Set db = CurrentDb() '通过SQL语句获取最大主键 Sql = "select max(员工编号) as 最大主键 from 员工基本资料" Set rs = db.OpenRecordset(Sql, dbOpenDynaset) rs.MoveFirst '新增记录预处理 Me!txt_员工编号 = rs![最大主键] + 1 Me!txt_姓名 = "" Me!txt_性别 = "" Me!txt_部门 = "" Me!txt_职务 = "" Me!txt_联系电话 = "" End Sub 2正常用dao追加 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "生活健康用品", cn, adOpenDynamic, adLockBatchOptimistic Me!txt_ID = DMax("ID", "生活健康用品") + 1 '如主键为自动编号,此处可不做 '新增记录 rs.AddNew rs!ID = Me!txt_ID rs!商品名称 = Me!txt_商品名称 rs!条形码 = Me!txt_条形码 rs!供应价 = Me!txt_供应价 rs!零售价 = Me!txt_零售价 rs!月销量 = Me!txt_月销量 '判断是否输入数据,以商品名称的输入为参考 If IsNull(txt_商品名称) Then MsgBox "没输入数据" Else '更新记录 rs.Update MsgBox "已新增" End If 237 使用update语句更新数据 Sub 利润() Dim Sql As String Dim db As DAO.Database Set db = CurrentDb '用于更新“利润”字段的SQL语句 Sql = "Update T_生活用品 set 利润=(零售价-供应价)*月销量" '在当前数据库中运行SQL语句 db.Execute Sql db.Close: Set db = Nothing End Sub 8 数据记录和统计和打印技巧 245 统计有多少条记录 dcount("字段","表或查询","条件式1"&And &"条件式2" & Or & "条件式3") '如不制定条件 则为所有 250 打开打印对话框 "accmdprint docmd.runcommand accmdprint 251 打印窗体当前显示页 '打印 Private Sub cmd_打印_Click() DoCmd.OpenForm "F_员工工资" DoCmd.PrintOut acSelection End Sub 252 打印数据表中的数据"docmd对象 print方法 opentalbe方法" '打印 Private Sub cmd_打印_Click() DoCmd.Opentalbe "T_员工工资" DoCmd.PrintOut acPAGES End Sub 253 将报表内容打成彩色 '更改打印色彩模式为彩色 Private Sub cmd_彩色_Click() '以预览模式打开报表 DoCmd.OpenReport "R_生活健康用品", acViewPreview '更改打印色彩模式为彩色 Reports("R_生活健康用品").Printer.ColorMode = acPRCMColor 'colormode有两个常量,acprcmcolor为黑白 End Sub 254 设置打印页面的大小 '将报表打印纸张设置为B5 Private Sub cmd_B5_Click() Dim Str As String On Error Resume Next '通过对话框得到欲设置的报表名称 Str = InputBox("请输入报表名称") '以预览视图打开报表 DoCmd.OpenReport Str, acViewPreview '设置打印的纸张大小 Reports(Str).Printer.PaperSize = acPRPSEnvB5 '对应纸张需打印机存在 End Sub 255 设置打印的页边距 '在窗体中设置报表的页边距 Private Sub 设置_Click() '没有设置页边距或页边距设置错误时出错 On Error GoTo 设置错误 '以打印预览视图打开报表“R_生活健康用品” DoCmd.OpenReport "R_生活健康用品", acViewPreview '设置报表“R_生活健康用品”上边距 Reports("R_生活健康用品").Printer.TopMargin = txt_上 * 56.7 '设置报表“R_生活健康用品”下边距 Reports("R_生活健康用品").Printer.BottomMargin = txt_下 * 56.7 '设置报表“R_生活健康用品”左边距 Reports("R_生活健康用品").Printer.LeftMargin = txt_左 * 56.7 '设置报表“R_生活健康用品”右边距 Reports("R_生活健康用品").Printer.RightMargin = txt_右 * 56.7 If 0 Then 设置错误: '出错时打开错误提示 MsgBox "页边距没有设置完整或设置错误!" End If End Sub 258 将需要的数据圈起来打印 '圈释零售价大于20元的数据 Private Sub 主体_Format(Cancel As Integer, FormatCount As Integer) Dim sH As Single Dim sV As Single Dim sW As Single '判断记录的零售价是否大于20元 If Me.零售价 >= 20 Then With Me.零售价 '得到零售价大于20元的零售价文本框中心位置 sH = .Left + .Width / 2 sV = .Top + .Height / 2 '得到零售价大于20元的零售价文本框的宽度 sW = .Width / 2 End With '为满足条件的零售价画椭圆 Me.Circle (sH, sV), sW, RGB(214, 214, 214), , , 0.28 End If End Sub 9 access与office其他组件的交互 259 通过ACCESS创建空白文档 '新建一个空白的Word文档 Private Sub cmd_word_Click() '定义两个对象 Dim wordApp As Object Dim wordDoc As Object '调用Word应用程序 Set wordApp = CreateObject("word.application") '创建的Word应用程序设置为可视 wordApp.Visible = True '在Word应用程序中新建空白Word文档 Set wordDoc = wordApp.Documents.Add '释放对象空间 Set wordApp = Nothing Set wordDoc = Nothing End Sub '创建一个空白的Word文档 Private Sub cmd_word_Click() '定义两个具体的对象 Dim wordApp As Word.Application Dim wordDoc As Word.Document '创建Word应用程序对象并添加空白文档 Set wordApp = CreateObject("word.application") Set wordDoc = wordApp.Documents.Add '设置Word应用程序可以状态为真 wordApp.Visible = True End Sub '创建一个空白的Word文档 Private Sub cmd_word_Click() '定义Word应用程序对象时使用New关键字 Dim wordApp As New Word.Application Dim wordDoc As Word.Document '创建空白Word文档 wordApp.Documents.Add wordApp.Visible = True '释放对象空间 Set wordApp = Nothing Set wordDoc = Nothing End Sub 262 创建基于模板的word文档