设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13915|回复: 4
打印 上一主题 下一主题

使用宏还是使用 Visual Basic?

[复制链接]
跳转到指定楼层
1#
发表于 2009-2-15 16:12:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
偶尔看到ACCESS 2003 帮助中的一个小段落。 与个人感觉一致。 我基本不懂宏,从来不写宏,别人写宏只是能猜着看懂。 VB学起来将来应用的面比较广泛,OFFICE其它的应用如WORD、EXCEL等都可以用。而ACCESS的宏好象独此一家。

使用宏还是使用 Visual Basic?
在 Microsoft Access 中,通过宏或者用户界面可以完成许多任务。而在其他许多数据库程序中,要完成相同的任务就必须通过编程。是使用宏还是使用 Microsoft Visual Basic for Applications,取决于需要完成的任务。

什么时候应该使用宏?
对于简单的细节工作,譬如打开和关闭窗体、运行报表等,使用宏是一种很方便的方法。它可以简捷迅速地将已经创建的数据库对象联系在一起,因为不需要记住各种语法,并且每个操作的参数都显示在“宏”窗口中。
除了使用宏带来的方便外,必须使用宏来完成下列操作:

  • 创建全局赋值键。
  • 在首次打开数据库时执行一个或一系列操作。当然,通过“启动”对话框也可以指定打开数据库时所需进行的操作,例如打开窗体。
什么时候应该使用 Visual Basic?
对于下列情况,应该使用 Visual Basic 而不要使用宏:

  • 使数据库易于维护。因为宏是独立于使用它的窗体和报表的对象,所以很难维护包含许多用于响应窗体和报表上事件的宏的数据库。相反,Visual Basic 事件过程将建立在窗体或报表的定义中。如果把窗体或报表从一个数据库移到另一个数据库,则窗体或报表所带的事件过程也会同时移动。
  • 使用内置函数或自行创建函数。Access 包含许多内置的函数,例如用于计算利息的 IPmt 函数。在计算时使用这些函数可以避免创建复杂的表达式。使用 Visual Basic 还可以创建自己的函数,通过这些函数可以执行表达式难以胜任的复杂计算,或者用来代替复杂的表达式。此外,也可在表达式中使用自己创建的函数对多个对象应用公共操作。
  • 处理错误消息。当在使用数据库的过程中遇到意外的事情时,Access 将显示一则错误消息,但该消息对用户而言可能是莫名其妙的,特别是如果用户不熟悉 Access 时。而使用 Visual Basic 则可以在出现错误时检测错误,并显示自己指定的消息或执行某些操作。
  • 创建或处理对象。在大多数情况下,在对象的“设计”视图中创建和修改对象是最简易的方法。而在某些情况下,可能需要在代码中对对象进行定义。使用 Visual Basic 可以处理数据库中所有的对象,包括数据库本身。
  • 执行系统级的操作。虽然在宏中执行 RunApp 操作可以从一个应用程序运行另一个基于 Microsoft Windows 或 Microsoft MS-DOS 的应用程序,但是在 Access 以外使用宏具有很大的局限性。而使用 Visual Basic 则可以查看系统中是否存在某个文件,或者通过“自动化”或动态数据交换 (DDE) 与另外一个基于 Windows 的应用程序(如 Microsoft Excel)进行通讯,还可以调用 Windows 动态链接库 (DLL) 中的函数。
  • 一次处理多条记录。使用 Visual Basic 可以一次选择一个记录集或是单条记录,并对每条记录执行一项操作。而宏只能一次对整个记录集进行操作。
  • 将参数传送给 Visual Basic 过程。创建宏时,可以在“宏”窗口的下半部分设置宏操作的参数,但在运行宏时无法对参数进行更改。而使用 Visual Basic 则可在程序运行期间将参数传递给代码,或者可以将变量用于参数中,这在宏中是难以做到的。这些特性使得运行 Visual Basic 过程时具有更大的灵活性。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2009-2-15 18:35:01 | 只看该作者
用vba,只有在不会vb情况下才应该用宏。
excel中也有宏。
3#
 楼主| 发表于 2009-2-16 19:37:56 | 只看该作者
在另外一个贴子上,有网友对宏快,还是VB快有些疑问。于是便做了如下测试.

1。新建一个空的ACCESS 2003  t.mdb
2。用下面语句创建两表 tMacro 和 tVBA, 完全相同。
create table tMacro
(
    id     counter constraint pk_tMacro primary key,
    col    varchar(50)
)
create table tVba
(
    id     counter constraint pk_tVba primary key,
    col    varchar(50)
)


3。创建宏macro1,  动作为 runsql, SQL 语句为 "insert into tMacro(col)values ('A0')"

4。创建一个模块Module1, 对VBA过程vbaInsert来调用,而不是直接放到testVBA中是为了避免过程调用中栈处理的时间对测试结果的影响
Option Compare Database
Option Explicit

Public Sub testVBA()
    DoCmd.SetWarnings False
    Dim i As Integer
    Debug.Print "VBA Start @ "; Now
    For i = 1 To 10000
        vbaInsert
    Next i
    Debug.Print "VBA End @ "; Now
    DoCmd.SetWarnings True
End Sub

Public Sub testMacro()
    DoCmd.SetWarnings False
    Dim i As Integer
    Debug.Print "Macro Start @ "; Now
    For i = 1 To 10000
        DoCmd.RunMacro "macro1"
    Next i
    Debug.Print "Macro End @ "; Now
    DoCmd.SetWarnings True
End Sub

Public Sub vbaInsert()
    'CurrentProject.Connection.Execute "insert into tVBA(col) values ('A0')"
    DoCmd.RunSQL "insert into tVBA(col) values ('A0')"
End Sub

5。分别先运行 testMacro, testVBA ,再运行testVBA ,testMacro以平衡先后执行顺序对测试的影响。
6。结果

VBA Start @ 2/16/2009 11:52:30 AM
VBA End @ 2/16/2009 11:52:42 AM
Macro Start @ 2/16/2009 11:52:49 AM
Macro End @ 2/16/2009 11:53:04 AM

Macro Start @ 2/16/2009 11:53:16 AM
Macro End @ 2/16/2009 11:53:29 AM
VBA Start @ 2/16/2009 11:53:32 AM
VBA End @ 2/16/2009 11:53:44 AM

同时一开始的时候是用的ADO来测的,发现ADO速度也明显高于 docmd.runsql.
4#
 楼主| 发表于 2009-2-16 20:05:05 | 只看该作者
还有网友认为 带有宏的FORM比有VBA的FORM打开速度快。 同样也做了如下测试.

实验步骤:
1。新建一个空的ACCESS 2003  t1.mdb
2。创建宏 macro1,  动作为 close,
3。创建窗体 frmMacro, 空窗体,什么都不加,然后到FORM的load事件中设置为宏 macro1
4。创建窗体 frmVBA ,在FORM的load事件添加VBA代码
Private Sub Form_Load()
    DoCmd.Close
End

5。创建模块module1,代码如下。以acDialog模式打开个窗体以避免ACCESS并发,窗体在LOAD之后会自动关闭,然后打开下一个
Option Compare Database
Option Explicit

Public Sub testVBA()
    Dim i As Integer
   
    Debug.Print "Start VBA @ "; Now
    For i = 1 To 10000
        DoCmd.OpenForm "frmVBA", acNormal, , , , acDialog
        DoEvents
    Next i
    Debug.Print "End   VBA @ "; Now
   
End Sub
Public Sub testMacro()
    Dim i As Integer
   
    Debug.Print "Start MACRO @ "; Now
    For i = 1 To 10000
        DoCmd.OpenForm "frmMacro", acNormal, , , , acDialog
        DoEvents
    Next i
    Debug.Print "End   MACRO @ "; Now
   
End


6。分别运行 testVBA 和 testMacro 结果如下:

Start VBA @ 2/16/2009 4:20:27 PM
End   VBA @ 2/16/2009 4:21:07 PM
Start MACRO @ 2/16/2009 4:21:18 PM
End   MACRO @ 2/16/2009 4:21:58 PM


////////////////////////////////////////////
从测试结果看,速度上差不多。

估计为什么仅有宏的FORM比有VBA代码的FORM速度快的原因是:
1。仅有宏的FORM相应来对比较功能简单,这样与用有VBA的FORM在功能上没有可比性。
2。在FORM中的事件上分配了宏,这样宏的实际代码或内容仍在宏中,在FORM中仅保留了一个指向这些宏的指针。而VBA代码则是与FORM存为一体。在加载的时候,需要加载的字节数不同。

点击这里给我发消息

5#
发表于 2010-7-15 11:08:40 | 只看该作者
个人感觉有必要认真学习Access宏及宏的相关知识,它对于快速的小型应用,效果极佳。

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 04:38 , Processed in 0.103833 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表