![](/img/trans.png)
[英]How to fix 5097 error in VBA code to loop through rows in excel?
[英]Excel VBA: How to fix an If Else For Loop error
這是我的第一個vba項目,請耐心等待。 我創建了一個Excel用戶窗體,將信息添加到數據庫。 當我單擊“添加”時,我具有vba腳本,該腳本應查找該年的第一個打開的工作表(例如Name_2018_1,Name_2018_2,Name_2018_3)或創建一個新的連續命名的工作表。
我會根據放置“ then”和“ exit for”語句的位置不斷收到編譯錯誤。
我希望計數器要么找到具有可用行的第一個工作表,要么一直循環到i,然后根據i值制作一個新工作表。
在其他情況之后,如何正確設置for循環? 如果有人指出我做錯了,將不勝感激。
'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”放在一行上,則會收到編譯錯誤“ Else if if”
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
*但是,當我將“ 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
With Sheets("Template")
.Copy After:=Sheets(Sheets.Count) 'Add worksheet
ActiveSheet.Name = WsName & "_" & i
End With
End If
補充說,我希望代碼(第1個)檢查原始工作表,如果沒有,請制作一個。 (第二個)如果原始工作表存在但已滿,我要確保沒有新的工作表。 如果有,它將成為活動工作表。 (3rd)如果沒有其他可用的工作表,我需要腳本來制作一個。
我最初在創建新工作表時遇到問題,在創建另一個工作表之前僅將一個條目應用於該工作表,因此需要3個步驟。
如果第一個工作表已滿,我是否應該拆分第一個If,然后將最后2個作為自己的實體?
If i = 0 Then 'No worksheet with the year selected by DTPicker
With Sheets("Template")
.Copy After:=Sheets(Sheets.Count) 'Add worksheet
i = 1
ActiveSheet.Name = WsName & "_" & i
End With
ElseIf
For counter = 1 To i Step 1
Worksheets(WsName & "_" & counter).Activate
If IsEmpty(Range("A1048576").value) = True Then
Exit For
End If
Next counter
Else
With Sheets("Template")
.Copy After:=Sheets(Sheets.Count) 'Add worksheet
ActiveSheet.Name = WsName & "_" & i
End With
End If
如果“ Then
后面沒有聲明,則說像這樣:
If IsEmpty(Range("A1048576").value) Then Exit For
然后是塊語法 ,由於它是一個塊,因此需要將其關閉,在這種情況下,請使用End If
:
If IsEmpty(Range("A1048576").value) Then
Exit For
End If
這就是為什么會得到“ next without for”的原因,因為End If
沒有End If
,編譯器在到達任何End If
之前會遇到Next
,因此For counter
循環塊被視為未終止。
下一個問題,您將無法獲得If...Else...End If
塊,且其中的Else
超過1個。
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
令牌標識“備用”情況。 有兩個沒有任何意義。 請注意,指令分隔符token :
在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
如果事情開始變得太難了,請抓住整個塊並將其放入自己的私有過程中,並傳遞所需的任何參數。
在第一種情況下,應將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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.