无法获取WorksheetFunction类的Match属性

4
我尝试的是基于单元格 oSht_Input.Cells(Rows, 7),在另一个工作表(“periodSheet”)的A列中查找匹配项,并根据给定列获得相应的值。
我已经尝试使用.Index.Match结合使用来执行此操作。对于我来说,.Index可以正常工作,但是我收到了以下错误信息:

运行时错误'1004':无法获取WorksheetFunction类的Match属性。

我也尝试在代码中使用Application.Match,但会返回#N/A值。
我做错了什么?
我有点困惑使用Application.MatchApplication.WorksheetFunction.Match的方法。
Set oSht_Input = Worksheets(outSheet)
Set periodSheet = Worksheets("PeriodMetadata")
lastRow = oSht_Input.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

For Rows = 2 To lastRow
    With Application.WorksheetFunction
        dateCell = oSht_Input.Cells(Rows, 7)
        If rollupDataFile.GroupByPeriod Like "Week*" Then
            If rollupDataFile.GroupByPeriod Like "*Sunday" Then
                oSht_Input.Cells(Rows, 16).value = .Index(periodSheet.Range("B:H"), .Match(dateCell, periodSheet.Range("A:A"), 0), 1)
            ElseIf rollupDataFile.GroupByPeriod Like "*Monday" Then                    
                oSht_Input.Cells(Rows, 16).value = .Index(periodSheet.Range("B:H"), .Match(dateCell, periodSheet.Range("A:A"), 0), 2)

.... code continues

编辑:根据初始反馈,我决定添加更多上下文以更好地澄清。

dateCell将接收一个单元格的值,该值绝对是日期值。期间表中的A列包含了从2000年1月1日到2020年12月31日的每个日期,基本上涵盖了所有可能的日期。您可以安全地假设dateCell的值将在这20年的范围内。

1. 这是oSht_Input,其中G列是日期 This is the oSht_Input, where Column G is the date

2. 这是PeriodMetadata表,我正在尝试匹配A列(该列包含2000-2020年的每个日期),然后根据.index函数找到值。 This is the PeriodMetadata sheet, where I am trying to match to Column A (which contains every single date of year 2000-2020 before finding the value based on the .index function


密切相关:https://dev59.com/s14d5IYBdhLWcg3wAedX - Jean-François Corbett
@Jean-FrançoisCorbett 注意到了。我会在等待更多建议/解决方案的同时进一步探索,谢谢。 - lyk
在单元格中执行与公式相同的“MATCH”操作是否有效? - Jean-François Corbett
2
使用VBA中的Match()函数,我发现在处理日期时将其转换为Long通常是解决问题的方法。 - SierraOscar
1
尝试使用 CLng()。Excel将日期存储为数字,有时在VBA中必须遵从这个事实。 - SierraOscar
显示剩余4条评论
2个回答

4

在处理日期时,请使用CLng().Value2代替:

Sub SO()
'// C3 = "03/02/2015"
'// A1:A14 = "01/02/2015" to "14/02/2015"
'// All cells formatted as dates

'// This will NOT work:
Debug.Print WorksheetFunction.Match(Range("C3").Value, Range("A1:A14"), 0)

'// This WILL work:
Debug.Print WorksheetFunction.Match(Range("C3").Value2, Range("A1:A14"), 0)

'// This WILL also work:
Debug.Print WorksheetFunction.Match(CLng(Range("C3").Value), Range("A1:A14"), 0)

End Sub

这是因为Excel把日期存储为数字的方式 - 这在VBA中有时需要考虑到。

是的,目前看起来可以工作了,我只需要解决一些小的逻辑问题,而不是1004错误。再次非常感谢你! - lyk
什么???令人惊讶的是,Debug.Print WorksheetFunction.Match(Range("C3"), Range("A1:A14"), 0) 能够正常工作,尽管它应该隐式地使用默认属性.Value。我不明白。这一定是一个错误。无论如何,你发现得很好。 - Jean-François Corbett
@Jean-FrançoisCorbett 这就是我知识的边界所在 - 我知道如果不指定,VBA会将.Value作为默认的范围方法,但是否存在某种评估水平,可以产生Long而不是Date数据类型? - 可能更适合于聊天而不是评论。我会尝试一些测试,也许尝试在VS中进行调试并查看结果 - 如果我发现任何东西,我会相应地更新我的答案 :) - SierraOscar
@Jean-FrançoisCorbett 跟进:https://dev59.com/xonda4cB1Zd3GeqPAIOS - SierraOscar

3

当没有匹配项时,你会收到错误提示。

例如,在下面的示例中,

MsgBox WorksheetFunction.Match(4, Range("A1:A4"), 0) 

代码运行正常,按预期返回了“4”,但是

MsgBox WorksheetFunction.Match(5, Range("A1:A4"), 0) 

抛出“无法获取WorksheetFunction类的Match属性”错误。

enter image description here

此外,请注意,关于WorksheetfunctionApplication的行为差异。


谢谢您的指出,我已经根据您的建议添加了额外的信息。同时会尝试增加更多的截图以更好地说明我的问题。 - lyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接