我要做的是基于Cell oSht_Input.Cells(Rows, 7)
,我想在另一个Sheet(periodSheet)列A中找到匹配项,并根据给定列获取相应的值。
我尝试结合使用.Index
和.Match
来完成此操作。 .Index
对我有用,但是我得到的错误和
运行时错误“1004”:无法获取WorksheetFunction类的Match属性。
我还尝试在代码中执行Application.Match
,但这样会返回#N/A
值。
我做错了什么?
我对Application.Match
和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函数查找值。
答案 0 :(得分:3)
如果找不到匹配项,那就是你得到的错误。
在下面的示例中,例如,
MsgBox WorksheetFunction.Match(4, Range("A1:A4"), 0)
工作正常,返回" 4"正如所料,但
MsgBox WorksheetFunction.Match(5, Range("A1:A4"), 0)
抛出"无法获取WorksheetFunction类的Match属性"错误。
同样see this note了解Worksheetfunction
和Application
的行为方式。
答案 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中考虑日期