Office中国论坛/Access中国论坛

标题: 使用宏还是使用 Visual Basic? [打印本页]

作者: ACMAIN_CHM    时间: 2009-2-15 16:12
偶尔看到ACCESS 2003 帮助中的一个小段落。 与个人感觉一致。 我基本不懂宏,从来不写宏,别人写宏只是能猜着看懂。 VB学起来将来应用的面比较广泛,OFFICE其它的应用如WORD、EXCEL等都可以用。而ACCESS的宏好象独此一家。

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

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

作者: rcylbx    时间: 2009-2-15 18:35
用vba,只有在不会vb情况下才应该用宏。
excel中也有宏。
作者: ACMAIN_CHM    时间: 2009-2-16 19:37
在另外一个贴子上,有网友对宏快,还是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.
作者: ACMAIN_CHM    时间: 2009-2-16 20: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存为一体。在加载的时候,需要加载的字节数不同。
作者: zhuyiwen    时间: 2010-7-15 11:08
个人感觉有必要认真学习Access宏及宏的相关知识,它对于快速的小型应用,效果极佳。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3