Сценарий Outlook на VBA — оператор If Или возвращает неверное значение

#vba #outlook

#vba #outlook

Вопрос:

  MName = Format(dtDate, "mm", vbUseSystemDayOfWeek, vbUseSystem)

 If MName = "04" Or "06" Or "09" Or "11" Then 
        DName = "30"
    ElseIf MName = "02" Then
        DName = "28"
    ElseIf MName = "01" Or "03" Or "05" Or "07" Or "08" Or "10" Or "12" Then
        DName = "31"
    Else
 End If
  

Я создаю этот скрипт для сохранения вложений электронной почты в папках, имена которых основаны на конце месяца. Например, если электронное письмо отправлено 10-25-16, оно будет сохранено в папке 10-31-16.

Проблема возникает при определении того, какой день на конец месяца использовать. Значение «mName» равно 10 (для октября). Однако «DName» возвращается как «30», когда оно должно возвращаться как «31», когда mName равно «10».

Есть идеи, почему это запускает первую строку оператора If? Заранее спасибо!

Комментарии:

1. Дэвид дал вам отличный пример того, как использовать Or, но мне нравится использовать «Выбрать регистр» 😉

Ответ №1:

Or Оператор в VBA работает не так. Or это логический оператор, который работает как:

 > result = expression1 Or expression2
  

В вашем случае у вас есть:

 If MName = "04" Or "06" ... 
  

И в этом использовании «06» само по себе является выражением, вы говорите:

 If (MName = "04") Or ("06") Or (expression3) Or ...
  

Вот почему ваши результаты не соответствуют вашим ожиданиям.

Рассмотрите возможность использования Case оператора вместо:

 Select Case MName
    Case "04", "06", "09", "11"
        Dname = "30"
    Case "30"
        DName = "28"
    Case "01", "03", "05", "07", "08", "10", "12"
        DName = "31"
    Case Else
        DName = "" 'Modify if needed...
End Select
  

Делать это с If помощью операторов намного сложнее.

  If MName = "04" Or MName = "06" Or MName = "09" MName = Or MName = "11" Then 
        DName = "30"
    ElseIf MName = "02" Then
        DName = "28"
    ElseIf MName = "01" Or MName = "03" Or MName = "05" _
                    Or MName = "07" Or MName = "08" Or MName = "10" Or MName = "12" Then
        DName = "31"
    Else
 End If
  

Комментарии:

1. Ах, теперь это имеет смысл. Большое спасибо за помощь и урок!

Ответ №2:

Каждый оператор OR запускает новое условие, поэтому вам нужно добавить mName = к каждому.

 MName = Format(dtDate, "mm", vbUseSystemDayOfWeek, vbUseSystem)

 If MName = "04" Or MName = "06" Or MName = "09" Or MName = "11" Then 
        DName = "30"
    ElseIf MName = "02" Then
        DName = "28"
    ElseIf MName = "01" Or MName = "03" Or MName = "05" Or MName = "07" Or MName = "08" Or MName = "10" Or MName = "12" Then
        DName = "31"
    Else
 End If
  

Возможно, вам лучше использовать функцию CASE .

 MName = Format(dtDate, "mm", vbUseSystemDayOfWeek, vbUseSystem)

Select Case CInt(MName)
    Case 4 To 5
        Debug.Print "hi"
    Case 6, 7, 8
        Debug.Print "ho"
    Case 9 To 10
        Debug.Print "hum"
    Case Else
        Debug.Print "error!"
End Select
  

Где вместо моего debug.print вы помещаете DName = «XX».

Комментарии:

1. Большое спасибо за помощь и урок!