VBA for Mandatory单元需求被满足仍然产生错误信息

我有一个新的客户入口的VBA代码,要求用户在保存表单之前用客户信息填写特定的强制单元格。

这些范围是:

如果范围B8:B10填入客户名称,则相应行中的所有单元格必须填写列E,F,K,M,N和P.

如果范围A13:A50填入客户名称,则相应行中的所有单元格必须填写列D,H,I,J,U.

如果有任何单元格留空,则会popup警告消息,通知用户相应行中缺less字段。

当两个范围的条件都满足时,不会popup警告消息,用户可以保存表单。

问题是什么时候满足一个范围的标准(可以说是范围B,第8行),但不是第二个,警告消息说,第8行和第13行是缺less数据,即使第8行填写了所有必需的数据。 (见图,突出显示的单元格不是代码的一部分)。 恐怕这会让最终用户感到困惑。

我不确定是否需要修正的信息或IF声明。 我已经玩了两个,但没有运气。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim ws As Worksheet Dim rg As Range, c As Range Dim bCanSave As Boolean Dim sWarning As String Set ws = Sheets("Sheet1") Set rg = ws.Range("B8:B10, A13:A50") Set b = Range("B8:B10") Set A = Range("A13:A50") sWarning = "File not saved!" & vbNewLine & "Mandatory cells missing in rows: " & vbNewLine With ws bCanSave = True For Each c In rg If Not IsEmpty(c) Then If .Cells(b.Row, "E") = "" Or .Cells(b.Row, "F") = "" Or _ .Cells(b.Row, "K") = "" Or .Cells(b.Row, "M") = "" Or _ .Cells(b.Row, "N") = "" Or .Cells(b.Row, "P") = "" Or _ .Cells(A.Row, "D") = "" Or .Cells(A.Row, "E") = "" Or _ .Cells(A.Row, "H") = "" Or .Cells(A.Row, "I") = "" Or _ .Cells(A.Row, "J") = "" Or .Cells(A.Row, "U") = "" Then bCanSave = False bCanClose = False sWarning = sWarning & c.Row & ", " End If End If Next c End With If Not bCanSave Then MsgBox sWarning, vbExclamation Cancel = True End If End Sub 

你将需要分割范围,并做两个独立的循环:

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim ws As Worksheet Dim a As Range, c As Range, b as range Dim bCanSave As Boolean Dim sWarning As String Set ws = Sheets("Sheet1") Set b = ws.Range("B8:B10") Set a = ws.Range("A13:A50") sWarning = "File not saved!" & vbNewLine & "Mandatory cells missing in rows: " & vbNewLine With ws bCanSave = True For Each c In b If Not IsEmpty(c) Then If .Cells(c.Row, "E") = "" Or .Cells(c.Row, "F") = "" Or _ .Cells(c.Row, "K") = "" Or .Cells(c.Row, "M") = "" Or _ .Cells(c.Row, "N") = "" Or .Cells(b.Row, "P") = "" Then bCanSave = False bCanClose = False sWarning = sWarning & c.Row & ", " End If End If Next c For Each c In a If Not IsEmpty(c) Then If .Cells(c.Row, "D") = "" Or .Cells(c.Row, "E") = "" Or _ .Cells(c.Row, "H") = "" Or .Cells(c.Row, "I") = "" Or _ .Cells(c.Row, "J") = "" Or .Cells(c.Row, "U") = "" Then bCanSave = False bCanClose = False sWarning = sWarning & c.Row & ", " End If End If Next c End With If Not bCanSave Then MsgBox sWarning, vbExclamation Cancel = True End If