这是我的第一个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
答案 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无法对此进行解析;我也无法解析。我不知道你打算在这里做什么。如果i
是0
,则执行某项操作,否则执行其他操作-覆盖了所有基数,一个额外的“ 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)
在第一种情况下,应将Else:
替换为Else
,并删除第二个Else
。
在第二种情况下,无论错误如何,您都另外缺少End If
。
End If
应该在Exit For
以下(Next Counter
上方)。
它们是等效的,您只是在使用If
语句的两种不同方式。
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
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