У меня ошибка “Ошибка компиляции, ожидался In With”. Я просмотрел форумы, но ничего не нашёл [закрыто].

Вопрос или проблема

Sub WO_SaveUpdate()
Dim WORow As Long, WOCol As Long
Dim AssignedTo As String, SharedFolder As String, FileName As String, FilePath As String
  Worksheets(Array("Sheet1", "Sheet2", "Sheet3")).Select
With Sheet1
 If .Range("D4").Value = Empty Or .Range("H4").Value = Empty Or .Range("D10").Value = Empty Or .Range("C15").Value = Empty Then
    MsgBox "Пожалуйста, заполните желтые ячейки"
    Exit Sub
 End If

With Sheet3
If .Range("C4").Value = Empty Then
    MsgBox "Пожалуйста, укажите местоположение общего папки"
    Exit Sub
End If

With Sheet2
If .Range("B9").Value = True Then 'новый рабочий заказ
    WORow = .Range("D99999").End(xlUp).Row + 1  'Первая доступная строка
Else ' Существующий рабочий заказ
    WORow = .Range("B10").Value 'Строка существующего рабочего заказа
End If

With Sheet1
 For WOCol = 2 To 10
    .Cells(WORow, WOCol).Value = .Range(.Cells(30, WOCol).Value).Value 'Поместить значения в строку WO
    Sheet4.Range(.Cells(29, WOCol).Value).Value = .Range(.Cells(30, WOCol).Value).Value 'Поместить значения в шаблон WO
 Next WOCol
 .Range("B4").Value = False 'Установить новый WO в ложь
.Range("B5").Value = WORow

End With
End Sub

Мне все удалось исправить, спасибо. Я добавил “End With” выше всех “End IF” в листах

Ответ или решение

Ошибка компиляции "Compile Error Expected End With" в языке программирования VBA (Visual Basic for Applications) возникает, когда вы используете конструкцию With ... End With неправильно. Данная ошибка может произойти из-за недостатка соответствующих операторов End With, что нарушает логику кода. Позвольте мне подробно разобрать, как вы можете исправить эту проблему.

Анализ Ошибки

В вашем коде присутствует несколько уровней вложенных конструкций With, что требует внимательного отслеживания, где начинается и заканчивается каждая из них. Проходя по вашему коду, можно заметить, что у вас есть следующий уровень вложенности:

  1. Внешний уровень: With Sheet1
  2. Второй уровень: With Sheet3
  3. Третий уровень: With Sheet2
  4. Четвертый уровень: снова With Sheet1

Каждый из этих блоков With должен быть закрыт правильным оператором End With, прежде чем вы сможете начать новый блок внутри предыдущего.

Решение Проблемы

Вы уже упомянули, что внесли исправления и добавили оператор End With выше всех операторов End If. Это правильный подход. Чтобы продемонстрировать это, я перепишу ваш код, добавив необходимое количество операторов End With:

Sub WO_SaveUpdate()
    Dim WORow As Long, WOCol As Long
    Dim AssignedTo As String, SharedFolder As String, FileName As String, FilePath As String

    Worksheets(Array("Sheet1", "Sheet2", "Sheet3")).Select

    With Sheet1
        If .Range("D4").Value = Empty Or .Range("H4").Value = Empty Or .Range("D10").Value = Empty Or .Range("C15").Value = Empty Then
            MsgBox "Пожалуйста, заполните желтые ячейки"
            Exit Sub
        End If
    End With  ' Закрыли With для Sheet1

    With Sheet3
        If .Range("C4").Value = Empty Then
            MsgBox "Пожалуйста, добавьте местоположение общего доступа"
            Exit Sub
        End If
    End With  ' Закрыли With для Sheet3

    With Sheet2
        If .Range("B9").Value = True Then ' Новый рабочий заказ
            WORow = .Range("D99999").End(xlUp).Row + 1 ' Первая доступная строка
        Else ' Существующий рабочий заказ
            WORow = .Range("B10").Value ' Строка существующего заказа
        End If
    End With  ' Закрыли With для Sheet2

    With Sheet1
        For WOCol = 2 To 10
            .Cells(WORow, WOCol).Value = .Range(.Cells(30, WOCol).Value).Value ' Помещаем значения в строку WO
            Sheet4.Range(.Cells(29, WOCol).Value).Value = .Range(.Cells(30, WOCol).Value).Value ' Помещаем значения в шаблон WO
        Next WOCol
        .Range("B4").Value = False ' Устанавливаем новый WO на false
        .Range("B5").Value = WORow
    End With  ' Закрыли With для Sheet1

End Sub

Важные Замечания

  1. Структура With ... End With: Убедитесь, что для каждого With есть соответствующий End With. Это необходимо для поддержания правильной структуры и улучшения читабельности кода.

  2. Логические блоки: Структурирование кода в логические блоки (такие как обработка ошибок или определенные процессы) улучшает как его производительность, так и понимание его работы.

  3. Тестирование: После внесения изменений протестируйте код, чтобы убедиться, что ошибка была исправлена, и логика выполнения кода работает корректно.

Заключение

Ошибки компиляции, как "Compile Error Expected End With", являются распространенной проблемой среди разработчиков на VBA. Внимательное использование конструкций With и правильное структурирование кода позволят избежать подобных ситуаций в будущем. При необходимости пересмотрите свой код, чтобы убедиться в отсутствии других ошибок. Вы можете также рассмотреть использование комментариев, чтобы сделать свой код еще более понятным для дальнейших правок.

Оцените материал
Добавить комментарий

Капча загружается...