如何检查范围内是否为空单元格?

How to check if empty cell in a range?

我只是想检查一个范围内是否有空行,例如,如果 S28 是“KO”或“OK”,则上面的行 (offset(-1,0) 不应为空。
如果它是空白的,函数应该停止。
如果一个单元格是空白的,并且上面的单元格是空白的,那没问题。

S中的每个单元格都有一个公式,countif函数。

代码说有空行,其实不是这样的。我删除了S28中的数据,你可以在图片上看到。因此,不应该有 msgbox。第一行检查在S12.

Private Function detecht_empty_rows() As Boolean
    
    Call DefineVariables
    
    Dim lrowS As Long
    Dim cell As Range
    Dim startingcell As String
    
    lrowS = shInput.cells(Rows.Count, 19).End(xlUp).Row
    
    For Each cell In shInput.Range("S13" & ":" & "S" & lrowS)
    
        startingcell = cell.Address
    
        If cell.Text = "" And IsEmpty(cell.Offset(-1, 0)) = True Then
    
        ElseIf cell.Text = "OK" Or cell.Text = "KO" And IsEmpty(cell.Offset(-1, 0)) = True Then
    
            MsgBox "Please remove the blank rows"
            Exit Function
       
        End If
    
    Next cell
    
End Function

请测试下一个适配功能。我假设 DefineVariables 定义了 shInput 工作 sheet。出于测试原因,我的代码将讨论中的 sheet 定义为活动代码。您可以 delete/comment 声明和值分配:

Private Function detecht_empty_rows() As Boolean

'Call DefineVariables

Dim lrowS As Long, cell As Range, startingcell As String
Dim shInput As Worksheet, boolEmpty As Boolean, rowNo As Long

Set shInput = ActiveSheet 'use here your defined worksheet. 
                          'Clear the declaration if declared at the module level
lrowS = shInput.cells(rows.count, 19).End(xlUp).row
'new inserted code line:________________________________
lrowS = lastR(shInput.range("S13" & ":" & "S" & lrowS))
'_______________________________________________________

For Each cell In shInput.Range("S13" & ":" & "S" & lrowS)
    If cell.text = "" And cell.Offset(-1, 0) = "" Then
        boolEmpty = True: rowNo = cell.Offset(-1).row: Exit For
    ElseIf (cell.text = "OK" Or cell.text = "KO") And cell.Offset(-1, 0) = "" Then
        boolEmpty = True: rowNo = cell.Offset(-1).row: Exit For
    End If
 Next cell
 If boolEmpty Then MsgBox "Please remove the blank row (" & rowNo & ").": detecht_empty_rows = False: Exit Function

detect_empty_rows = True
End Function

下一个函数将以不同的方式计算要处理的最后一行:

Function lastR(rng As range) As Long
   Dim i As Long, lngStart As Long, lngEnd As Long, sh As Worksheet
   
   lngStart = rng.cells(1).Row: lngEnd = lngStart + rng.Rows.Count - 1
   Set sh = rng.Parent
   For i = lngStart To lngEnd
       If WorksheetFunction.CountIf(sh.range(sh.range("S" & i), sh.range("S" & lngEnd)), "OK") + _
            WorksheetFunction.CountIf(sh.range(sh.range("S" & i), sh.range("S" & lngEnd)), "KO") = 0 Then
            lastR = i - 1: Exit Function
       End If
   Next i
End Function

你必须改变

ElseIf cell.text = "OK" Or cell.text = "KO" And IsEmpty(cell.Offset(-1, 0)) 

ElseIf (cell.text = "OK" Or cell.text = "KO") And cell.Offset(-1, 0) = "" 

必须检查 Or 条件,就像与 IsEmpty 部分一起检查一样。

那么,startingcell = cell.Address就没用了,每次迭代都取一个新值。

不一定要用IsEmpty(cell.Offset(-1, 0)) = True。使用 IsEmpty(cell.Offset(-1, 0)) 就足够了。无论如何,方法 return 是一个 Boolean 变量。

作为一个 returning Boolean 的函数,它应该 return 它。可以在调用函数的代码中使用。

但是在公式的情况下,即使它return是一个空字符串(""),也不能使用IsEmpty。我的意思是,它不起作用,单元格不是空的。代码必须使用 cell.Offset(-1, 0) = "".

请注意“S12”处不要有空单元格...