Как устранить несоответствие типов времени выполнения "код ошибки 13" MS Access - PullRequest
0 голосов
/ 27 октября 2018

Я создал два простых кодовых модуля VBA в MS Access.

1) Этот отлично работает -

Private Sub IFLType_BeforeUpdate(Cancel As Integer)
If [ProductType] <> "IFL" Then
  If [IFLType] <> IsNotNull Then
    MsgBox ("IFLType only valid for ProductType = IFL")
  End If
End If
End Sub

2) Эта ошибка выдает ошибку несоответствия типов # 13, и отладчик выделяет строку с логикой «ИЛИ» -

Private Sub ProductDue_BeforeUpdate(Cancel As Integer)
If [ProductType] <> "IFL" Or "3-TIER IPRN" Or "CD IPRN" Then
  If [ProductDue] <> IsNotNull Then
    MsgBox ("ProductDue only valid for ProductType = IFL, 3-TIER IPRN, and CD IPRN")
  End If
End If
End Sub

Единственное существенное различие между ними заключается в логике "или". Любые идеи о том, как написать логику "ИЛИ" и сделать эту работу?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Из-за приоритета оператора в VBA операторы сравнения (такие как <>) будут оцениваться перед логическими операторами (такими как Or); как таковой, вам необходимо будет включить оператор сравнения между каждым из ваших логических операторов, т.е.

Private Sub ProductDue_BeforeUpdate(Cancel As Integer)
    If [ProductType] <> "IFL" Or [ProductType] <> "3-TIER IPRN" Or [ProductType] <> "CD IPRN" Then
        If [ProductDue] <> IsNotNull Then
            MsgBox ("ProductDue only valid for ProductType = IFL, 3-TIER IPRN, and CD IPRN")
        End If
    End If
End Sub

Однако, основываясь на сообщении, которое вы сообщаете пользователю, я полагаю, что вам на самом деле потребуются операторы And вместо операторов Or, поскольку, если [ProductType] равно "3-TIER IPRN", то Or оператор вернет True для [ProductType] <> "IFL", а проверочное выражение для оператора If будет проверено.

Поэтому я считаю, что ваш тест должен быть:

Private Sub ProductDue_BeforeUpdate(Cancel As Integer)
    If [ProductType] <> "IFL" And [ProductType] <> "3-TIER IPRN" And [ProductType] <> "CD IPRN" Then
        If [ProductDue] <> IsNotNull Then
            MsgBox ("ProductDue only valid for ProductType = IFL, 3-TIER IPRN, and CD IPRN")
        End If
    End If
End Sub

Или альтернативно (и, возможно, более читабельно):

Private Sub ProductDue_BeforeUpdate(Cancel As Integer)
    If Not ([ProductType] = "IFL" Or [ProductType] = "3-TIER IPRN" Or [ProductType] = "CD IPRN") Then
        If [ProductDue] <> IsNotNull Then
            MsgBox ("ProductDue only valid for ProductType = IFL, 3-TIER IPRN, and CD IPRN")
        End If
    End If
End Sub

Вы также можете объединить ваше второе тестовое выражение с первым, чтобы избежать вложенного оператора If, т.е.:

Private Sub ProductDue_BeforeUpdate(Cancel As Integer)
    If [ProductDue] <> IsNotNull And (Not ([ProductType] = "IFL" Or [ProductType] = "3-TIER IPRN" Or [ProductType] = "CD IPRN")) Then
        MsgBox ("ProductDue only valid for ProductType = IFL, 3-TIER IPRN, and CD IPRN")
    End If
End Sub
0 голосов
/ 27 октября 2018

Вам необходимо написать полный текст или утверждение, например:

If [ProductType] <> "IFL" Or [ProductType] <> "3-TIER IPRN" Or [ProductType] <>  "CD IPRN" Then ...
...