VBA,IF逻辑中的错误,如何退出它



我有以下工作表

原始>标题>项目1>项目2>关闭

代码跳过工作表"Raw"one_answers"Title",只需使用"if ws is not"即可。它在"项目1"one_answers"项目2"上运行得很好,但不知何故,"内部for循环和内部if"也在"关闭"上运行。

内部循环中的vlookup部分运行在"关闭"上,我的目标不是这样。我希望内部代码只在"项目1"one_answers"项目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

您已经使用了OR逻辑。AND逻辑在这里更有意义,当你试图说它一定不是它们中的任何一个时。

在我看来,不看代码的其余部分,你就有两个选择:

  • 如果您不打算在工作表上展开,并且只需要在"项目1"one_answers"项目2"上运行内部For循环,只需更改为:

    If ws.Name = "Project 1" Or ws.Name = "Project 2" Then
    
  • 如果你计划继续这样处理排除的工作表,只需将OR更改为AND逻辑:

    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逻辑在您的情况下不起作用:

让我们保持这个非常基本的:如果你有一个苹果,你正在检查它是否是:

  • 与梨不同(此返回True(
  • 是否与香蕉相同(此返回True(
  • 是否与苹果相同(此返回False,完全相同(

现在,OR逻辑的作用是:"这三个比较中是否返回了任何True?"如果答案是肯定的,则继续执行内部代码。


2(为什么AND逻辑在您的情况下有效:

让我们保持这个非常基本的:如果你有一个苹果,你正在检查它是否是:

  • 与梨不同(此返回True(
  • 而不是与香蕉相同(此返回True(
  • 而不是与苹果相同(此返回False,完全相同(

现在,AND逻辑的作用是:">所有三个比较都返回True吗?"如果答案是肯定的,则继续执行内部代码。


最新更新