如何解决了解是否在MS Access中打开了几种表单之一
我需要遍历表单列表以查看它们是否打开,然后对它们进行一些处理。以下作品:
Public Sub isloadedtester()
Dim iForm As Variant
For Each iForm In CurrentProject.AllForms
Debug.Print iForm.name & ": " & CurrentProject.AllForms(iForm.name).IsLoaded
Next
End Sub
,但它循环遍历所有形式。因此,我认为以下内容应该只能遍历我关心的表单:
Public Sub isloadedtester2()
Dim iForm As Variant
Dim list
list = Array(Form_some,Form_another)
For Each iForm In list
Debug.Print iForm.name
Debug.Print ".isloaded: " & CurrentProject.AllForms(iForm.name).IsLoaded
Debug.Print "direct: " & SysCmd(acSysCmdGetObjectState,acForm,iForm.name)
Debug.Print "by fn: " & IsLoaded(iForm.name)
Next
End Sub
Public Function IsLoaded(FormName As String,Optional aType As AcObjectType = acForm)
IsLoaded = (SysCmd(acSysCmdGetObjectState,aType,FormName) <> 0)
End Function
但是,无论使用哪种方式读取加载状态,第二个版本始终将表单视为已加载:
.isloaded: True
direct: 1
by fn: True
几乎就像为数组分配表单使VBA加载表单一样。
我应该为此使用数组以外的东西吗?我意识到我可以将其作为一系列的名称来完成,我也可以循环查看这些名称是否合适,但这似乎很尴尬,所以我首先想看看我是否正在做的事情与实际需要的略有不同。
解决方法
如果只需要打开表单,请使用Forms集合。它仅包含打开的表单
Dim intFrm As Integer
If Forms.Count > 0 Then
For intFrm = 0 To Forms.Count - 1
'Debug.Print Forms(intFrm).NAME
If Forms(intFrm).Name IsInYourList Then
DoSomething
End IF
Next intFrm
End If
,
如果您有表单名称列表,则可以使用SysCmd
Public Function IsLoaded(FName As String,Optional aType As AcObjectType = acForm)
IsLoaded = (SysCmd(acSysCmdGetObjectState,aType,FName) <> 0)
End Function
和
For Each iForm In list
Debug.Print iForm.Name & ": " & IsLoaded(iForm.Name)
Next
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。