2012-07-11 156 views
2

如果一個單元格是空的,我希望它在上面的單元格中查找。如果那個是空的,它將在上面的單元格中查找,直到它找到一個非空單元格。當它發生時,它應該返回它。這將是一個叫做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

回答

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 

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

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 

編輯:有周圍是否有傳遞範圍參數上面沒有「非空」細胞會發生什麼了一些討論。由於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

0

的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

相關問題