Excel VBA-如果Else仍在执行Else

Excel VBA-如果Else仍在执行Else,vba,for-loop,if-statement,Vba,For Loop,If Statement,我的代码相当简单,但有点令人费解。我可能犯了一个小错误——请原谅我的新手。尽管Boolean=True,Sheets.Add.Name行仍会执行,因此将使用Sheet#命名约定创建一个新的工作表 共享我的代码: Private Sub create_analyst_btn_Click() Dim strUser As String Dim DateToday As String Dim ws As Worksheet Dim boolFound As Boolean strUser = ne

我的代码相当简单,但有点令人费解。我可能犯了一个小错误——请原谅我的新手。尽管Boolean=True,Sheets.Add.Name行仍会执行,因此将使用Sheet#命名约定创建一个新的工作表

共享我的代码:

Private Sub create_analyst_btn_Click()

Dim strUser As String
Dim DateToday As String
Dim ws As Worksheet
Dim boolFound As Boolean

strUser = newanalyst_form.user_User.Value

For Each ws In Worksheets

    If ws.Name Like strUser Then boolFound = True: Exit For
    Next

    If boolFound = True Then
        MsgBox ("User already exists.")
    Else
        DateToday = Format(Date, "-yyyy-mm-dd")
        Sheets.Add.Name = strUser & DateToday
        Unload Me
    End If

End Sub

我看不出第一个
If
语句的意义,我会将您的代码重构为以下内容:

For Each ws In Worksheets
    If ws.Name Like "*" & strUser & "*" Then
        MsgBox ("User already exists.")
        Exit For
    Else
        DateToday = Format(Date, "-yyyy-mm-dd")
        Sheets.Add.Name = strUser & DateToday
        Unload Me
    End If
Next ws

这里的逻辑是,如果在调用子例程之前名称已经存在,我们将在迭代时发现它,在警报框中显示警告消息,然后退出。否则,名称/日期将添加到工作表中。

当您单步执行该代码时,调试器会向您显示什么?我想你不太明白它到底在做什么。你什么时候为后续的迭代重置过
boolFound
?第一件之后是真的,以后永远都是真的。@TimBiegeleisen:我可以用一件新T恤。:-)@Ken White“运行时错误'1004':该名称已被采用。请尝试其他名称。我认为,尽管追加了DateToday,else语句中工作表名称的串联未正确识别为唯一。请尝试
ws.name Like strUser&”*“
而不是if语句中类似strUser的
ws.Name
For
而不是
Next
?实际上,如果工作簿中的第一个工作表与用户名不匹配,则
if
语句将创建一个新工作表。然后,如果工作簿中的第二个工作表不匹配,它将尝试创建第二个新工作表。(我不会说“etc”,因为由于第一个工作表不匹配,它在尝试创建与创建的第二个副本同名的副本时会崩溃。)