access-vba编程.pdf
1 ACCESS 与 VBA A AC CC CE ES SS S----V VB BA A 编编编编程程程程 2 ACCESS 与 VBA 第1章 控 件 常量 控件 常量 控件 acBoundObjectFrame 绑定对象框 acCheckBox 复选框 acComboBox 组合框 acCommandButton 命令按钮 acCustomControl ActiveX(自定义)控件 acImage 图像 acLabel 标签 acLine 线条 acListBox 列表框 acObjectFrame 未绑定对象框或图表 acOptionButton 选项按钮 acOptionGroup 选项组 acPage 页 acPageBreak 分页符 acRectangle 矩形 acSub 子窗体/子报表 acTabCtl 选项卡 acTextBox 文本框 acToggleButton 切换按钮 在在 VB 中对窗体控件的引用中对窗体控件的引用 键入包含控件的窗体或报表的标识符,后面紧接 运算符和控件的名称。例如,下列标识符将引用“订 单”窗体上“订单 ID”控件值 s[订单][订单 ID] 引用子窗体或子报表上的控件,不必使用“窗体”或“报表”属性为窗体或报表指定完整的标识符。例 如,可以使用下列标识符来引用“订单”子窗体上的“数量”控件 s[订单][订单子窗体][数量] 判断窗体或报表中控件的数目,然后将该数目赋给一个变量。 判断窗体或报表中控件的数目,然后将该数目赋给一个变量。 Dim intControls As Integer Dim intReportControls As Integer intControls sEmployees.Count intReportControls ReportsFreightCharges.Count 设置控件可见性设置控件可见性 Dim i, ii As Integer For ii 3 To 10 Me.Controls.Itemii.Visible True Next For i 11 To 22 Me.Controls.Itemi.Visible False Next 按特殊名在按特殊名在 VBA 中设置控件的可见性中设置控件的可见性 For i 27 To 47 If Me.Controls.Itemi.Name Like “A*“ Then 3 ACCESS 与 VBA Me.Controls.Itemi.Visible False End If Next 指定一个控件能否接受焦点指定一个控件能否接受焦点 Enabled 属性 me.控件.Enabled true能 false不能 指定一个控件能否被编辑指定一个控件能否被编辑 locked 如 me.控件.Locked true me.控件.Locked false 设置控件标题显示的文字设置控件标题显示的文字 Me.控件.Caption “显示窗体“ 设置标签颜色设置标签颜色 Me.LabelColor 200 获得焦点及失去焦点时字段变更颜色。获得焦点及失去焦点时字段变更颜色。 如果你的控件是文本框,名称为“txt 字段” ,写如下代码 Private Sub txt 字段_GotFocus Me.txt 字段.BackColor 12632256 End Sub 当中“12632256”是灰色,你可以自己选择希望的颜色,如果想在失去焦点时改为原来的颜色,写如下代 码 Private Sub txt 字段_LostFocus Me.txt 字段.BackColor 16777215 End Sub 使标签闪烁以引人注意使标签闪烁以引人注意 设置窗体的 TimerInterval 值为 1000 1 秒. s OnTimer 加入代码 Sub _Timer YourTextLabel.Visible Not YourTextLabel.Visible End_Sub 设置标签字体颜色设置标签字体颜色 Me.Label1.ForeColor 设置文本框颜色设置文本框颜色 Me.TextColor 300 设置文本框字体颜色设置文本框字体颜色 Me.TextFontColor 500 标签等左边距离标签等左边距离 Me.Label2.Left 2200 定位控件定位控件 Me.控件.Top 8290 Me. 控件.Left 100 标签等字体粗细标签等字体粗细 Me.Label2.FontWeight 20000 控件边框颜色控件边框颜色 Me.Label2.BorderColor 0 4 ACCESS 与 VBA 控件边框线条控件边框线条 BorderStyle 属性使用以下设置 透明 0 (仅对于标签、图表和子报表而言是默认值)透明的 实线 1 (默认值)实线 虚线 2 虚线 短虚线 3 短虚线 点线 4 点线 稀疏点线 5 点距较宽的点线 点划线 6 虚线与点线组合的点划线 点点划线 7 虚线-点线-点线组合的点点划线 双实线 8 双实线 指定控件的边框宽度指定控件的边框宽度 使用 BorderWidth 属性可以指定控件的边框宽度 取值0 或 1-6 指定控件是否透明指定控件是否透明 使 BackStyle 属性可以指定控件是否透明。 True 、False 解除子窗体锁定解除子窗体锁定 Me.进_子窗体.Locked False 解除子窗体锁定 将窗体上所有控件的输入法关掉将窗体上所有控件的输入法关掉 来源不祥 Private Sub _OpenCancel As Integer Dim ctl As Access.Control For Each ctl In Me.Controls Debug.Print ctl.Name 下月最后一个周 5 到月底的天数 SELECT WeekdayDateAdd“m“,2,DateSerialYearDate,MonthDate,1-11 Mod 7 AS 下月最后一个周 5 到月 底的天数; 本月最后一个周 5 的日期 SELECT DateAdd“m“,1,DateSerialYearDate,MonthDate,1-1-WeekdayDateAdd“m“,1,DateSerialYearDate, MonthDate,1-11 Mod 7 AS 本月最后一个周 5 的日期; 下月最后一个周 5 的日期 SELECT DateAdd“m“,2,DateSerialYearDate,MonthDate,1-1-WeekdayDateAdd“m“,2,DateSerialYearDate, MonthDate,1-11 Mod 7 AS 下月最后一个周 5 的日期; 16 ACCESS 与 VBA 第4章 数据输入、查询、计算、连接 通过英特网的通过英特网的 ACCESS 联接联接 在 ACCESS 中使用 ADO Private Sub ABC_Click Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.OPEN “DSNalwin;UID;PWD;“ rs.OPEN “Select * from tbTABLE“, cn, adOpenDynamic, adLockReadOnly’ rs.ABC App.Path “ End Sub 用 VBA 编程把 Excel 表中数据追加到 Access 表中 用 VBA 编程把 Excel 表中数据追加到 Access 表中 Private Sub Command0_Click Do.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, “temp“, “c\temp.xls“, yes End Sub VB 语句删除记录语句删除记录 For I 1 To 20 SQL “DELETE 订单明细 ID FROM 订单明细 WHERE 订单明细 ID“ password;user idadmin; data source“ _ Jet OLEDBDatabase Password;“ Set appAccess New ADODB.Connection appAccess.Open strCn Set cat New ADOX.Catalog cat.ActiveConnection appAccess 路径改成自己的,如果有密码则在红色的 Password后面写上正确的密码,别的照抄就行了 如何更该链接表的设置 如何更该链接表的设置 来源ALEX 例 如 , 数 据 库 当 前 的 路 径 可 以 用application.CurrentProject.Path得 到 , 然 后 用 application.CurrentProject.Path “\link\abc.mdb“就可以指向数据库安装目录下面 link 子目录下的 ABC.MDB。 25 ACCESS 与 VBA 如何在如何在 ADP 启动时启动时,判断数据库连接是否有效并重新连接判断数据库连接是否有效并重新连接 这是微软 MSDN 中,在 ADP 项目中创建 ADP 的数据库的默认连接的代码 Public Function sCreateConnectionsSvrName As String, sUID As String, sPWD As String, sDatabase As String As String ******************************************************************** 该函数在 ADP 中检查连接,如果没有,它将通过输入参数创建一个连接 输入 sSvrName 数据库服务器名 sUID 用户名 sPWD 口令 sDatabase MSDE 数据库名 输出 连接状态 ******************************************************************** On Error GoTo sCreateConnectionTrap If Application.CurrentProject.BaseConnectionString ““ Then 表示 ADP 处于无连接状态 sConnectionString “PROVIDERSQLOLEDB.1;PASSWORD“ PERSIST SECURITY INFOTRUE;USER ID“ _ INITIAL CATALOG“ DATA SOURCE“ DATABASE“ PWD“ 后台数据库密码 tabDef.RefreshLink End If Next MsgBox “连接成功“ Do.Close ac, Me.Name End Sub 其实很简单只有两步,判断链接是否正确和刷新链接表。 数据库与照片的关系如何处理 数据库与照片的关系如何处理 有照片若干,怎样能在数据库中存储并显示 1、把照片放进数据库,照片的格式最好是 bmp,这样就可以在窗体上显示出来,不过这样数据库的体积会 暴增。设一个 OLE 字段,然后插入对象就行了(对着字段单击右键) 28 ACCESS 与 VBA 2、 不把照片放入数据库, 只把照片的路径保存到数据库中, 动态加载, 这样可以支持很多种图片格式。 (见 示例) If DirApplication.CurrentProject.Path , vbNullString, vbNullString, 3 注释给某个信箱发电子邮件 Shellcute hwnd, “open“, “mailtosst95“, vbNullString, vbNullString, 0 第第5章章 ACCESS表表 用 ADO 编程隐藏表 用 ADO 编程隐藏表 sub hide_table Dim cnn As New ADODB.Connection Dim cat As New ADOX.Catalog Set cat.ActiveConnection CurrentProject.Connection Dim tbl As ADOX.Table Dim pro As Property For Each tbl In cat.Tables Debug.Print tbl.name For Each pro In tbl.Properties Debug.Print pro.name 可得到第一個查詢 班级 总分 600 分以上人数 总分 550-600 人数 总分 550 以下人数 1 班 1 0 1 2 班 0 1 1 3 班 0 2 0 用代码在用代码在 ACCESS 中生成永久查询中生成永久查询 来源竹笛整理的技巧集 dim strSQL as string dim qdf as QueryDef strSQL “SELECT * from tblaa“ tblaa 为表 Set qdf CurrentDb.CreateQueryDef“创建的查询“, strSQL Do.OpenQuery qdf.Name 用代码删除一个已存在的查询用代码删除一个已存在的查询 来源爱赛思应用俱乐部 wxjgw Dim Query1 As QueryDef CurrentDb.QueryDefs.Refresh For Each Query1 In CurrentDb.QueryDefs If Query1.Name “想要删除的查询名称“ Then CurrentDb.QueryDefs.Delete Query1.Name 39 ACCESS 与 VBA Exit For End If Next Query1 使用 ADO 和 SQL 语句建立一个新查询 使用 ADO 和 SQL 语句建立一个新查询 来源ACCESS 中国 huanghai Dim cat As New ADOX.Catalog Dim As New ADODB.Command Set cat.ActiveConnection CurrentProject.Connection .CommandText “SELECT * FROM 表 1“ cat.Views.Append “newView“, 以窗体的文体框为条件进行模糊查询时查询的设计视图中准则以窗体的文体框为条件进行模糊查询时查询的设计视图中准则 Like IIfIsNull[s][存书查询窗体][作者],*,* “ - “; Errore Next End Sub 62 ACCESS 与 VBA 执行上述代码将显示如下结果 1 - 应用程序定义或对象定义错误 2 - 应用程序定义或对象定义错误 3 - 无 GoSub 返回 4 - 应用程序定义或对象定义错误 5 - 无效的过程调用或参数 6 - 溢出 7 - 内存溢出 对话框返回文本框内容对话框返回文本框内容 Boxprompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context] Box 函数的语法具有以下几个命名参数 Prompt必需的。作为对话框消息出现的字符串表达式。prompt 的最大长度大约是 1024 个字符,由所用 字符的宽度决定。如果 prompt 包含多个行,则可在各行之间用回车符 Chr13、换行符 Chr10 或回车换 行符的组合 Chr13 74 ACCESS 与 VBA 窗体 SELECT MSysObjects.Name FROM MsysObjects WHERE Left[Name],1““ AND MSysObjects.Type -32768 ORDER BY MSysObjects.Name; 表 SELECT MSysObjects.Name FROM MsysObjects WHERE Left[Name],1““ AND Left[Name],4 “Msys“ AND MSysObjects.Type1 ORDER BY MSysObjects.Name; 报表 SELECT MSysObjects.Name FROM MsysObjects WHERE Left[Name],1““ AND MSysObjects.Type -32764 ORDER BY MSysObjects.Name; 模块 SELECT MSysObjects.Name FROM MsysObjects WHERE Left[Name],1““ AND MSysObjects.Type -32761 ORDER BY MSysObjects.Name; 宏 SELECT MSysObjects.Name FROM MsysObjects WHERE Left[Name],1““ AND MSysObjects.Type -32766 ORDER BY MSysObjects.Name; 文件被创建或最后修改后的日期和时间 FileDateTime 函数文件被创建或最后修改后的日期和时间 FileDateTime 函数 返回一个 Variant Date,此为一个文件被创建或最后修改后的日期和时间。 语法 FileDateTimepathname 必要的 pathname 参数是用来指定一个文件名的字符串表达式。 pathname 可以包含目录或文件夹、 以及驱 动器。 ●适用于 VB、VBA。 ●用法传回值 FileDateTime“c\windows\文件名.com“ 让让 ACCESS 程序发出声音的函数程序发出声音的函数 Declare Function apisndPlaySound Lib “winmm“ Alias “sndPlaySoundA“ _ ByVal filename As String, ByVal snd_async As Long As Long Function PlaySoundsWavFile As String Purpose Plays a sound. Argument the full path and file name. If apisndPlaySoundsWavFile, 1 0 Then MsgBox “The Sound Did Not Play“ End If End Function 调用方法PlaySound “文件名.WAV“ 检测表中有无记录检测表中有无记录 tblAAAA,其中有一字段 MMM if isnulldlookup“[MMM]“,“tblAAAA“ then msgbox “此表无记录“ end if 使用表达式使一个文本框自动分为几段使用表达式使一个文本框自动分为几段,并按文本格式首行左空并按文本格式首行左空 2 字字 加上 chr码,chr32是空格,10 和 13 分别为换行和回车字符。 身份证号输入的检查(焦点移到下一控件时)身份证号输入的检查(焦点移到下一控件时) Private Sub 下一控件名称_GotFocus 75 ACCESS 与 VBA If LenMe.文本框 15 And LenMe.文本框 18 Then MsgBox “1111“ Me.文本框.SetFocus End If End Sub 如何使鼠标停留在组合框上时,使组合框自动打开如何使鼠标停留在组合框上时,使组合框自动打开 Private Sub 文本框_GotFocus Me[文本框].Dropdown End Sub 组合框里面有组合框里面有 20 行数据,现在需要双击组合框,组合框内数据会依次显示行数据,现在需要双击组合框,组合框内数据会依次显示 Private Sub Combo0_DblClickCancel As Integer If Combo0.ListCount 2, 1, tempInt, “万“, “亿“ End Function -------------------------------------------- 主函数 convertNum Function ConvertNumBaval Num As Variant As String Dim i As Integer, j As Integer Dim tempInt As Integer Dim tempStr, ResultStr As String tempStr CStrNum 转换成字符型 j LentempStr 取得长度 For i 1 To j 对每个数字进行大写转换 tempInt CIntMidtempStr, j - i 1, 1 ResultStr GetChoice1tempInt 函数原型为(详见 Delphi 的帮助) HWND FindWindow LPCTSTR lpClassName, // pointer to class name LPCTSTR lpWindowName // pointer to window name ; 此处,SciCalc 为计算器的类名,计算器为计算器的窗口标题} setWindowPosfwnd,HWND_NOTOPMOST,0,0,0,0,SWP_SHOWWINDOW or SWP_NOSIZE or SWP_NOMO VE; 函数原型为 BOOL SetWindowPos HWND hWnd, // handle of window HWND hWndInsertAfter, // placement-order handle int X, // horizontal position int Y, // vertical position int cx, // width int cy, // height UINT uFlags // window-positioning flags ; ShowWindowfwnd,SW_RESTORE; //显示已打开的「计算器」 函数原型为 BOOL ShowWindow HWND hWnd, // handle of window int nShow // show state of window ; RetWincc\windows\calc.,SW_SHOWNORMAL; //启动计算器 函数原型为 UINT Winc LPCSTR lpLine, // address of command line UINT uShow // window style for new application 89 ACCESS 与 VBA ; 运行“计算器”程序并检测返回值(从而利用返回值来判断可能发生的错误) 2.如何明确应用程序的“类名” 要控制应用程序,首先必须明确应用程序的“类名”。“类”的概念,Delphi 的程序已经非常清楚,如新建 一表单 1,该表单的“类名”为 T1。那么其它 Windows 程序的“类名”如何确定呢 值得一喜的是,Delphi 提供了一实用工具 Winsight,它正如一面照妖镜,不论何方妖怪,均会显露出它们 的“类名”。 使用 Winsight 的方法如下 ⑴运行 Winsight(程序名为 ws32.,与主文件 delphi32. 同一目录) ,见图①; ⑵从 Winsight 的菜单中选择“间谍”中的“跟随焦点”,见图②; ⑶运行“计算器”程序; ⑷在 Winsight 中显示出了目标,如图③所示。 软件环境中文 Win98/中文 Delphi5.0。 打开(工具-选项)打开(工具-选项) 一、Do.DoMenuItem acBar, 6, 11, , acMenuVer70 二、do.RunCommand.acoption 1、如何让窗体总在最前面、如何让窗体总在最前面 *API 函数声明 Declare Function SetWindowPos Lib “user32“ ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long As Long 注释常量声明 Private Const SWP_NOSIZE , vbNullString, vbNullString, 3 注释给某个信箱发电子邮件 Shellcute hwnd, “open“, “mailtosst95“, vbNullString, vbNullString, 0 7、如何得知、如何得知 TextBox 中文字所有的行数中文字所有的行数 *API 函数声明 Declare Function SendMessage Lib “user32“ Alias “SendMessageA“ ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any As Long Public Const EM_GETLINECOUNT Pwd密码“ 实例 Dim db As Database Set db OpenDatabase“C\db1.mdb“, False, False, “;Pwd1“ 若要使用 Data 控件,设定方法如下 1、设定 DatabaseName 属性 MDB 文件名称 / 含路径 2、设定 Connect 属性,將预设的字串 “Access“ 改成 “;Pwd密码“ 不含双引号 3、设定 RecordSource 属性 2、使用 ADO 命令打开 MDB 文件 在使用 ADODC 或 DataEnvironment 设定好之后,直接利用属性窗口修改 ConnectionString 属性附属于 ADODC 或 ConnectionSource 属性附属于 DataEnvironment 的 Connection 控件,修改的方法是在属性之后 增加以下参数 ;Jet OLEDBDatabase Password密码 除了 ADODC 及 DataEnvironment 之外, 直接使用 ADO 控件來打开含有密码的 mdb MDB 文件,设定 参数的方法也是相同的。 3、压缩加了密码的 MDB 文件CompactDatabase DBEngine.CompactDataBase “原 MDB 文件“, “新 MDB 文件“, , , “;pwd密码“ 实例例如 DBEngine.CompactDatabase “C\Db1.mdb“, “C\Db2.mdb“, , , “;pwd1“ 4、复加了密码的 MDB 文件 RepairDatabase 不必理会 MDB 文件设定的密码 DBEngine.RepairDataBase “MDB 文件“ 实例例如 DBEngine.RepairDataBase “C\Db1.mdb“ 以下给出一个函数可以使用 DAO 打开带密码保护的 MDB 数据库文件 Public Function OpenPasswordProtectedDatabaseDBPath As String, _ Password As String As Object On Error Resume Next 100 ACCESS 与 VBA Dim db As DAO.Database Set db DAO.OpenDatabaseDBPath, False, False, _ “;pwd“ pwd123;“ 提供者及密码 .properties“jet oledbremote table name“ “订单“ 原数据库中的表 end with catdb.tables.app set tbllink nothing end function 注在 vba 编辑器中引用“microsoft ado ext. 2.5 for ddl and security“以及 rosoft activex data objects 2.1/2.5/2.6/2.7 library“ 动手做一个专用解密器动手做一个专用解密器 密器也很费时,如果你对密器也很费时,如果你对 要了解Access数据库的加密方法。A要了解Access数据库的加密方法。A 67至79位为一固定67至79位为一固定 ,FA,C6,5,FA,C6,5 107 ACCESS 与 VBA 了。将67至79位的字符的ASCII码值分别与了。将67至79位的字符的ASCII码值分别与“86,FB,EC,37,5D,44,9C,FA, C6,E6,13 86,FB,EC,37,5D,44,9C,FA, C6,E6,13”进行异或运算,即可得到密码。进行异或运算,即可得到密码。 下面我们用VB编个小程序,来实现Acc es。请在窗体上放置一个通用对话框控件Commondialog1,其Firlter 属性设为 下面我们用VB编个小程序,来实现Acc es。请在窗体上放置一个通用对话框控件Commondialog1,其Firlter 属性设为“Access数据库文件 .mdbAccess数据库文件 .mdb”;文本框控件Text1,命令控件Command1,其C ap密码 ;文本框控件Text1,命令控件Command1,其C ap密码”。 代码如下。 代码如下 OptionOption ExplicitExplicit PrivatePrivate SubSub C omssword C omssword AsAs StringString DimDim temptemp AsAs Byce 12Byce 12 As As ByteByte DimDim ii AsAs IntegerInteger source 0 ource 1 source 0 ource 1 = = &HFB&HFB source 2source 2 = = &HEC&HEC source 3source 3 =urce 5 =urce 5 = = &H44&H44 source 6source 6 = = &ce 7&ce 7 = = &HFA&HFA source 8source 8 = = &HC6&HC6 source 9source 9 = = &Hrce 10&Hrce 10 = = &H28&H28 source 11source 11 = = &HE6&HE6 source 12source 12 = = &onDialog1.ShowOpen&onDialog1.ShowOpen IfIf CommonDialog1.Fil eNonDialog1.FileName CommonDialog1.Fil eNonDialog1.FileName FoForFoFor ii == 00 ToTo 1212 GetGet #1#1 67 67 ++ ii temp temp I f I f tntn ExitExit ForFor passwordpassword == passwordpassword && CC source isource i Next Next CloseClose #1#1 IfIf Len pa ss Len pa ss ThenThen Text1. TextText1. Text == ″该数据库没有加密该数据库没有加密 ″ ElseElse Text1. T ex Text1. T ex″ ++ passwordpassword EndEnd IfIf EndEnd Sub。Sub。 加密加密 不安全,破解 MDB 文件密码的软件层出不穷,那是否如果我们 MDB 作后台数据 库,是不是就等于任人宰割了呢我觉得未必是这样的。 都只能处理英文密码,因此我们可以针对这一特点,把 MDB 文件的 数据库密码设置为中文的,这样就可以抵挡大部份破解器的攻击了。 的软件。这句话一点 都没错,不过我们还有第二招更改文件头。 节保存着文件类型、版本等诸如此类的重要信息,Access 靠这些信息来识别它们,如果我 们改ss 就会因无法识别这些文件而打不开它们,也就达到了我们的目的加密 MDB 文 件。加密思路如下 把正确的头文件内容写入相应的位置,我们自已的程序就可以访问它,关闭文件时把更改过 的错误的头文件内容写入相应的位置。这样做有个弊端,就是程序运行时,后台文件是可以访问的,只有关闭 后才加密,那么当程序运行时,别人如果知道了数据库密码,还是可以查看或导出数据的。 后台数据库后,马上建立一个持续到程序结束的物理连接,然后再把错误的文件头内容 写入相应的位置,这样在程序运行当中,我们的前台程序是可以正常访问后台数据的,而不知道我们的加密方 法的人是无法打开后台文件的。 ,5E,28,5E,28 s数据库的解密s数据库的解密 tion属