VBA 中的 VLookup 不起作用,但它在单元格上起作用

VLookup in VBA is not working however it's working on cells

这是我的函数,它根据我的 Sheet Eng_Availability_Report 中现有的 table 获取包含日期和 return 每周小时数的数组。对我来说,这似乎是正确的,但 VBA 向我发送了一条错误 1004 的消息。我使用了 MsgBox 到 return 周数和我正在寻找的范围内实际存在的数字对于.

Public Function ReturnHoursPerWeek(Arr1() As Variant) As Variant

Dim Hours() As Double, k As Integer, WeekNumber As Integer
Dim ws As Worksheet, wb As Workbook

k = 1
Set wb = ThisWorkbook
Set ws = wb.Sheets("Eng_Availability_Report")

If LBound(Arr1()) = UBound(Arr1()) Then
ReDim Hours(LBound(Arr1()))
    WeekNumber = Int(((Arr1(1, 1) - DateSerial(Year(Arr1(1, 1)), 1, 0)) + 6) / 7)
    MsgBox (" " & WeekNumber & " ")
        If WeekNumber > 0 And WeekNumber < 14 Then
            Hours(k) = Application.WorksheetFunction.VLookup(WeekNumber, ThisWorkbook.Sheets("Eng_Availability_Report").Range("F6:G19"), 7, False)
        ElseIf WeekNumber > 14 And WeekNumber < 27 Then
            Hours(k) = Application.WorksheetFunction.VLookup(WeekNumber, ThisWorkbook.Sheets("Eng_Availability_Report").Range("H6:I19"), 9, False)
        ElseIf WeekNumber > 27 And WeekNumber < 40 Then
            Hours(k) = Application.WorksheetFunction.VLookup(WeekNumber, ThisWorkbook.Sheets("Eng_Availability_Report").Range("J6:K19"), 11, False)
        ElseIf WeekNumber > 40 And WeekNumber <= 53 Then
            Hours(k) = Application.WorksheetFunction.VLookup(WeekNumber, ThisWorkbook.Sheets("Eng_Availability_Report").Range("L6:M19"), 13, False)
        End If
 Else
 ReDim Hours(LBound(Arr1()) - UBound(Arr1()))
 For i = LBound(Arr1()) To UBound(Arr1())
     WeekNumber = Int(((Arr1(i, 1) - DateSerial(Year(Arr1(i, 1)), 1, 0)) + 6) / 7)
        If WeekNumber > 0 And WeekNumber < 14 Then
            Hours(k) = Application.WorksheetFunction.VLookup(WeekNumber, ThisWorkbook.Sheets("Eng_Availability_Report").Range("F6:G19"), 7, False)
        ElseIf WeekNumber > 14 And WeekNumber < 27 Then
            Hours(k) = Application.WorksheetFunction.VLookup(WeekNumber, ThisWorkbook.Sheets("Eng_Availability_Report").Range("H6:I19"), 9, False)
        ElseIf WeekNumber > 27 And WeekNumber < 40 Then
            Hours(k) = Application.WorksheetFunction.VLookup(WeekNumber, ThisWorkbook.Sheets("Eng_Availability_Report").Range("J6:K19"), 11, False)
        ElseIf WeekNumber > 40 And WeekNumber <= 53 Then
            Hours(k) = Application.WorksheetFunction.VLookup(WeekNumber, ThisWorkbook.Sheets("Eng_Availability_Report").Range("L6:M19"), 13, False)
        End If
    k = k + 1
Next

End If

ReturnHoursPerWeek = Hours()

End Function

查看您的代码,当您只有 2 列 (F:F-G:G) 时,您似乎在寻找诸如 7 之类的列号。我猜你需要更改范围或减少增量数。

目前,您正在查找数组之外的列。按照字母顺序,您可能希望从根 'matching' 单元格开始,向右移动 7/8/9 等,然后 return 值。我假设(按照代码)'matching cell' 在第一列中,因此通过更改范围,使第一列始终为 A,以您想要的列结尾。这应该可以解决问题。