如何检查范围内是否为空单元格?
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”处不要有空单元格...
我只是想检查一个范围内是否有空行,例如,如果 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”处不要有空单元格...