VBA Worksheet_before保存字段的validation

所以在这个worksheet_beforesave之前,我已经实现了一个Worksheet_beforeclose,它在用户closures文件之前检查validation是非常好的。 但被告知,这是一个不好的function,因为如果他们从来没有填写表格,它会阻止人们closures。

soi试图把所有的代码移动到beforesave,所以macros观将检查字段,然后让他们保存(这听起来比不让他们closures更好)

但只是从Worksheet_Beforeclose所有代码切换到Worksheet_beforesave没有工作……它只是变得像一个正常的工作表没有检查,我已经写了字段我保存之前检查没有工作,它实际上允许用户保存..

这是我的代码

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Range("D18").Value = "" Then MsgBox "User required to fill in at least one requirement" Cancel = True Range("D18").Select End If If Range("D30").Value = "" Then MsgBox "User required to fill in date" Cancel = True Range("D30").Select End If If Range("D32").Value = "" Then MsgBox "User required to fill in the field" Cancel = True Range("D32").Select End If If Range("D34").Value = "" Then MsgBox "User required to fill in the field" Cancel = True Range("D34").Select End If End Sub 

所以要简短而甜蜜

我从Worksheet_Beforeclose的确切代码移动到worksheet_beforesave,但它没有工作,它是空的领域仍然能够通过,让用户保存它

在此先感谢您,感谢您的时间!

尝试将您的代码移回到Workbook_BeforeClose。 并检查您的工作簿是否保存

 Private Sub Workbook_BeforeClose(Cancel As Boolean) If Not ThisWorkbook.Saved Then Cancel = True End Sub 

如果工作簿发生更改,则.saved属性将会更改,如果不存在,它将保持为true,用户将能够closures工作簿。

编辑#1

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim rRange As Range, eCell As Range If ThisWorkbook.ReadOnly Or ThisWorkbook.Saved Then Exit Sub Set rRange = Range("D18,D30,D32,D34") For Each eCell In rRange If eCell.Value = "" Then MsgBox "User required to fill in at least one requirement" Cancel = True eCell.Select Exit For End If Next End Sub 

线

  If ThisWorkbook.ReadOnly Or ThisWorkbook.Saved Then Exit Sub 

检查工作簿是否只读,是否保存。 如果属实,不要继续。

线

 Set rRange = Range("D18,D30,D32,D34") 

我们将您的范围设置为一个范围,并通过它们循环

 For Each eCell In rRange