Я создал два простых модуля кода 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
Единственное существенное различие между ними - это логика «Или». Есть идеи, как написать логику «Или» и заставить эту работу работать?
Вам нужно написать полное или заявление, например:
If [ProductType] <> "IFL" Or [ProductType] <> "3-TIER IPRN" Or [ProductType] <> "CD IPRN" Then ...
Из-за приоритет оператора в 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
Этот IsNotNull жуткий. Попробуйте:
If Not IsNull([IFLType]) Then
.