VBA, ошибка в логе IF c, как выйти из него - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть следующие рабочие листы

Raw> Заголовок> Проект 1> Проект 2> Закрытие

Код пропускает рабочие листы "Raw" и "Title" просто отлично с ", если ws не ». Он работает на «Проекте 1» и «Проекте 2» просто отлично, но как-то «внутреннее для l oop и внутреннее, если» тоже работает на «Закрытие».

Часть vlookup во внутреннем l oop работает на "Закрытие", что я стремлюсь не. Я хочу, чтобы внутренний код запускался только в «Проекте 1» и «Проекте 2».

Пожалуйста, помогите.

Код:

' some variable declations above...
' some variable declations above...

Set ws_raw = ThisWorkbook.Worksheets("Raw")
Set ws_title = ThisWorkbook.Worksheets("Title")
Set ws_closing = ThisWorkbook.Worksheets("Closing")

With ws_raw
    int_last_row_of_raw = .Cells(.Rows.Count, 1).End(xlUp).Row
    int_last_col_of_raw = 4
    Set rng_raw = .Range("A2", .Cells(int_last_row_of_raw, int_last_col_of_raw))
End With

For Each ws In ThisWorkbook.Worksheets
    If Not ws Is ws_raw _
    Or Not ws Is ws_title _
    Or Not ws Is ws_closing Then

        project_name = ws.Range("B1").Value
        int_last_row_of_ws = 13

        For int_current_row_of_ws = 4 To int_last_row_of_ws
            cell_value = ws.Cells(int_current_row_of_ws, 1).Value
            If cell_value = "Concept Stage" Or cell_value = "Development Stage" Or cell_value = "Implementation Stage" Then
                stage_name = cell_value

                With rng_raw
                    .AutoFilter 1, project_name
                    .AutoFilter 2, stage_name
                End With

                Set rng_filtered_raw = ws_raw.Range("C3", ws_raw.Cells(int_last_row_of_raw, int_last_col_of_raw)).SpecialCells(xlCellTypeVisible)
            Else
                If Not rng_filtered_raw Is Nothing Then
                    MsgBox (project_name & ": " & cell_value)
                    ws.Cells(int_current_row_of_ws, 2).Value = Application.WorksheetFunction.VLookup(cell_value, rng_filtered_raw, 2, False)
                End If
            End If
        Next int_current_row_of_ws
    End If
Next ws

MsgBox ("before first autofilter toggle")
rng_raw.AutoFilter      ' Toggle off AutoFilter

MsgBox ("before second autofilter toggle")
rng_raw.AutoFilter      ' Toggle on AutoFilter with no criteria

1 Ответ

1 голос
/ 21 апреля 2020

Вы использовали OR logi c. AND logi c имеет больше смысла, когда вы пытаетесь сказать, что это ни один из них.

Не глядя на остальную часть вашего кода, у вас есть два варианта, как я это вижу:

  • Если вы не собираетесь расширять свои листы и вам нужно только запустить внутренний For l oop в «Проекте 1» и «Проекте 2», просто измените на:

    If ws.Name = "Project 1" Or ws.Name = "Project 2" Then
    
  • Если вы планируете продолжать работу с исключенными рабочими листами, просто измените OR на AND logi c:

    If Not ws Is ws_raw _
    And Not ws Is ws_title_page _ 'Notice you made a typo here!
    And Not ws Is ws_closing Then
    

РЕДАКТИРОВАТЬ

1) Почему OR logi c не работает в вашем случае:

Давайте держите это крайне основательно c: если у вас есть яблоко, и вы проверяете, является ли оно:

  • не то же самое, что и груша (это возвращение True)
  • или нет так же, как банан (это возвращение True)
  • или не так же, как яблоко (это возвращение False это то же самое)

Теперь, что * 1 051 * logi c делает: «Есть ли любой True, возвращенный из этих трех сравнений?» Если ответ «да», продолжайте с внутреннего внутреннего кода.


2) Почему AND logi c работает в вашем случае:

Давайте сохраним это крайне основательно c: Если у вас есть яблоко, и вы проверяете, если это:

  • не то же самое, что и груша (это возвращение True)
  • и не так же, как банан (это возвращение True)
  • и не так же, как яблоко (это возвращение False, это то же самое)

Теперь то, что AND logi c делает так: "Являются ли все три сравнения возвращаются True?» Если ответ «да», продолжайте с внутреннего внутреннего кода.


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...