前面的练习使用了cicode删除access数据库里面数据表的记录,但是有一个问题,记录删除了理论上access文件大小应该变小,实际情况不是这样子,还需要做一下压缩数据库。压缩数据库可以通过打开access文件,在工具栏上手动压缩,也可以通过程序代码压缩。今天做了练习就是实现citectVBA脚本删除记录和压缩数据库的。

练习还是基于前几天的citect程序。

1. 打开report.mdb文件,在文件-选项对话框中设置文件关闭时压缩数据。因为我尝试过在access文件内些宏,调用指令压缩数据库,微软说不允许这样。就寻思着换种思路,人为的在文件删除记录后开关一次。

access如何批量删除数据 access怎么批量删除记录_access如何批量删除数据

2. 在项目程序文件夹下新建一个带有宏的excel文件compaceDB.xlsm,打开开发工具-visual basic。

access如何批量删除数据 access怎么批量删除记录_access如何批量删除数据_02

3. 插入模块,模块写以下代码

access如何批量删除数据 access怎么批量删除记录_access如何批量删除数据_03

Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

 Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

这是声明两个系统函数。用户查找窗口和窗口传递函数。

 

4. 这个excel文件的workbook打开事件中添加以下代码.

Private Sub Workbook_Open()

Dim hwnd, result As Long

Dim mytime, myshell, prog

Const WM_CLOSE = &H10

'omain代表了access文件,具体参考微软MSDN

'Microsoft Project - "JWinproj-WhimperMainClass"

'Microsoft Excel - "XLMain"

'Microsoft Word - "OpusApp"

'Microsoft Access - "OMain"

hwnd = FindWindow("omain", vbNullString)

If hwnd <> 0 Then

   result = PostMessage(hwnd, 16, 0, 0)

Else

   '先把report.mdb后台运行起来

   Set myshell = CreateObject("wscript.shell")

   prog = myshell.Run(ThisWorkbook.Path & "\report.mdb", 0)

   '等30秒,确保report.mdb确实是完全打开了

   mytime = Timer()

   While mytime + 30 > Timer()

   '等待30秒钟,就是为了让access数据库文件完全打开

   Wend

   '现在可以关掉access文件了

   hwnd = FindWindow("omain", vbNullString)

   result = PostMessage(hwnd, 16, 0, 0)

   Set myshell = Nothing

End If

End Sub

保存excel文件。ThisWorkbook.Path函数就是获取excel文件所在文件夹的路径,这样就是动态的,无论项目文件在哪里,只要excel文件和access文件在同一个文件夹下面。

在citect项目中新建一个mypath内部变量,字符串类型。在创建ODBC连接的cicode代码中将report.mdb文件完整路径赋值给这个变量,也就是一行cicode代码

mypath=PathToStr("[run]")

5. 项目文件夹下新建一个批处理文件killexcel.bat,这个文件是为了消除excel残留进程的,内容如下。

cmd.exe /c taskkill.exe /f /im excel.exe

其中cmd.exe /c 是调取命令行,并且执行完后面的命令就关闭cmd,不回显了。

taskkill.exe /f 就是强制杀死进程,后面紧跟进程名字excel.exe

如果直接shell调用,会有一个cmd黑窗闪现一下,不太好,我希望是后台静默进行,中控工不要察觉变化。

6.新建一个citectVBA过程,写以下代码,为了不和网页的背景代码冲突,我使用截图:

access如何批量删除数据 access怎么批量删除记录_access数据库_04

在画面上做一个按钮,按钮的鼠标点击事件调用这个citectVBA的sub

civba call DeleteAccessRecord_CompactDB()

保存编译运行,点击按钮就可删除3000条记录,并且压缩数据库了。程序中删除记录后,后台打开了compactDB.xlsm文件,利用这个文件打开事件中的宏开关一次access数据库文件,变相的做了数据库压缩。

 

我在做这个练习的时候,开始只是关注了删除数据个压缩数据库是否实现了,忽略了这些代码是否干净。晚上回家再次检查发现之行结束后始终有excel.exe的进程残留。于是为了完善,使用了一个批处理文件来强行结束excel进程。

 

明天继续丰富这个删除记录并且压缩数据库的练习。以应对实际的工程需求。