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,以您想要的列结尾。这应该可以解决问题。
这是我的函数,它根据我的 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,以您想要的列结尾。这应该可以解决问题。