VBA检查是否有任何单元格在给定的范围内不是空白的

我有下面的代码,将保存工作簿之前,特定工作表是空的提示。

代码目的:检查主页中下拉列表的值是否为“是”,如果是,则检查特定页面上的给定范围是否为空白。 如果“是”,则发出提示,并在主工作表上将下拉值更改为“否”。

关注点:代码中的For loop会检查给定范围内的单元格是否为空,而我想要一个代码来检查给定范围内的任何一个单元格中是否有条目。 可以说,给定的范围是E10:G19 ,如果我们在E10中有一个入口,它应该从代码中出来,不应该抛出提示,只有当给定范围内的所有单元格都为空时才抛出。

问题:什么应该替代我的For loop ,可以达到我的目的?

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim ws As Worksheet Dim Rvalue As Range Dim cell As Range Set Rvalue = Sheets("Uni-corp").Range("E10:G19") If Worksheets("Main").Range("E29").Value = "YES" Then For Each cell In Rvalue If IsEmpty(cell) Then bOk = True Exit For Else: bOk = False End If Next If bOk Then If MsgBox("Sheet is blank", vbOKCancel + vbInformation) = vbOK Then Worksheets("Main").Range("E29").Value = "NO" Cancel = True End If End If End If End Sub 

也许你是在这样的事情之后:

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If UCase(Worksheets("Main").Range("E29").Value) <> "YES" Then Exit Sub If WorksheetFunction.CountA(Worksheets("Uni-corp").Range("E10:G19")) > 0 Then Exit Sub If MsgBox("Sheet is blank", vbOKCancel + vbInformation) = vbOK Then Worksheets("Main").Range("E29").Value = "NO" Cancel = True '<--| this will make the macro not save the workbook End If End Sub 

干得好:

 Option Explicit Public Function b_is_range_empty(my_rng As Range) If Application.WorksheetFunction.CountA(my_rng) > 0 Then b_is_range_empty = False Else b_is_range_empty = True End If End Function Public Sub TestMe() Debug.Print b_is_range_empty(Selection) End Sub 

这个想法是使用Excel中的内置公式 – CountA。 它针对更快的search进行了优化。 在testing中,它与select的区域一起工作。

编辑:而不是这个:

 For Each cell In Rvalue If IsEmpty(cell) Then bOk = True Exit For Else: bOk = False End If Next 

简单写一下: bOK = b_is_range_empty(Rvalue)

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim ws As Worksheet Dim Rvalue As Range Dim cell As Range Set Rvalue = Sheets("Uni-corp").Range("E10:G19") If Worksheets("Main").Range("E29").Value = "YES" Then For Each cell In Rvalue If IsEmpty(cell)<>true Then bOk = false Exit For Else: bOk = true End If Next If bOk Then If MsgBox("Sheet is blank", vbOKCancel + vbInformation) = vbOK Then Worksheets("Main").Range("E29").Value = "NO" Cancel = True End If End If If bOk=false Then If MsgBox("Sheet is not blank", vbOKCancel + vbInformation) = vbOK Then Worksheets("Main").Range("E29").Value = "Yes" Cancel = True End If End If End If End Sub 

当第一个单元格为空时,您似乎正在退出for循环,您只需要在它find值时退出:

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim ws As Worksheet Dim Rvalue As Range Dim cell As Range Set Rvalue = Sheets("Uni-corp").Range("E10:G19") If Worksheets("Main").Range("E29").Value = "YES" Then For Each cell In Rvalue If IsEmpty(cell) Then bOk = True 'Exit For moved to Else section Else: bOk = False Exit for End If Next If bOk Then If MsgBox("Sheet is blank", vbOKCancel + vbInformation) = vbOK Then Worksheets("Main").Range("E29").Value = "NO" Cancel = True End If End If End If End Sub