MS Access VBA-如何确定控件是否具有特定属性

时间:2018-07-04 04:40:13

标签: ms-access hyperlink properties access-vba controls

我正在尝试使用以下方法检查表单上的控件是否为超链接:

If (Len(ctl.HyperlinkAddress) < 0) Then

...但是,某些不包含此属性的控件将引发错误。

在检查长度之前,如何测试此属性是否存在?

是否有更好的方法来测试超链接?

预先感谢

5 个答案:

答案 0 :(得分:2)

如果您不想使用错误陷阱,则可以使用TypeOf来测试控件是否具有支持.HyperlinkAddress的接口。

使用对象浏览器,您可以发现Access.CommandButtonAccess.ImageAccess.LabelAccess.NavigationButton接口支持此属性。

您可能想拆分此条件,但是在一行中应该是:

If TypeOf ctl Is Access.CommandButton Or TypeOf ctl Is Access.Image Or TypeOf ctl Is Access.Label Or TypeOf ctl Is Access.NavigationButton Then
    If Len(ctl.HyperlinkAddress) > 0 Then

    End If
End If

您当然可以在此处省略Access.。但是我倾向于保持它在MSForms控件之间的区别。

答案 1 :(得分:1)

这里有一些代码将在单击按钮并检查特定控件(在这种情况下为Link(实际上是具有Label属性的Hyperlink Address)上运行。< / p>

Private Sub cmdCheckForHyperlink_Click()

    Dim prp As Property

    On Error GoTo Props_Err

    For Each prp In Me.lblHyperlink.Properties
        'Debug.Print vbTab & prp.Name & " = " & prp.Value
        If prp.Name = "HyperlinkAddress" Then
            MsgBox "It's a hyperlink."
        End If
    Next prp

Props_Exit:
    Set prp = Nothing
    Exit Sub

Props_Err:
    If Err = 2187 Then
        'Property is only available at design time.
        Resume Next
    Else
        'An Error Occurred.
        Resume Next
    End If

End Sub

编辑:请注意,我没有检查其他控件是否具有超链接地址属性,而大概不是

编辑2 :在给出的答案中有好的方法,但是请注意,如果长度为零,则检查长度不会告诉您任何信息。一个好的方法可能是检查所有具有超链接属性的控件(请参阅Erik的答案),然后循环遍历该属性以再次检查该属性是否存在以及是否需要属性值。

答案 2 :(得分:1)

http://allenbrowne.com/AppPrintMgtCode.html#HasProperty

Public Function HasProperty(obj As Object, strPropName As String) As Boolean
    'Purpose: Return true if the object has the property.
    Dim varDummy As Variant

    On Error Resume Next
    varDummy = obj.Properties(strPropName)
    HasProperty = (Err.Number = 0)
End Function

基本上,如果属性不存在,这只会处理错误。

因此,在您的情况下,您可以简单地忽略所有错误:

For Each ctl in Me.Controls
    ' Init for error case
    isHyperlink = False
    On Error Resume Next
    isHyperlink = (Len(ctl.HyperlinkAddress) > 0)
    On Error Goto ErrHandler

    If isHyperlink Then
        ' ...
    End If
Next ctl

答案 3 :(得分:0)

仅使用错误捕获就可以解决暴力问题。循环属性更为礼貌:

Public Function IsProperty( _
  ByVal obj As Object, _
  ByVal strName As String) _
  As Boolean

  Dim prp       As Property
  Dim booFound  As Boolean

  For Each prp In obj.Properties
    If StrComp(prp.Name, strName, vbTextCompare) = 0 Then
      ' Property exists.
      booFound = True
      Exit For
    End If
  Next

  IsProperty = booFound

End Function

答案 4 :(得分:0)

在VBA中有很多方法可以做任何事情,但是看看给出的答案,安德烈的答案对我来说似乎是最有效的,也是我处理此类问题的方式

对于Me.Controls中的每个ctl

' Init for error case

isHyperlink = False

On Error Resume Next

isHyperlink = (Len(ctl.HyperlinkAddress) > 0)

On Error Goto ErrHandler

If isHyperlink Then
    ' ...
End If

下一个ctl

设置默认值false并关闭单个命令的错误检查意味着您仅对控件进行一次检查,如果失败,则已经设置了false,否则对于下一个代码块将其设为true。确保重新打开错误检查。

按照古斯塔夫的建议遍历所有属性都可以,但是要遍历的属性太多,因此需要执行大量检查,即需要更长的执行时间,将其乘以表单上的所有控件所花的时间将会很大浪费了,尤其是在控件很多的情况下。