无法获取WorksheetFunction类的Match属性

时间:2015-04-09 06:54:44

标签: excel vba excel-vba

我要做的是基于Cell oSht_Input.Cells(Rows, 7),我想在另一个Sheet(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将获取一个单元格的值,这绝对是一个日期值。 periodSheet中的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

2 个答案:

答案 0 :(得分:3)

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

在下面的示例中,例如,

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

工作正常,返回" 4"正如所料,但

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

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

enter image description here

同样see this note了解WorksheetfunctionApplication的行为方式。

答案 1 :(得分:3)

在处理日期时使用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中考虑日期