Excel用户定义函数:第n次出现

Excel用户定义函数:第n次出现,excel,user-defined-functions,vba,Excel,User Defined Functions,Vba,我发现了一个很好的用户定义函数,名为Nth\u occurrence;它查找范围内给定vaue的“第n次”出现次数。它工作得很好,但在某些情况下,它的行为很奇怪。详情如下: 公式中的语法:=n\u occurrenceRange、Value、occurrence、offset\u row、offset\u col =第n次出现A1:A100,8,6,3,7这将查找A1:A100范围内数字8的第6次出现,并返回向下3行、向右7列的单元格内容 下面是VB代码: Function Nth_Occurr

我发现了一个很好的用户定义函数,名为Nth\u occurrence;它查找范围内给定vaue的“第n次”出现次数。它工作得很好,但在某些情况下,它的行为很奇怪。详情如下:

公式中的语法:=n\u occurrenceRange、Value、occurrence、offset\u row、offset\u col

=第n次出现A1:A100,8,6,3,7这将查找A1:A100范围内数字8的第6次出现,并返回向下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-如果查找范围的显示不可见隐藏列,则部分隐藏值;;;单元格属性中没有显示,查找失败并返回值

***由Ron修正:2-函数忽略范围内的第一个单元格

***由Ron修复:3-如果我的示例中目标单元格第3行第7列的值发生更改,则结果不会自行更新;我需要运行:ActiveSheet.EnableCalculation=False ActiveSheet.EnableCalculation=True

我的VB水平是“复制/粘贴”,改变值,希望最好

谢谢大家

更新示例以查看问题1:

在单元格A1中,输入公式:=D1并向下拉至A10,因此A1:A10表示D1:D10

用值1,2,3,1,2,3,1,2,3,1,2,3,1填充单元格D1:D10

用数值99,98,97,96,95,94,93,92,91,90填充单元格B1:B10

将3放入单元格C2

单元格C1中的输入公式:=n次发生率A1:A10,c2,2,0,1

结果应为94,在单元格C2中输入2,结果应为95

**将列A:A的宽度设置为5像素

在单元格C2中输入3,结果现在为:VALUE


修复:将A:A列的宽度重置为显示内容并更改C2值的级别。

以下代码似乎可以解决您提到的问题。请注意,您的代码

不检查环绕。也就是说,如果只有两个实例,而您正在查找第三个实例,那么代码将返回第一个实例

将返回值!如果findit不存在

请注意我们如何更改为从最后一个单元格开始搜索,以便更正问题2

编辑OP补充说,正在搜索的数据来自公式,而不是他最初问题中指出的值。相应地,下面的代码被修改为.Find不再适用于隐藏列

此外,如果find_it的实例数大于“发生次数”,则此代码将返回一个错误,必要时可以对其进行更改

EDIT2:OP现在添加了一个额外的规范,即要返回的值可能需要负的列偏移量。下面的代码应该通过设置第二个数组来处理这个问题,从中返回适当的值


它没有理由忽略第一个单元格,但直到最后一次查看帮助中的range.find,它才会检查它。此外,您可能需要检查环绕搜索。当不在参数列表中的单元格发生更改时,请尝试“Application.Volatile”进行更新。不确定隐藏的数据。您需要提供一些失败的示例。感谢Ron修复了问题2。对于问题1,请尝试查找xlFormulas而不是xlValuesAddingApplication。Volatile到代码第2行修复了问题3;将第6行的xlValues更改为XLFORMERS,解决了问题1。。感谢您解决了示例中提出的问题1;但是,在我的主要工作表中,范围内的值来自公式,因此无法使用xlFormulas替换xlValuesapplied@Simon最好是呈现实际问题的相关数据,但在这种情况下,一种修复方法是循环数据。参见修改后的答案我更新了示例以反映您的答案非常感谢。。工作完美新代码似乎不接受列偏移量为负值,而行偏移量为负值。是否可以添加此值?@Simon当显示的数据不能真正代表真实数据时出现的另一个困难示例。请参阅我答案的下一次编辑。
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