簡體   English   中英

Excel VBA:如何解決If Else For Loop錯誤

[英]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無法解析此內容; 我也無法解析。 我不知道你打算在這里做什么。 如果i0 ,則執行某項操作,否則執行其他操作-覆蓋所有基數,一個額外的“ 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

如果事情開始變得太難了,請抓住整個塊並將其放入自己的私有過程中,並傳遞所需的任何參數。

沒有For的下一個表示缺少End If

在第一種情況下,應將Else:替換為Else並刪除第二個Else

在第二種情況下,無論錯誤如何,您都將丟失End If End If應該在Exit ForNext 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

情況二

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM