Из-за приоритета оператора в 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