Excel VBA: как исправить ошибку If Else For Loop - PullRequest
0 голосов
/ 20 декабря 2018

Это мой первый проект VBA, поэтому, пожалуйста, будьте терпеливы.Я создал пользовательскую форму Excel для добавления информации в базу данных.Когда я нажимаю «добавить», у меня появляется скрипт vba, который должен найти первый открытый рабочий лист за этот год (например, Name_2018_1, Name_2018_2, Name_2018_3) или создать новый рабочий лист с последовательным именем.

Я продолжаю получать ошибки компиляции на основегде я размещаю свои операторы «then» и «exit for».

Я хочу, чтобы счетчик либо находил первый лист с доступной строкой, либо проходил весь цикл через i, а затем создавал новый лист на основея ценю.

Как правильно настроить цикл for после моего else?Если кто-то может указать на то, что я делаю неправильно, это будет оценено.

'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

* Если я помещу «Тогда выход для» в одну строку, я получу ошибку компиляции «Иначе без 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

* Однако, когда я помещаю «Тогда» и «Выход для» в отдельных строках, я получаю ошибку компиляции «Далее без 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-го) проверки исходного листа и создания его, если его нет.(2) Если этот исходный лист существует, но он заполнен, я хочу убедиться, что нового листа еще нет.Если он есть, он становится активным листом.(3-е) если нет другого доступного рабочего листа, мне нужен сценарий для его создания.

У меня изначально были проблемы с созданием нового рабочего листа и только одна запись применялась к этому рабочему листу до создания другого рабочего листа.отсюда 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

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Next без For переводит на отсутствующий End If

В первом случае Else: следует заменить на Else, а второй Else следует удалить.

ВВо втором случае вам дополнительно не хватает End If, независимо от ошибки.End 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
0 голосов
/ 21 декабря 2018

Если Then не сопровождается оператором, скажем, так:

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

Тогда это синтаксис блока , и поскольку это блок, он должен бытьзакрыто, в этом случае с End If:

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

Вот почему вы получаете «следующий без 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, вы выполняете что-то, в противном случае вы выполняете что-то еще - все базы покрыты, дополнительное «остальное» просто никуда не уходит.

Это будет шаблон для работы с:

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

Если за вещами становится слишком трудно следить, возьмите весь блок и втяните его в свою собственную процедуру, передавая все необходимые параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...