判断对象是打开还是关闭是一个非常简单的任务,使用SysCmd函数即可搞定。如果传递的对象打开,以下函数返回True,否则返回False:
Public Function PassedObjStatus(objtype, objname) _
As Boolean
If SysCmd(acSysCmdGetObjectState, _
objtype, objname) <> 0 Then
ObjStatus = True
End If
End Function
然而,上述过程存在2个问题:
为了解决第一个问题,可使用CurrentObjectType和CurrentObjectName属性来获取所选对象的名称和类型。遗憾的是,鱼与熊掌不能兼得,你要么让函数使用当前选定的对象,要么向它传递参数,因为函数本身不能判断两者的区别。从开发的角度来说,为每一种可能性都提供一个函数显得过于啰嗦。这个问题将通过下一节提供的库级函数来解决,它既能处理选定的对象,也能接收传递的参数,所以能判断任何对象的状态。在第二个库级函数中,我们将使用CurrentView属性来解决第二个问题,该函数能判断一个打开对象的当前视图。
先解决最紧迫的问题:对象是打开还是关闭?
有时,为了继续下一步行动,你惟一需要知道的就是对象是打开还是关闭。在这种情况下,请使用如清单A所示的函数。
该函数接受2个可选参数,即对象的名称和类型。表A总结了对象类型常量。
表A
常量 | 整数值 |
acTable | 0 |
acQuery | 1 |
acForm | 2 |
acReport | 3 |
acMacro | 4 |
acModule | 5 |
acDataAccessPage | 6 |
acServerView | 7 |
acDiagram | 8 |
acStoredProcedure | 9 |
对象常量
如果IsMissing函数返回True,表明你没有提供参数值。结果就是,函数将依赖CurrentObjectType和CurrentObjectName属性来判断对象的类型和名称:
ObjState = SysCmd(acSysCmdGetObjectState, _
Application.CurrentObjectType, _
Application.CurrentObjectName)
如果通过参数值提供了对象的名称和类型,Else条件就使用那些值来判断状态:
Else
ObjState = SysCmd(acSysCmdGetObjectState, _
objtype, objname)
注意,如果要提供参数值,则必须同时提供对象的名称和类型。
表B总结了函数返回的整数值。
表B
常量 | 状态解释 | 整数值 | Enum |
adStateClosed | 对象关闭 | 0 | ObjectStateEnum |
acObjStateOpen | 对象打开 | 1 | acSysCmdGetObjectState |
acObjStateDirty | 进行了更改,但没有保存 | 2 | acSysCmdGetObjectState |
acObjStateNew | 是新对象 | 4 | acSysCmdGetObjectState |
函数值
大多数值都是acSysCmdGetObjectState常量的成员。adStateClosed常量是ActiveX数据对象库(ADODB)的ObjectStateEnum的一个成员。我们使用它是为了提高可读性。如果你在一个DAO项目中运行,请将adStateClosed替换成整数值0;否则,adStateClosed会返回一个Empty值。如果你喜欢使用常量,请用Const关键字来创建一个自定义常量,这样可避免使用0。