没钱也能使Access推磨!三更半夜做报表!

没钱也能使Access推磨!三更半夜做报表!

Access中的查询能够把数据处理和分析过程固化下来,并且还可以设计“基于查询”的查询。只要单击查询链上的最后一个查询就可以一次性地完成烦琐的数据处理和分析操作。这看起来很不错,却有一个问题:我们怎么才能够自动地执行这些查询呢?

感谢Access,它给我们提供了一种叫做“宏”的功能。我们知道,“宏”的概念在Excel中就有了,Excel中提供的“录制宏”功能能够把我们在Excel中的操作步骤录制下来,以便在将来需要的时候重复执行。

在Access中,不再有Excel中的“录制宏”的概念,我们必须自己“设计宏”或者更确切地说,去“组装宏”。但这并不意味着在Access中宏的使用变得很复杂。事实上,Access已经把我们在Access中可能用到的绝大多数操作都已经预先设置好,我们需要做的只是把这些预定的操作按照实际工作需要的顺序编排起来就行了,从这个角度来讲,Access中的宏用起来反而比Excel中的宏更简单!

假设我们在制造部门工作,有一项日常工作:每天早晨8:00,分析一下在这一时刻(8:00)生产线各个工序的“在制品”库存情况,并且需要把该时刻“在制品”在各个工序的库存数量保存下来,一天天地积累数据,以便将来在需要的时候分析各个工序的“在制品”库存在一段时期内的每天特定时刻的变化趋势。

这里的“在制品”是生产管理方面的常用术语,意思是“制造过程中的产品”,也可以说是“尚未完成的产品”,其英文是Work in Process,简称WIP。

很多大公司都有一套生产追踪系统,用于追踪生产线上的产品的加工状态,为了方便读者理解,假如我们在生产铁皮桶的工厂任职,铁皮桶的生产过程包括4个工序,分别是:

(1)铁板剪裁;

(2)桶体焊接;

(3)桶身喷涂;

(4)最后装箱。

在产品制造过程中,生产追踪系统会实时、动态地“反映”每一个工序的在制品库存数据到系统数据库中,对于每一个工序的“在制品”库存,我们一般只能实时查询当时的情况,而不能查询过去某一时刻在制品库存的历史数据,因为生产执行系统的数据库一般不会持续地保存每一时刻在制品库存数据(如果要保存的话,那将是相当庞大的数据量)。所以,如果要想了解在制品库存在每天某一特定时刻的历史变化趋势,我们必须自己想办法!

为此,我们每天早晨8:00之前来到公司,第一件事就是使用Access的“外部数据→导入并链接”功能把生产执行系统在8:00这个时刻的在制品库存数据提取到Access中,并且“追加”存放到Access中的一个单独的表格中,每天一次,不断积累数据,以便我们在需要时把数据导出到Excel中分析在制品的库存变化趋势。

这个工作如果手动处理,无疑是重复而且单调的,并且时间要求是严格的,假设某一天由于交通堵塞我们未能在8:00之前赶到公司,那么这个抓取在制品库存的工作就耽误了,对于大规模的24小时不间断生产的企业来说,在制品库存是随时变化的,时间一旦错过了,当时的在制品库存数量也就再也无法得到了。

幸运的是,我们完全可以让Access软件帮助我们自动完成这件事情,下面看一下具体的实施过程。

5.1 Access追加查询

假设我们已经用Access界面中的“外部数据》导入并链接》ODBC数据库”功能建立了Access到生产执行系统数据库的链接表,关于如何让Access和数据库直接建立联系,可能需要咨询公司的数据库维护人员。

建立Access到生产执行系统数据库的链接表,实际上就是建立了一个Access表格和生产执行系统数据库中的表格的一个动态链接。该链接表能够实时地反映外部数据的变化情况。

为了定时保存生产执行系统数据库的数据,我们需要再在Access中建立一个和这个链接表结构相同的本地表,用于存储每天某个时刻(如8:00)生产执行系统中实时变化着的“在制品库存”表中的数据。建立与“在制品库存”表结构相同的空表格的方法是:选中“在制品库存”链接表,单击鼠标右键,在弹出的快捷菜单里选择“复制”命令。

在Access界面左侧的Access对象列表的空白处单击鼠标右键,在弹出的右键菜单里选择“粘贴”命令。在弹出“粘贴表方式”对话框中,选择“粘贴选项”选项中的“仅结构(S)(本地表)”单选框,表示我们只复制原始表格的设计结构,即粘贴一个只含有列标题的空表,而不粘贴其中的数据。同时将粘贴的表格命名为“在制品库存-每日”。该表格将用来保存我们每天在特定时刻从“在制品库存”链接表中抓取的实时在制品库存数据,如图所示。

“在制品库存”链接表是从生产执行系统中链接过来的表,任何时候打开它,反映的都是该时刻生产执行系统中“在制品”库存的实时数据,如下图所示。值得注意的是,在该生产执行系统中的实时数据中没有反映该数据是什么时刻数据的时间标签,这意味着:你什么时刻打开这个表,表里的数据就是什么时刻的!

我们每天在抓取数据时需要知道该数据是何时抓取的,因此,我们需要在刚才复制到Access中的本地表结构中增加一个新的字段用以记录数据抓取时刻。

选中“在制品库存-每日”表,单击鼠标右键,在弹出的快捷菜单中选择“设计视图”命令,对该表格进行结构上的修改。

现在进入表格结构设计视图,在设计视图的上方,列出了该表格的所有字段名称和该字段能够存储的数据类型。我们可以看到,“产品代码”和“当前工序”只能存储文本类型的数据,“在制品数量”只能存储数字类型的数据。


现在在字段列表下方新增加一个字段(实际上是在相应的表中增加了一列),这个字段取名为“数据采集时间”,然后在“字段名称”列的最下方输入这个名称,在右侧的下拉列表中选择该字段只能存储“日期/时间”类型的数据。之所以这样规定,是因为我们想让这一列数据将来能够参与日期和时间相关的计算,如图所示。

增加完新的字段后,单击Access功能区左边的“视图”按钮,打开刚刚增加了新的字段的空表格。我们观察到,该表格右侧已经增加了一个自定义的新列“数据采集时间”,如图17-4所示,表示新字段增加成功!然后保存并关闭该表格。

下面进入我们“在制品”库存数据采集的关键步骤,即如何把链接表中的实时库存数据的每一行增加一个“数据采集时间”标签后追加到我们刚才设计的空表格中去呢?这里的“追加”的意思是在保留原有的数据的基础上增加新的数据。

在Access中完成这个任务非常容易。在Access中有一种查询类型叫做“追加查询”,该查询类型可以向某个表格中追加新的数据,下面来看一看如何使用Access中的追加查询来完成库存数据的自动采集工作。


在Access中的功能区中选择“创建→查询→查询设计”命令,进入Access查询设计界面。在“显示表”对话框中,列出了Access中的所有表格,因为我们要把“在制品库存”中的数据抓取到“在制品库存-每日”中,因此,我们选择“在制品库存”表,然后单击对话框下部的“添加”按钮,把“在制品库存”表添加到Access查询设计器界面上部,如图所示。

当鼠标停留在Access查询设计器界面时,我们会发现Access功能区上面出现了一个新的叫做“设计”的上下文标签(Office软件系统的智能感应菜单)。选择“设计→查询类型→追加”命令。表示我们要设计的追加查询,此时弹出“追加”对话框。


在“追加到”下拉列表中选择“在制品库存-每日”,表示我们要把数据追加到“在制品库存-每日”表中。在对话框的下方选择“当前数据库”选项,表示我们要把数据追加到“当前数据库”中的“在制品库存-每日”表中。然后单击“确定”按钮,关闭“添加”对话框,如图所示。

现在选择Access可视化查询设计器上方的“在制品库存”表格结构图中的“*”符号,将其拖曳到下方设计网格的“字段”行中,此时我们发现在查询设计网格的“追加到”行中自动出现了“在制品库存-每日.*”的字样,表示Access将要把“在制品库存”表格中的所有列的内容追加到“在制品库存-每日”对应列中。

这看起来很不错,但我们还没有完成任务,我们还需要在追加的数据中增加数据采集时间,只有这样,采集的数据才能在以后需要的时候按照“数据采集时间”序列分析库存的变化趋势。

单击Access查询设计器网格最后一列“追加到”一行所对应的单元格,在下拉列表中选择“数据采集时间”,表示我们将要向“在制品库存-每日”表格中的“数据采集时间”列追加数据。


向“在制品库存-每日”表中的“数据采集时间”列追加一个表示当前时间的数值,因此,在上方的“字段”行中输入“采集时间:Now()”,其含义是我们生成一列新的数据,数据的值是我们追加查询的执行时间,也就是数据采集的时间。Now()函数和在Excel中的Now()函数一样,是Access里的一个函数,能够得到当前的时间。“采集时间:Now()”中的“采集时间”表示我们给该列数据取了一个新名称,叫做“采集时间”,如图所示。

选择Access功能区中“设计→结果→视图”命令(注意不是上面有一个“惊叹号”图标的那个按钮,带有“惊叹号”图标的按钮是“执行”追加查询,不是“预览”将要追加的数据)。现在我们可以预览追加查询将要追加的数据,我们看到在预览的数据中有一列叫做“采集时间”的数据,内容是查询运行的时间,如图所示。

下面单击Access快捷菜单栏里的“保存”按钮,在弹出的“另存为”对话框中,给我们所设计的追加查询取一个有意义的名称,然后单击“确定”按钮。


这时,在Access界面左侧的Access对象浏览器中可以看到多出来了一个Access的项目,就是我们刚刚设计的查询。追加查询的图标是一个绿色的加号加一个黑色的惊叹号,如果我们双击该查询对象,该查询将被立即执行,把当前时刻的在制品库存数据追加到“在制品库存-每日”表中,如图所示。

现在,我们已经利用Access中的追加查询功能把每天从生产执行系统中抓取实时库存的任务通过简单地双击就完成了,接着面临问题是:如何能够让这个动作在每天打开Access数据库时自动完成,完成任务后再自动退出Access数据库?

我们可以借助Access中的宏完成这个任务。

5.2 Access中的宏

我们已经知道,在Access中,不再有“录制宏”的概念,我们需要自己设计宏,但这并不意味着在Access中,宏的使用变得复杂。事实上,Access已经把我们在操作Access时可能涉及的动作已经预先设置好,我们需要做的只是把Access中的预定动作按工作实际需要的顺序编排好就可以了,从这个方面上来讲,Access中的宏用起来比Excel中的宏更简单!

下面我们就开始设计宏,单击Access功能区“创建→宏与代码”功能组中的“宏”按钮。进入Access的设计“宏”界面。

在Access的宏设计界面中,我们会见到一个绿色的加号按钮,在界面的右边,有一个叫做“操作目录”的导航栏,在Access中可以执行的各种动作就分门别类地放在这里。我们现在还用不到这个导航栏,单击该导航栏右上角的“×”符号关闭它。

单击Access界面中间的绿色加号按钮,这表示增加一个宏动作。单击该按钮后,展开一个包含有各种预置的“宏动作”的下拉列表。这里就是Access预先为我们设置好的各种在Access中可以执行的宏动作,包括导入数据、导出数据、打开表格、执行查询等。


针对我们目前的任务需求,我们需要执行的动作是打开前面设计的追加查询以追加数据,因此在下拉列表里选择“OpenQuery”动作,这是指我们希望打开一个查询,如图所示。

这时进入了为我们选定的宏动作设置参数的对话框,我们所选动作“OpenQuery”所需的第一个参数就是查询的名称,表示我们要打开哪一个查询。单击宏设计界面右侧的查询列表,在该列表中选择需要执行的查询名称,如图下图所示。

我们已经在Access数据库中设计了一个追加查询“查询1-追加每日在制品库存”,所以应该选择它。对于“OpenQuery”动作后面的两个参数“视图”和“数据模式”选项,保持默认值。


单击“保存”按钮,给我们的设计的宏取名为“AutoExec”然后关闭Access设计宏界面,如图所示。我们发现在Access界面左侧的Access对象列表中多了一个我们刚刚设计的宏对象。

这里我们需要特别注意的是:我们在这里给宏取的名称不是一个一般的名称!如果我们给Access中的宏取名为“AutoExec”则表示这是一个在打开Access数据库文件后,可以自动执行的宏!如果我们给Access取了一个其他的普通名称,那么只有在打开Access数据库文件后,双击这个宏的名称才能够执行,而不会在打开Access数据库时“自动”执行!


下面测试一下AutoExcec宏:关闭Access数据库,再重新打开后,看到弹出如下对话框:“您正准备执行追加查询,该查询将修改您表中的数据。”这说明我们的AutoExcec宏已经自动执行了,只是由于Access中的安全机制,对于修改Access中数据的宏动作,需要用户确认。这里单击“是”按钮,如图所示。

此时再次弹出确认对话框,表示将要追加数据,单击“是”按钮,如图所示。AutoExec宏执行完毕。

现在双击打开Access对象列表中的“在制品库存-每日”表,我们发现,该表中已经有新的数据追加进去了,而数据的“数据采集时间(追加时间)”已经记录到了表格的最后一列,如图所示。

一切看起来还不错,但是唯一存在的问题是AutoExec宏执行过程中弹出来的那两个对话框会中断宏的执行过程。因为我们希望这个宏在无人工干预的情况下自动执行,而不是专门安排一个人来单击两次“确认”按钮。

在Access宏中,有一个叫做SetWarnings的动作可以帮助我们处理这些警告对话框。但是这个宏动作在Access默认情况下是隐藏的。我们需要单击Access功能区中“设计”标签下的“显示所有操作”按钮后,它才会出现在“添加新操作”下拉列表中。


选择功能区中的“显示所有操作”命令。然后单击“添加新操作”下拉列表,在其中选择SetWarnings动作。保持下面的“打开警告”默认参数设置为“否”,表示SetWarnings宏动作下方的宏不需要出现警告对话框,如图所示。

SetWarnings动作需要放在宏中能够引起报警的动作序列的前面,在SetWarnings动作上按下鼠标左键,把它拖到所有宏动作的最前面。


用SetWarnings动作抑制了警告对话框后,一般情况下,我们还需要在所有宏动作执行完毕后打开警告对话框功能,所以我们在宏序列的最后再增加一个SetWarnings宏动作,设置“打开警告”动作参数为“是”,表示恢复报警功能,如图所示。

现在关闭数据库后再将其打开,AutoExec宏自动执行,这次不再出现任何警告对话框,双击“在制品库存-每日”表,根据表中的“数据采集时间”列,发现又有新的数据追加到该表格中了,如图所示。

到现在为止,我们已经简化了工作,每天早晨8:00来到公司时,只需双击打开我们设计的Access文件,Access会自动执行AutoExec宏,这样任务完成了!


最后一个问题,由于Office安全机制,含有宏的Access文件在打开时会默认弹出安全警告对话框,这会影响Access宏的自动执行。我们可以用如下方法避免默认弹出的安全警告对话框。

选择“文件→Access选项→信任中心”命令,在对话框右侧单击“信任中心设置”选项,在弹出的“信任中心”对话框左侧单击“受信任位置”,在对话框右侧下方单击“添加新位置”按钮。这时弹出“Microsoft Office受信任位置”对话框,如图所示。在“Microsoft Office受信任位置”对话框中选择我们刚刚设计的Access文件所在的文件夹。这样再次双击打开刚刚设计的含有宏的Access文件就不会弹出默认的安全警告对话框了。

那么,如何在打开Access文件时避免执行AutoExec宏呢?可以在按着Shift键的同时双击打开Access 文件,Access里面的AutoExec宏就不会被执行,当我们想查看和修改Access文件中的内容时可以使用这种方法打开带有AutoExec宏的Access文件。

睡着觉就把活干了

利用前面精心设计Access宏,我们已经把手动操作的工作自动化了,每天早晨8:00来到公司,只需双击打开我们设计的Access文件,Access自动执行AutoExec宏,等待几分钟后,任务完成了!

可是如果公司领导突发奇想,想采集一下每天午夜24:00的在制品库存情况,那怎么办?难道我们半夜来公司,双击打开一下Access文件?

完全不用!利用Windows操作系统中的“计划任务”工具,可以让Access在午夜帮我们干活!

在介绍Windows操作系统中的“计划任务”工具之前,我们再修改一下前面设计的宏动作序列。

在上一节设计的宏中,宏动作执行完毕后,Access文件并不会自动关闭,我们现在希望在宏中的追加数据动作完成后,自动关闭并退出Access数据库。


如果刚才的数据库还处于打开状态的话,单击选择AutoExcec宏,如果数据库已经关闭,可以在按着Shift键的同时,双击数据库文件,打开Access数据库,以避免AutoExcec自动执行。右键菜单中选择“设计”选项进入设计宏界面,保持Access功能区“设计”标签下的“显示所有操作”按钮按下的状态,增加一个QuitAccess的动作,参数选择为“全部保存”。然后保存宏并关闭宏设计界面,最后关闭Access数据库文件,如图所示。

这时,再次双击打开Access数据库文件,Access执行宏后,自动关闭数据库,虽然表面看上去好像什么也没发生一样。事实上,在制品库存的实时数据已经被采集到了Access中的“在制品库存-每日”表中了。

我们可以按着Shift键的同时双击打开Access 文件,查看Access文件中的“在制品库存-每日”表中是否增加了新的内容。

修改好AutoExec宏后,回过头来再介绍一下Winows里的“计划任务”工具。“计划任务”工具能够定时打开我们设计的Access程序,“计划任务”工具在需要在某个特定时刻执行某项程序的时候非常有用。


以Windows XP操作系统为例(Win7以后版本也有这个计划任务工具,界面可能有所不同),选择“开始→所有程序→附件→系统工具→任务计划”命令,在“任务计划”窗口中,单击“添加任务计划”按钮,此时弹出“任务计划向导”。在“任务计划向导”对话框中单击“下一步”按钮,如图所示。

在这一步中,我们选择需要定时执行的程序,单击“浏览”按钮,选择需要定时执行的Access文件,如图所示。

进入下面的对话框后,我们给正在设置的任务计划取一个名称,在对话框下部,选择“每天”单选框,表示我们的任务要每天执行。然后单击“下一步”按钮,如图所示。

在下面的对话框中,指定任务的执行时间为8:00,当然根据实际情况的需要,也可以指定运行时间为午夜12:00,然后单击“下一步”按钮,如图所示。

在这个对话框中,需要输入你的计算机登录时的密码,输入完成后,单击“下一步”按钮,如图所示。

此时弹出如图对话框,表示任务计划设置完成。单击“完成”按钮,关闭“任务计划向导”对话框,如图所示。

现在,我们在“任务计划”窗口中看到了新增加的任务计划名称,如图所示。好了,现在只要保证我们的计算机处于开机的状态,那么每天早晨8:00,Access就会忠实地帮我们完成本来需要手动完成的工作了!如果我们的任务计划设置在午夜12:00点,那么,我们睡着大觉就把工作做完了!当然,你的计算机需要24小时保持开机。

本文选自《让Excel飞》第二部分内容,对应的电子版,可阅读:《Access带你飞!》百度阅读搜索_林书明

编辑于 2017-02-22 14:02