2014-12-29 39 views
0

我發現了一個很好的用戶定義函數Nth_Occurence;它尋找範圍內給定值的「第N」次出現。它工作得很好,但在某些情況下,它表現得很奇怪。下面是詳細信息:Excel用戶定義的函數:Nth_Occurence

語法中的公式:= Nth_Occurence(範圍,數值出現時offset_row,offset_col)

= Nth_Occurence(A1:A100,8,6,3,7)這將尋找用於數字8的範圍A1中的第六occurence:A100和返回是3行向下7列到右側

在這裏,單元格的內容被VB代碼:

Function Nth_Occurrence(range_look As Range, find_it As String, occurrence As Long, offset_row As Long, offset_col As Long) 

    Dim lCount As Long 
    Dim rFound As Range 

    Set rFound = range_look.Cells(1, 1) 

    For lCount = 1 To occurrence 

     Set rFound = range_look.Find(find_it, rFound, xlValues, xlWhole) 

    Next lCount 

    Nth_Occurrence = rFound.Offset(offset_row, offset_col) 

End Function 

以下是問題:

1 - 如果查找範圍的顯示不可見(隱藏列,######(部分隱藏值),;;; (在單元格中不顯示),查找失敗並返回#VALUE。

*** FIXED由Ron:2-函數忽略所述第一小區在範圍

***由Ron FIXED:通過itsself 3-結果犯規更新如果目標小區的值(第3行,在我的例子中第7列)改變;我需要運行:ActiveSheet.EnableCalculation =假ActiveSheet.EnableCalculation =真

我VB的水平是 '複製/粘貼',變化值,希望最好...

謝謝大家

更新實施例看問題1:

在細胞

A1輸入公式:= D1和下拉到A10(所以A1:A10是指D1:D10)

填充單元格D1:D10與值:1,2, 3,1,2,3,1,2,3,1

填充單元B1:B10與值:放於小區C2

99,98,97,96,95,94,93,92,91,90

「3」 在小區C1輸入式:= Nth_Occurrence(A1:A10,c2,2,0,1)

結果應該是94,在小區C2輸入 「2」,結果應該是95

**塔A的設置寬度:甲至5像素...

在單元格C2中輸入「3」,結果爲:#VALUE

修復:將列A的重置寬度:A重置爲顯示C2的內容和更改值的級別。

+0

沒有理由應該忽略第一個單元格,但它不會檢查它,直到最後一個(見range.find HELP)。您也可能需要檢查環繞搜索。嘗試'Application.Volatile'來更新不在參數列表中的單元格更改。不確定隱藏的數據。你需要提供一些失敗的例子。 –

+0

謝謝羅恩修復問題2 – Simon

+0

對於問題1,嘗試尋找xlFormulas而不是xlValues –

回答

0

下面的代碼似乎解決了您提到的問題。請注意,您的代碼

  • 不檢查環繞。即如果只有兩個實例,並且您正在查找第三個實例,則該代碼將返回第一個實例。

  • 將返回#VALUE!如果findit不存在

  • 注意我們如何變化,開始從最後小區搜索,以修正你的問題#2

  • 編輯的OP補充說,正在搜索的數據來自公式而不是根據他最初的問題所指出的價值。因此,下面的代碼已被修改爲.Find不再適用於隱藏列。

  • 此外,如果有發生> find_it的實例的數目(可以在必要時改變)這個代碼將返回一個錯誤

  • EDIT2:的OP現已加入另外的說明書,所述值要返回可能需要負列偏移量。下面的代碼應該處理這個問題,通過設置第二個數組來返回適當的值。


Option Explicit 
Function Nth_Occurrence(range_look As Range, find_it As String, occurrence As Long, offset_row As Long, offset_col As Long) 
Application.Volatile 
    Dim lCount As Long 
    Dim V1 As Variant, V2 As Variant 
    Dim I As Long 

V1 = range_look 
V2 = range_look.Offset(0, offset_col) 

For I = 1 To UBound(V1, 1) 
    If V1(I, 1) = find_it Then lCount = lCount + 1 
    If lCount = occurrence Then Exit For 
Next I 

    Nth_Occurrence = V2(I + offset_row, 1) 

End Function 
+0

解決方案修復了問題1,如示例中所示;但是在我的主工作表中,範圍中的值來自公式,因此用xlFormulas代替xlValues無法應用 – Simon

+0

@Simon始終最好呈現實際問題的相關數據,但在這種情況下,一種修復方法是循環訪問數據。請參閱修改後的答案 –

+0

我更新了示例以反映您的答案非常感謝您..完美地工作 – Simon