问题描述
我需要遍历表单列表以查看它们是否打开,然后对它们进行一些处理。以下作品:
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