如何获取列中的第一个非空单元格?

时间:2012-07-11 21:12:49

标签: excel vba excel-vba

如果一个单元格是空的,我希望它在上面的单元格中查找。如果那个是空的,它将在上面的单元格中查找,直到找到非空单元格。如果是,它应该返回它。它将是一个名为loopUp的UDF。然后,当我在像这样的单元格公式中使用它时:=loopUp(D24),范围D18:D24为空,它将显示D17中的内容。

这是一些Psuedo:

Function loopUp(Cell)
    while Cell is empty
        Cell becomes cell above
    return cell

我是VBA的新手。我坚持的是如何传递一个单元格的地址而不是它的值。

3 个答案:

答案 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上方的范围(函数扫描)时,该函数将被重新计算,为了应对这一点,添加第二个虚拟参数,该参数应该设置为你的范围希望监视功能重新计算(为简单起见,可能是整栏)。