如果一个单元格是空的,我希望它在上面的单元格中查找。如果那个是空的,它将在上面的单元格中查找,直到找到非空单元格。如果是,它应该返回它。它将是一个名为loopUp
的UDF。然后,当我在像这样的单元格公式中使用它时:=loopUp(D24)
,范围D18:D24为空,它将显示D17中的内容。
这是一些Psuedo:
Function loopUp(Cell)
while Cell is empty
Cell becomes cell above
return cell
我是VBA的新手。我坚持的是如何传递一个单元格的地址而不是它的值。
答案 0 :(得分:4)
根据Siddharth的最后建议,这是解决问题的方法。
Function LoopUp(rng As Range) As Variant
Dim intCnt As Long
LoopUp = "Nothing found"
For intCnt = rng.Row To 1 Step -1
If Not IsEmpty(Cells(intCnt, rng.Column)) Then
LoopUp = Cells(intCnt, rng.Column)
Exit For
End If
Next
End Function
<强>更新强>
这可能是更好,更清洁,更易于理解的解决方案。我测试了一下,但是有人可能会打破它!
Function LoopUp(rng As Range) As Variant
If Not IsEmpty(rng) Then LoopUp = rng
Else
If rng.End(xlUp).Row = 1 Then LoopUp = "Nothing found" Else LoopUp = rng.End(xlUp)
End If
End Function
答案 1 :(得分:3)
Function LoopUp(rng as Range)
With rng.Cells(1)
If Len(.Value) > 0 Then
Lookup = .Value
Else
LoopUp = .End(xlUp).Value
End If
End With
End Function
编辑:如果在传递的Range参数之上没有“非空”单元格,那么会讨论会发生什么。由于OP没有指定在这种情况下会发生什么,这只会返回一个空响应。
答案 2 :(得分:0)
UDF将如下所示:
Function loopUp(Cell)
Do While IsEmpty(Cell)
Set Cell = Cell.Offset(-1)
Loop
loopUp = Cell
End Function
注意,只有当Cell本身被更改时才会重新计算该函数,而不是当你更改Cell上方的范围(函数扫描)时,该函数将被重新计算,为了应对这一点,添加第二个虚拟参数,该参数应该设置为你的范围希望监视功能重新计算(为简单起见,可能是整栏)。