Zu lange im Geschäft, aber so was ist schon ohne Nachzudenken zu tippen.
Warum hast du diese Sub wenn du sie nicht aus dem Worksheet_BeforeClose aurfufen willst bzw. einfach dort mit einbindest?
Entweder effektiv so wie gehabt oben, mit W4 im Paket
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Pflichtbereich As Range
Dim Anzahl As Integer
Set Pflichtbereich = Worksheets("T5Bvb1").Range("D4,R4,W4,D5")
Anzahl = Pflichtbereich.Cells.Count
If Application.WorksheetFunction.CountA(Pflichtbereich) <> Anzahl Then
MsgBox "Bitte füllen Sie zuerst alle Pflichtfelder aus!", vbOKOnly + vbInformation, _
" Die Datei wird NICHT gespeichert!"
Cancel = True
Else
ThisWorkbook.SaveCopyAs ("Z:\_Neumann\BVBsT5\2012\" & Range("W4") & ".xlsx")
ActiveWorkbook.Close (False)
Cancel = False
End If
End Sub
Oder W4 mit einzelner Meldung:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Pflichtbereich As Range
Dim Anzahl As Integer
Set Pflichtbereich = Worksheets("T5Bvb1").Range("D4,R4,D5")
Anzahl = Pflichtbereich.Cells.Count
If Application.WorksheetFunction.CountA(Pflichtbereich) <> Anzahl Then
MsgBox "Bitte füllen Sie zuerst alle Pflichtfelder aus!", vbOKOnly + vbInformation, _
"Die Datei wird NICHT gespeichert!"
Cancel = True
Else
If Range("W4") = "" Then
MsgBox ("Kein gültiger Speicher-Name vergeben, Abbruch")
Exit Sub
Else
ThisWorkbook.SaveCopyAs ("Z:\_Neumann\BVBsT5\2012\" & Range("W4") & ".xlsx")
ActiveWorkbook.Close (False)
Cancel = False
End If
End If
End Sub
Offen gesagt bin ich gegen den (offenbar irgendwo geerbten Test-Code für sie anderen (nunmehr) 3 Zellen allergisch; «Application.WorksheetFunction» sind Dinge die ich als altgedienter Programmierer nicht mag wenn ich es mit richtigem Code kann:
… REM aus der Hand getippt
Dim Anzahl As Integer
If Cells(4,4)="" Or Cells(4,20)="" Or Cells(5,4)="" Then
MsgBox "Bitte füllen Sie zuerst alle Pflichtfelder aus!", vbOKOnly + vbInformation, _
"Die Datei wird NICHT gespeichert!"
Cancel = True
…
Das halte ich für lesbarer da ich nicht überlegen muss was der Range soll und was da nun mit CountA (Anzahl2?!) wieder gemeint ist.
Eric March