MS Access VBA - как определить, обладает ли элемент управления определенным свойством - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь проверить, является ли элемент управления в форме гиперссылкой, используя:

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

... однако некоторые элементы управления, не содержащие этого свойства, выдают ошибку.

Как проверить, существует ли это свойство перед проверкой длины?

Есть ли лучший подход для проверки гиперссылки?

Заранее спасибо

Lee

Ответы [ 5 ]

0 голосов
/ 08 июля 2018

Есть много способов сделать что-нибудь в VBA, но, глядя на предоставленные ответы, Андре кажется мне наиболее эффективным, а также способ, которым я решаю этот вопрос

Для каждого ctl в 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

Далее ctl

Установка значения по умолчанию false и отключение проверки ошибок для одной команды означает, что вы выполняете одну проверку только для элемента управления, в случае неудачи значение false уже установлено, в противном случае оно станет истинным для следующего блока кода. Не забудьте снова включить проверку ошибок.

Циклическое переключение всех свойств, как предлагал Густав, будет работать, но есть так много свойств для циклического переключения, поэтому столько проверок = больше времени для выполнения, к тому времени, когда вы умножите это на все элементы управления в форме, окажется большое время Waster, особенно если имеется много элементов управления.

0 голосов
/ 04 июля 2018

Если вы не хотите использовать перехват ошибок, вы можете использовать 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.

0 голосов
/ 04 июля 2018

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
0 голосов
/ 04 июля 2018

Просто использование перехвата ошибок - это грубая сила. Более вежливо зацикливать свойства:

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
0 голосов
/ 04 июля 2018

Вот некоторый код, который будет запускаться при нажатии кнопки и проверять определенный элемент управления, в данном случае, Link (который на самом деле является Label со свойством Hyperlink Address).

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 : В данных ответах есть хорошие подходы, но имейте в виду, что проверка длины ничего вам не скажет, если длина равна нулю. Хорошим подходом, вероятно, будет сочетание проверки всех элементов управления, имеющих свойство гиперссылки (см. Ответ Эрика), и зацикливание свойств для повторной проверки, существует ли свойство, и если вам нужно свойство-значение.

...