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

问题描述:

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

下面是一些的伪:

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

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

+1

你能告诉我们你试过了什么,卡在哪里? – 2012-07-11 21:14:46

+0

你有没有试过自己写这个函数?如果是这样,发布你的尝试,我们可以帮助你什么不工作。 – 2012-07-11 21:15:41

+0

这就是你添加的逻辑。你可以显示你实际编写的代码,并提及哪部分不工作... – 2012-07-11 21:20:44

按照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 

UPDATE

这可能是一个更好,更清洁,更容易理解的解决方案。我测试了一下,但有人可能会打破它!

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 
+0

+ 1这工作。但是没有必要循环:) @TimWilliams删除了他的答案,因为你和我要求OP表现出一些努力。他的回答非常好。希望他能够取消删除。 – 2012-07-11 21:43:10

+0

我没有看到他的答案,但看到我的更新。我想,找到一种更简单,更干净的方式。除非有人能破坏它! – 2012-07-11 21:44:12

+0

我认为当函数返回一个错误时返回一个有意义的值是非常非常错误的,并不是我期望范围在某个单元格中包含“Nothing found”,而是作为一般原则。当然,如果单元格本身包含一个值,那么你的第二个变体将不起作用,这不是OP想要的。 – 2012-07-11 21:54:05

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 

编辑:有周围是否有传递范围参数上面没有“非空”细胞会发生什么了一些讨论。由于OP没有具体说明这种情况会发生什么,这只是返回一个空的响应。

+0

+ 1我爱它的简单:) – 2012-07-11 22:08:19

+0

这将是值得的?如果Len(Trim(rng.Cells(1).Value)) 0 Then LoopUp = rng.Value _ Else LoopUp = rng.Cells(1).End(xlUp).Value' – 2012-07-11 22:11:44

+0

Yes! - 我错过了“如果一个单元格为空”问题的一部分 – 2012-07-11 22:24:32

的UDF看起来就像这样:

Function loopUp(Cell) 
    Do While IsEmpty(Cell) 
    Set Cell = Cell.Offset(-1) 
    Loop 
    loopUp = Cell 
End Function 

注意,该功能将仅在细胞本身发生变化重新计算而不是当你改变上述单元格范围(该功能扫描),为了应付添加第二个虚拟参数,该虚拟参数应该设置为您要重新计算功能的范围(为简单起见,可能是整列)。

+3

'Set Cell = Cell.Offset(-1)'如果到达第一行并且是空的,将会中断。需要一个错误陷阱。 – 2012-07-11 21:37:47

+0

@Scott你是什么意思,'会打破'?调用这样一个函数的结果将会是一个错误,正如你期望的那样,当没有值返回的时候。 OP没有要求特殊的错误处理,因此将其作为练习。 – 2012-07-11 21:43:55

+0

从你的结局来看,这是公平的观点,但我只是在发表一个评论,我认为这是值得注意的一个好的编程习惯。 – 2012-07-11 21:49:45