Excel VBA:如何解决If Else For Loop错误

时间:2018-12-20 20:56:13

标签: excel vba

这是我的第一个vba项目,因此请耐心等待。我创建了一个Excel用户窗体,将信息添加到数据库。当我单击“添加”时,我具有vba脚本,该脚本应查找该年的第一个打开的工作表(例如Name_2018_1,Name_2018_2,Name_2018_3)或创建一个新的连续命名的工作表。

根据“ then”和“ exit for”语句的放置位置,我会不断收到编译错误。

我希望计数器要么找到具有可用行的第一个工作表,要么一直循环到i,然后根据i值制作一个新工作表。

在其他情况下如何正确设置for循环?如果有人指出我做错了,将不胜感激。

-name

*如果我将“ Then Exit For”放在一行上,则会收到编译错误“ Else if if”

'Dim myFirstBlankRow As Long
'Dim i               As Long
'Dim WsName          As String
'Dim WsNamei         As String
'Dim ws              As Worksheet
'Dim counter         As Integer

'Declare worksheet names
WsName = "Name_" & Year(Me.DTPicker1.value) & "*" 
WsNamei = "Name_" & Year(Me.DTPicker1.value) & "_" & i

For Each ws In Sheets
    If ws.Name = WsName Or ws.Name Like WsName & "*" Then i = i + 1
Next

'If no worksheet exists, then make a new one, else loop through until an empty row is found

If i = 0 Then 'No worksheet with the year selected by DTPicker
    With Sheets("Template")
        .Copy After:=Sheets(Sheets.Count) 'Add new worksheet
        ActiveSheet.Name = WsName & "_1"
    End With

*但是,当我在单独的行上放置“ Then”和“ Exit For”时,会收到一个编译错误“ Next for For”

Else:
    For counter = 1 To i Step 1
        Worksheets(WsName & "_" & counter).Activate
        If IsEmpty(Range("A1048576").value) = True Then Exit For
    Next counter


Else 'No recognizing the original If statement
    With Sheets("Template")
        .Copy After:=Sheets(Sheets.Count) 'Add worksheet
        ActiveSheet.Name = WsName & "_" & i
    End With
End If

'为我的修改添加 我希望代码(1st)检查原始工作表,如果没有,请制作一个。 (第二个)如果原始工作表存在但已满,我要确保没有新的工作表。如果有,它将成为活动工作表。 (3rd)如果没有另一个可用的工作表,我需要脚本来制作一个。

最初,我在创建新工作表时遇到问题,并且在创建另一个工作表之前仅将一个条目应用于该工作表,因此需要3个步骤。

如果第一个工作表已满,我是否应该拆分第一个If,然后将最后2个作为自己的实体?

Else:
    For counter = 1 To i Step 1
        Worksheets(WsName & "_" & counter).Activate
        If IsEmpty(Range("A1048576").value) = True Then
        Exit For
    Next counter

Else
    With Sheets("Template")
        .Copy After:=Sheets(Sheets.Count) 'Add worksheet
        ActiveSheet.Name = WsName & "_" & i
    End With
End If

2 个答案:

答案 0 :(得分:3)

如果Then后面没有声明,请这样说:

If IsEmpty(Range("A1048576").value) Then Exit For

然后是 block语法,由于它是一个块,因此需要将其关闭,在这种情况下,请使用End If

If IsEmpty(Range("A1048576").value) Then
    Exit For
End If

这就是为什么您会得到“ next Without for”的原因,因为如果没有End If,编译器在到达任何Next之前会遇到End If,因此For counter循环块被视为未终止。

下一个问题,一个If...Else...End If块不能超过1个Else

Else:
    For counter = 1 To i Step 1
        Worksheets(WsName & "_" & counter).Activate
        If IsEmpty(Range("A1048576").value) = True Then Exit For
    Next counter


Else 'No recognizing the original If statement

VBA无法对此进行解析;我也无法解析。我不知道你打算在这里做什么。如果i0,则执行某项操作,否则执行其他操作-覆盖了所有基数,一个额外的“ else”仅在任何地方都不可用。

这是可用于的模板:

If {bool-expression} Then
    {statements}
ElseIf {bool-expression} Then
    {statements}
Else
    {statements}
End If

Else令牌标识“后备”情况。有两个没有任何意义。请注意,指令分隔符标记:Else:中是多余的,并使其看起来像行标签:请避免这样做。


如何避免这种情况

键入If语句时,立即键入相应的End If

If something Then
    'type here
End If

以后嵌套东西时,请立即关闭打开的任何块:

If something Then
    For i = 0 To 10
        'type here now
    Next
Else
    'get back here later
End If

如果事情开始变得太难了,请抓住整个块并将其放入自己的私有过程中,并传递所需的任何参数。

答案 1 :(得分:2)

没有For的下一个表示缺少End If

在第一种情况下,应将Else:替换为Else,并删除第二个Else

在第二种情况下,无论错误如何,您都另外缺少End IfEnd If应该在Exit For以下(Next Counter上方)。

它们是等效的,您只是在使用If语句的两种不同方式。

案例1

If i = 0 Then 'No worksheet with the year selected by DTPicker
    With Sheets("Template")
        .Copy After:=Sheets(Sheets.Count) 'Add new worksheet
        ActiveSheet.Name = WsName & "_1"
    End With
  Else
    For counter = 1 To i Step 1
        Worksheets(WsName & "_" & counter).Activate
        If IsEmpty(Range("A1048576").value) Then Exit For
    Next counter
    With Sheets("Template")
        .Copy After:=Sheets(Sheets.Count) 'Add worksheet
        ActiveSheet.Name = WsName & "_" & i
    End With
End If

案例2

If i = 0 Then 'No worksheet with the year selected by DTPicker
    With Sheets("Template")
        .Copy After:=Sheets(Sheets.Count) 'Add new worksheet
        ActiveSheet.Name = WsName & "_1"
    End With
  Else
    For counter = 1 To i Step 1
        Worksheets(WsName & "_" & counter).Activate
        If IsEmpty(Range("A1048576").value) Then
            Exit For
        End If
    Next counter
    With Sheets("Template")
        .Copy After:=Sheets(Sheets.Count) 'Add worksheet
        ActiveSheet.Name = WsName & "_" & i
    End With
End If