【问题标题】:how can i find the nth occurrence of a value in a column如何在列中找到第 n 次出现的值
【发布时间】:2020-03-16 14:27:28
【问题描述】:

我再次修改了 VBA。现在,当我运行它时,我什么也得不到。它不会“崩溃”,但不会给出预期的答案。

我从网上的一个VBA示例中复制了这个,在解释了函数之后它说:

现在可以使用自定义函数/公式,如下所示:
"=Nth_Occurrence($B$1:$B$22,"Harry",3,0,1)" (忽略“语音标记”)

它没有解释=Nth_Occurrence 等之前的代码中必须有什么。这应该是一个变量(变量还是字符串)?或者别的什么。

它也没有解释如何定义“Range_Look”,所以我猜测:set Range_Look = range($K$4:$K$41)(我的范围与示例相反)。

最后,如果我将 Set Range_Look = Range("K4:K34") 更改为 Range_Look = ActiveSheet.Range("K4:K31"),我会收到“运行时错误 91:对象变量或未设置块变量”,还是我需要两者?

众所周知,我知道自己真的很痛苦,但这让我发疯了。我也知道这不是实现最终结果的唯一方法,但它(我认为)非常优雅,或者如果我可以让它工作的话。

请某人(巫师?),让我摆脱痛苦。

Sub Macro2()
'
' Macro2 Macro
'
' Keyboard Shortcut: Ctrl+q

    Dim bankacctA As String                      'Finds the "Check Year" bankacct
    Dim bankacctB As String                      'This will be the "New" generated year

    Input_Year = InputBox(Prompt:="What is the Year you wish to Add - Enter in format yyyy", _
        Title:="ENTER THE YEAR", Default:="No Year Entered")

    If IsNumeric(Input_Year) = False Then
        Exit Sub
    Else
    End If

    Short_Input_Year = Right(Input_Year, 2)      'The last 2 digits of the Input Year
    Check_Year = Input_Year - 1
    Short_Check_Year = Right(Check_Year, 2)      'The last 2 digits of the Check Year
    Next_Year = (Input_Year + 1)

    bankacctA = ("bankacct" & Short_Check_Year) & ".xlsx"                                          'Finds the "Check Year" bankacct

    Dim Range_Look As Range
    Dim a As Variant

    Windows("Savings Details.xlsm").Activate
    Sheets("Table Sort").Select

    Set Range_Look = Range("K4:K34")    'The worksheet has already been selected

    a = Nth_Occurrence(Range_Look, CStr(bankacctA), 2, 1, -1)

    ActiveCell.Offset(0, -1).Value = a
End Sub

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, xlPart)
        Next lCount
     Nth_Occurrence = rFound.Offset(Offset_Row, Offset_Col)
End Function

【问题讨论】:

  • 范围应该是Nth_Occurrence的参数。
  • 对不起,大本。正如我所说,我正在努力使用 vba,但不想放弃。您是否认为在代码中,Activecell.value = NthOccurrence("k4:k36", etc. 或者您是说在函数中“Range_Look”应该在 Nth_Occurrence(??
  • 我也知道我在 Activecell.Value = etc 的末尾错过了一个“)”......
  • 没有。现在 Nth_Occurrence 有 3 个参数:Find_It As String, Occurrence As Long, Offset_Row As Long。它应该有一个额外的参数,这将是有问题的范围。
  • 好的,试过了。现在在代码行上,我得到“通过 ref 参数类型不匹配”

标签: excel vba


【解决方案1】:

您需要将 Range 参数添加到您的函数签名中。

Dim Range_Look As Range
Range_Look = ActiveSheet.Range("K4:K31")                    'The worksheet has already been selected

          ActiveCell.Value = Nth_Occurrence(Range_Look, bankacctA, 2, 1)


'Function: Add the Range as a paramter
Public Function Nth_Occurrence(Range_Look As Range, Find_It As String, Occurrence As Long, Offset_Row As Long)

Dim lCount As Long
Dim rFound As Range

    Set rFound = Range_Look(1)'set it to the first cell in the range


        For lCount = 1 To Occurrence

            Set rFound = Range_Look.Find(Find_It, rFound, xlValues, xlWhole)

        Next lCount

    Nth_Occurrence = rFound.Offset(Offset_Row)

End Function

现在,当您收到 by ref 错误时,这是​​因为您传递了一个变体,其中为参数 bankacctA 声明了一个字符串(至少在提供示例中)。您需要声明 Dim bankacctA as String 或加入演员阵容 CStr(bankacctA)

【讨论】:

  • 谢谢。很抱歉回复晚了,但这里已经很晚了,我不得不离开论坛。我稍后会尝试您的解决方案并告诉您结果。
  • @mikesingleton 这是因为 find 中的第二个变量需要是单个单元格而不是单元格范围。更新答案
  • 感谢 Sorcen。再说一次,我要睡觉的时候你一定要起床。我稍后再试,让你知道!
  • 如果 Range_Look 中的第一个单元格与 Find_It 匹配,这将失败(查找开始 在指定单元格之后)。使用Set rFound = Range_Look(Range_Look.Cell.Count)
  • 谢谢克里斯。试过这个,我在 Set rFound = 等处得到“运行时错误 438:对象不支持此属性或方法”:我就是不明白!!!
猜你喜欢
  • 1970-01-01
  • 2018-05-28
  • 2016-01-16
  • 2014-04-11
  • 2021-06-26
  • 1970-01-01
  • 2015-12-04
  • 2021-08-27
  • 2011-04-10
相关资源
最近更新 更多