【问题标题】:Unable to get Match property of the WorksheetFunction class无法获取 WorksheetFunction 类的 Match 属性
【发布时间】:2015-06-14 10:04:52
【问题描述】:

我想做的是基于一个单元格oSht_Input.Cells(Rows, 7),我想在另一个Sheet的(periodSheet)A列中找到匹配项,并根据给定的列获取相应的值。

我尝试结合使用 .Index.Match 来做到这一点。 .Index 对我有用,但是我收到错误提示

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

我也尝试在代码中使用 Application.Match,但这会返回一个 #N/A 值。

我做错了什么?

我对@9​​87654330@ 和Application.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 将接受一个单元格的值,这绝对是一个日期值。 periodSheet 中的 A 列包含从 2000 年 1 月 1 日到 2020 年 12 月 31 日的每个日期,基本上涵盖了所有可能的日期。您可以放心地假设 dateCell 的值将在 20 年的范围内。

1. 这是 oSht_Input,其中 G 列是日期

2. 这是 PeriodMetadata 表,我试图在其中匹配 A 列(其中包含 2000-2020 年的每个日期,然后根据 .index 函数查找值。

【问题讨论】:

  • @Jean-FrançoisCorbett 那是因为我之前的探索是关于 Android 开发的,而给出的大部分内容并没有真正帮助解决我的问题。但是,一旦他们帮助/解决问题,我就会接受答案,并感谢其他所有人的投入。如果你真的想要一个赞成票作为赞赏,那很好,我就给你(不知道为什么要进行这个讨论,第一次在这些事情上被挑剔)
  • @Jean-FrançoisCorbett 指出。我会在等待更多建议/解决方案的同时进一步探索,谢谢
  • 在 VBA 中使用 Match() 函数,我发现在处理日期时转换为 Long 通常可以解决问题。
  • 尝试改用CLng()。 Excel 将日期存储为数字,有时您必须在 VBA 中接受这一事实。

标签: vba excel


【解决方案1】:

在处理日期时使用 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 错误。再次感谢您!
  • 什么???令人惊讶的是,Debug.Print WorksheetFunction.Match(Range("C3"), Range("A1:A14"), 0) 有效,即使它应该隐式使用默认属性 .Value。我不明白。必须是一个错误。无论哪种方式,都很好发现。
  • @Jean-FrançoisCorbett 这是我达到我的知识边界的地方 - 我知道在没有指定的情况下,VBA 将使用 .Value 作为默认范围方法,但那里是否有某种程度的评估产生Long 而不是Date 数据类型? - 诚然,可能比评论更适合聊天。我会尝试一些测试,也许尝试在 VS 中调试,看看我得到了什么 - 如果我发现任何东西,我会相应地更新我的答案:)
  • @Jean-FrançoisCorbett 跟进:stackoverflow.com/questions/29533627/…
【解决方案2】:

如果找不到匹配项,这就是您得到的错误。

例如,在下面的示例中,

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

工作正常,按预期返回“4”,但是

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

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

还有see this note 了解WorksheetfunctionApplication 的行为方式有何不同。

【讨论】:

  • 感谢您强调这一点,我已按照您的建议添加了额外信息。将尝试同时处理更多屏幕截图以更好地说明我的问题
猜你喜欢
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多