Решение:
Поместите Cancel=True
в конце процедуры, чтобы предотвратить зависание Excel из-за бесконечного цикла.
Когда вы сохраняете файл, событие Workbook_BeforeSave
запускается * до того, как Excel сохранит файл **, как обычно.
Это можно предотвратить с помощью Cancel=True
, что необходимо в этом случае, так как вы хотите SaveAs
сделать это самостоятельно.
Без Cancel=True
ваш SaveAs
снова вызывает событие Workbook_BeforeSave
, где вы снова SaveAs
, который снова запускает событие Workbook_BeforeSave
.... и т.д ....
Альтернатива (более сжатая):
Ваш код должен работать с изменениями, приведенными выше, но ниже представлен способ дальнейшего сжатия кода путем удаления повторений. (См. Также, как создать Минимальный, Полный и Проверяемый пример .)
Уменьшение размера происходит из-за использования With..End With
и циклического перемещения по статическому массиву, чтобы избежать повторения того же кода.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim msg As String, say As Long, ws As Worksheet, col
Set ws = Worksheets("ACC REQ")
With Application.WorksheetFunction
say = .CountA(ws.Columns("C"))
For Each col In Array("D","F","G","H","I","J","K","M","N","Q","R","AU")
If .CountA(ws.Columns(col))<>say Then msg=msg & Range(col & "1") & vbCrLf
Next col
Cancel = True 'we don't need Excel to save it
End With
If msg <> "" Then
MsgBox msg, , "Can't Save with Empty Cells!": Exit Sub
End If
ActiveWorkbook.SaveAs Format(Now(), "yyyy-mm-dd") _
& "__ACC__" & Range("H2") & "__CR.xlsx"
End Sub