是否可以在嵌套的if循环中使用“ FOR”语句?

时间:2019-09-03 17:08:16

标签: excel vba for-loop nested-loops

如果与用户输入的值匹配,我正在尝试删除工作簿中的工作表。如果该值不存在,则显示错误消息。有比我目前拥有的更好的方法吗?

最初,我尝试了一个带有多个if语句的嵌套if循环来获取达到的结果,但是那没有用。下面的代码是我所要学习的,但其中仍然存在一些错误。例如,当满足第一个FOR条件时,两个FOR语句都会出现消息框(不正确)。

Dim ws As Worksheet

Private Sub cmdDeleteProj_Click()
'
'Remove project sheet after project has been completed
'

'Show error message if user input field is blank
If txtRemProjNum.Value = "" Then
    MsgBox "Input valid project number to continue.", vbExclamation, "Required Field Left Blank"
    uf_RemProj.txtRemProjNum.SetFocus
End If

'Delete user defined project sheet if it exists
On Error Resume Next
For Each ws In ActiveWorkbook.Worksheets
    If ws.Name = txtRemProjNum Then
        Application.DisplayAlerts = False
        ws.Delete
        Application.DisplayAlerts = True
        MsgBox "Project removed from inventory tracker."
    End If
Next ws

'Show error message if project does not exist
On Error Resume Next
For Each ws In ActiveWorkbook.Worksheets
    If txtRemProjNum.Value <> "" And ws.Name <> txtRemProjNum Then
        MsgBox "Project number not found." & vbNewLine & "" & vbNewLine & "Input valid project number.", vbCritical, "Out of Range"
        uf_RemProj.txtRemProjNum.Text = ""
        uf_RemProj.txtRemProjNum.SetFocus
    End If
Next ws

End Sub

我希望工作表(如果存在)被删除,但是无法使if语句和FOR循环正常工作。

2 个答案:

答案 0 :(得分:1)

试试吧,让我知道任何问题。我没有过多评论,因为代码流应该是不言自明的。

{{1}}

答案 1 :(得分:0)

我认为您看到这两个消息是因为工作表在第一个循环中,而不是在第二个循环中。为什么不循环一次并使用elseif语句

For Each ws In ActiveWorkbook.Worksheets
    If ws.Name = txtRemProjNum Then
        Application.DisplayAlerts = False
        ws.Delete
        Application.DisplayAlerts = True
        MsgBox "Project removed from inventory tracker."
    ElseIf
        txtRemProjNum.Value <> "" And ws.Name <> txtRemProjNum Then
        MsgBox "Project number not found." & vbNewLine & "" & vbNewLine & "Input 
                valid project number.", vbCritical, "Out of Range"
        uf_RemProj.txtRemProjNum.Text = ""
        uf_RemProj.txtRemProjNum.SetFocus
    End If
Next ws