Это моя функция, чтобы взять массив с датами и вернуть часы в неделю в соответствии с существующей таблицей в моем листе Eng_Availability_Report
. Для меня это кажется правильным, но VBA отправляет мне сообщение с ошибкой 1004. Я использовал MsgBox
, чтобы вернуть номер недели, а фактическое число существует в диапазоне, который я ищу.VLookup в VBA не работает, но он работает с ячейками
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
В какой момент он возвращает ошибку? – pnuts
Когда он выполняет Application.WorksheetFunction.Vlookup (Arg1, Arg2 ...). Не мог понять, почему. –
Кажется, вы пытаетесь найти шестой столбец после 'F' в массиве F6: G19 и т. Д. – pnuts