Вопрос или проблема
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
, что требует внимательного отслеживания, где начинается и заканчивается каждая из них. Проходя по вашему коду, можно заметить, что у вас есть следующий уровень вложенности:
- Внешний уровень:
With Sheet1
- Второй уровень:
With Sheet3
- Третий уровень:
With Sheet2
- Четвертый уровень: снова
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
Важные Замечания
-
Структура
With ... End With
: Убедитесь, что для каждогоWith
есть соответствующийEnd With
. Это необходимо для поддержания правильной структуры и улучшения читабельности кода. -
Логические блоки: Структурирование кода в логические блоки (такие как обработка ошибок или определенные процессы) улучшает как его производительность, так и понимание его работы.
-
Тестирование: После внесения изменений протестируйте код, чтобы убедиться, что ошибка была исправлена, и логика выполнения кода работает корректно.
Заключение
Ошибки компиляции, как "Compile Error Expected End With", являются распространенной проблемой среди разработчиков на VBA. Внимательное использование конструкций With
и правильное структурирование кода позволят избежать подобных ситуаций в будущем. При необходимости пересмотрите свой код, чтобы убедиться в отсутствии других ошибок. Вы можете также рассмотреть использование комментариев, чтобы сделать свой код еще более понятным для дальнейших правок.