我正在尝试使用以下方法检查表单上的控件是否为超链接:
If (Len(ctl.HyperlinkAddress) < 0) Then
...但是,某些不包含此属性的控件将引发错误。
在检查长度之前,如何测试此属性是否存在?
是否有更好的方法来测试超链接?
预先感谢
李
答案 0 :(得分:2)
如果您不想使用错误陷阱,则可以使用TypeOf
来测试控件是否具有支持.HyperlinkAddress
的接口。
使用对象浏览器,您可以发现Access.CommandButton
,Access.Image
,Access.Label
和Access.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。确保重新打开错误检查。
按照古斯塔夫的建议遍历所有属性都可以,但是要遍历的属性太多,因此需要执行大量检查,即需要更长的执行时间,将其乘以表单上的所有控件所花的时间将会很大浪费了,尤其是在控件很多的情况下。