2015-04-28 2 views
0

Это моя функция, чтобы взять массив с датами и вернуть часы в неделю в соответствии с существующей таблицей в моем листе 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 
+0

В какой момент он возвращает ошибку? – pnuts

+0

Когда он выполняет Application.WorksheetFunction.Vlookup (Arg1, Arg2 ...). Не мог понять, почему. –

+0

Кажется, вы пытаетесь найти шестой столбец после 'F' в массиве F6: G19 и т. Д. – pnuts

ответ

0

Глядя на ваш код, вы, кажется, ищет числа столбцов, таких как 7, когда у вас есть только 2 колонки (F: F-G: G). Я думаю, вам нужно изменить диапазоны или уменьшить инкрементные числа.

На данный момент вы ищете столбец вне массива. Идя по буквам, которые вы, вероятно, хотите начать с корневой ячейки соответствия, и пойдите 7/8/9 и т. Д. Вправо и верните значение. Я предполагаю (по коду), что «сопоставляющая ячейка» находится в первом столбце, поэтому, изменяя диапазоны, чтобы первый столбец всегда был A, заканчивающийся в нужном столбце. Это должно решить проблему.

+0

Добро пожаловать в Stackoverflow. Не могли бы вы немного расширить ответ, чтобы объяснить, как это помогает решить проблему. – Daenarys

+0

Сделали. Надеюсь, это немного яснее. – Trum

+0

Спасибо, Trum, Daenarys и pnuts. Я был перед проблемой, но я не мог видеть. Сейчас все работает. –