如何 return 一系列公式中的第一个非空白单元格?
How can I return the first non-blank cell in a range of formulas?
我正在使用用于数据收集的电子表格。我被要求创建一个错误检查器,用于检查何时将数据粘贴到电子表格并覆盖数据验证规则。
在单元格 X3:AO33 中,我有一个公式块。他们中的大多数检查空白单元格,然后检查另一个单元格中的有效输入。如果结果有效或不需要,则 return 为空白。否则,它 return 是一条消息。这是一个例子:
=IF(OR(AND(D3<>"",OR(F3="",G3="",H3="")),AND(U3<>"",V3="")),CONCATENATE("Required fields are missing in row ",ROW(),"."),"")
现在我需要在 B2 中放置一些东西来查找 X3:AO33 范围内的消息。我想要它 return 第一个非空白单元格的值。如果 Z5 有第一个发现的错误,那么 B2 应该显示 Z5 中的文本。然后用户可以修复问题,Z5变成空白,如果下一个错误是AB7,B2应该显示AB7的文本。
我已经试过了。
=INDEX(X3:AO33,MATCH(FALSE,ISBLANK(X3:AO33),0))
还有这个。
=INDEX(X3:AO33,MATCH(TRUE,INDEX((X3:AO33<>0),0),0))
还有这个。
=INDEX(X3:AO33,MATCH(TRUE,LEN(X3:AO33)>0,0))
还有这个。
=MATCH("*",X3:AO33,0)
我已经将它们全部作为数组而不是数组进行了尝试。他们都带回了#N/A错误。
知道我做错了什么吗?
我改进了我原来的配方。这将始终如一地为您提供第一个非空白,从左到右,然后向下。 See sample sheet.
=LEFT(TEXTJOIN("??",TRUE,X3:AO30),FIND("??",TEXTJOIN("??",TRUE,X3:AO30))-1)
此外,您可以使用自定义功能,让您可以选择上下或左右移动。
Function firstNoneBlank(theRange As Range, Optional upDownTrue As Boolean) As Variant
Dim i As Long, j As Long
Set theRange = Intersect(theRange, theRange.Worksheet.UsedRange)
For i = 1 To IIf(upDownTrue, theRange.Rows.Count, theRange.Columns.Count)
For j = 1 To IIf(upDownTrue, theRange.Columns.Count, theRange.Rows.Count)
If theRange.Cells(i, j).Value <> "" Then
firstNoneBlank = theRange.Cells(i, j).Value
Exit Function
End If
Next j
Next i
firstNoneBlank = "#AllBlanks"
End Function
我正在使用用于数据收集的电子表格。我被要求创建一个错误检查器,用于检查何时将数据粘贴到电子表格并覆盖数据验证规则。
在单元格 X3:AO33 中,我有一个公式块。他们中的大多数检查空白单元格,然后检查另一个单元格中的有效输入。如果结果有效或不需要,则 return 为空白。否则,它 return 是一条消息。这是一个例子:
=IF(OR(AND(D3<>"",OR(F3="",G3="",H3="")),AND(U3<>"",V3="")),CONCATENATE("Required fields are missing in row ",ROW(),"."),"")
现在我需要在 B2 中放置一些东西来查找 X3:AO33 范围内的消息。我想要它 return 第一个非空白单元格的值。如果 Z5 有第一个发现的错误,那么 B2 应该显示 Z5 中的文本。然后用户可以修复问题,Z5变成空白,如果下一个错误是AB7,B2应该显示AB7的文本。
我已经试过了。
=INDEX(X3:AO33,MATCH(FALSE,ISBLANK(X3:AO33),0))
还有这个。
=INDEX(X3:AO33,MATCH(TRUE,INDEX((X3:AO33<>0),0),0))
还有这个。
=INDEX(X3:AO33,MATCH(TRUE,LEN(X3:AO33)>0,0))
还有这个。
=MATCH("*",X3:AO33,0)
我已经将它们全部作为数组而不是数组进行了尝试。他们都带回了#N/A错误。
知道我做错了什么吗?
我改进了我原来的配方。这将始终如一地为您提供第一个非空白,从左到右,然后向下。 See sample sheet.
=LEFT(TEXTJOIN("??",TRUE,X3:AO30),FIND("??",TEXTJOIN("??",TRUE,X3:AO30))-1)
此外,您可以使用自定义功能,让您可以选择上下或左右移动。
Function firstNoneBlank(theRange As Range, Optional upDownTrue As Boolean) As Variant
Dim i As Long, j As Long
Set theRange = Intersect(theRange, theRange.Worksheet.UsedRange)
For i = 1 To IIf(upDownTrue, theRange.Rows.Count, theRange.Columns.Count)
For j = 1 To IIf(upDownTrue, theRange.Columns.Count, theRange.Rows.Count)
If theRange.Cells(i, j).Value <> "" Then
firstNoneBlank = theRange.Cells(i, j).Value
Exit Function
End If
Next j
Next i
firstNoneBlank = "#AllBlanks"
End Function