Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何查找列中第n次出现的值_Excel_Vba - Fatal编程技术网

Excel 如何查找列中第n次出现的值

Excel 如何查找列中第n次出现的值,excel,vba,Excel,Vba,我再次修改了VBA。现在当我运行它时,我什么也得不到。它没有“崩溃”,但没有给出预期的答案 我从网上的一个VBA示例中复制了这一点,在解释了函数后,它说: 自定义函数/公式现在可以如下所示使用: “=第n次出现($B$1:$B$22,“Harry”,3,0,1)”(忽略“speach标记”) 它没有解释在=n次出现之前代码中必须包含的内容。这应该是变量(变量还是字符串)?或者别的什么 它也没有解释如何定义“Range\u Look”,所以我猜测:set Range\u Look=Range($K

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

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

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

它没有解释在
=n次出现之前代码中必须包含的内容。这应该是变量(变量还是字符串)?或者别的什么

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

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

我知道我是一个真正的痛苦的谚语,但它让我疯狂。我也知道这不是实现最终结果的唯一方法,但它(我认为)相当优雅,或者如果我能让它发挥作用的话

请某人(巫术?),把我从痛苦中解救出来

Sub-Macro2()
'
'宏2宏
'
'键盘快捷键:Ctrl+q
Dim bankacctA As String'查找“支票年度”银行账户
Dim bankacctB As String'这将是“新”生成的年份
Input_Year=InputBox(提示:=“您希望添加的年份是什么-以yyyy格式输入”_
标题:=“输入年份”,默认值:=“未输入年份”)
如果IsNumeric(输入年份)=False,则
出口接头
其他的
如果结束
Short_Input_Year=右(Input_Year,2)'输入年份的最后两位数字
检查年份=输入年份-1
短支票年=右(支票年,2)'支票年的最后两位数字
下一年=(输入年+1)
bankacctA=(“bankacct”和“Short_Check_Year”)和“.xlsx”查找“Check Year”bankacct
变暗范围\u看起来像范围
变暗作为变体
Windows(“Savings Details.xlsm”)。激活
工作表(“表格排序”)。选择
设置范围\u Look=Range(“K4:K34”)'工作表已被选中
a=第n次出现(范围为外观,CStr(bankacctA),2,1,-1)
ActiveCell.Offset(0,-1)。值=a
端接头
函数n次出现(范围作为范围,查找作为字符串,出现作为长度,偏移行作为长度,偏移列作为长度)
暗淡如长
暗光范围
Set rFound=范围\外观单元格(1,1)
对于lCount=1,则为
Set rFound=Range\u Look.Find(Find\u It,rFound,xlValues,xlPart)
下一个帐户
第n个匹配项=rFound.Offset(偏移量行,偏移量列)
端函数

您需要将范围参数添加到函数签名中

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为字符串
或在cast
CStr(bankacctA)

中换行。范围应为
n次出现的参数
。对不起,BigBen。正如我所说,我正在与vba抗争,但我不想放弃。你认为在代码中,Activecell.value=nthconcurrence(“k4:k36”等),还是说在函数中,“Range\u Look”应该在nthconcurrence之后的括号内(??我也知道我漏掉了一个“)”在Activecell的末尾。Value=etc…No.现在
n次出现
有3个参数:
Find_It As String,Occurrence As Long,Offset_Row As Long
。它应该有一个额外的参数,这将是有问题的范围。好的,尝试一下。现在在代码行我得到了“By ref参数类型不匹配”谢谢。很抱歉延迟回复,但时间太晚了,我不得不离开论坛。我稍后会尝试您的解决方案,并让您知道结果。@mikesingleton,这是因为find中的第二个变量需要是单个单元格,而不是一系列单元格。更新的回答谢谢Sorcen。再一次,您必须在我走的时候起床睡觉。我稍后再试,让您知道!如果范围\u Look中的第一个单元格与Find\u It匹配,则此操作将失败(Find在指定单元格之后开始)。使用
Set rFound=Range\u Look(Range\u Look.cell.Count)
谢谢Chris。尝试此操作后,我得到“运行时错误438:对象不支持此属性或方法”在Set rFound=等:我就是不明白!!!