Следующая часть кода должна выполнять Vlookup с именем листа переменной. Однако vlookup возвращает только 0, а не желаемое значение из диапазона поиска, учитывая, что диапазон поиска имеет одинаковую структуру на этих нескольких листах с именем переменной, поэтому любой совет.
Dim SheetName As Variant: SheetName = DestinationWs.Name
Dim OldRemainingHoursLastRowFirst As Variant
OldRemainingHoursLastRowFirst = DestinationWs.Range("W3").End(xlDown).Row
DestinationWs.Range("L4").FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-2],""'" & StringVal & "'!R4C12:R" & OldRemainingHoursLastRowFirst & "C14"",2,0),0)"
После выполнения следующего кода это снимок из строки формул
Косвенная проблема была решена после обновления команды до DestinationWs.Range("L4").FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-2],INDIRECT(""'" & StringVal & "'!R[4]C[12) ]:R[" & OldRemainingHoursLastRowFirst & "]C[14]"",0),2,0),0)". Но результаты vlookup всегда равны 0. Я использую косвенное значение vlookup через имя листа переменной на основе входного значения
Но вам здесь не нужен INDIRECT()
? Вы подставляете имя листа непосредственно в формулу, поэтому indirect
не требуется. Есть ли у каждого месячного листа таблица поиска в одном и том же диапазоне?
Таким образом, вы можете сказать, что я могу напрямую вставить имя листа переменной в функцию vlookup без косвенного fn! .. что касается второго пункта, да, все листы других месяцев имеют одну и ту же таблицу поиска в том же диапазоне, но с другими данными. Итак, что вы посоветуете.
Введите формулу вручную и заставьте ее работать, затем отредактируйте свой пост и добавьте рабочую формулу, чтобы мы могли точно увидеть, как она должна выглядеть.
Пост обновлен и отредактирован сейчас, после того, как приму во внимание ваш совет.
Ваша формула смешивает обозначения R1C1 и A1?
Слишком много цитат?
Dim SheetName As Variant
SheetName= DestinationWs.Name
DestinationWs.Range("L4").FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-2],INDIRECT('" & _
SheetName & "'!R[" & OldRemainingLastRowFirst & "]C[12]:R[" & _
OldRemainingLastRowFirst & "]C[12]), 2, 0)"
После обновления поста:
Dim srIndex, sMonth, destinationWs As Worksheet, lRow As Long
Dim wsMonth As Worksheet, wsPrevMonth As Worksheet
Dim selMonth, prevMonth, lRow As Longo
'...
selMonth = MonthResultRg.Cells(Application.match(CLng(InputValue), IndexRange, 0))
prevMonth = MonthResultRg.Cells(Application.match(CLng(InputValue) - 1, IndexRange, 0))
'reference selected and previous months' sheets
Set wsMonth = FindSheet(ThisWorkbook, selMonth)
Set wsPrevMonth = FindSheet(ThisWorkbook, prevMonth)
lRow = wsPrevMonth.Range("W3").End(xlDown).Row
wsMonth.Range("L4").Formula = _
"=IFERROR(VLOOKUP(J4,'" & wsPrevMonth.Name & "'!L4:N" & lRow & ",2,0),0)"
FindSheet
Функция:
'return the first sheet in `wb` whose name contains `txt`
Function FindSheet(wb As Workbook, txt) As Worksheet
Dim ws As Worksheet
For Each ws In wb.Worksheets
If InStr(1, ws.Name, txt, vbTextCompare) > 0 Then
Set FindSheet = ws
Exit Function
End If
Next ws
End Function
Ошибка времени выполнения «1004»: ошибка, определяемая приложением или объектом.
Debug.Print
формулу и вставьте ее в ячейку. Excel сообщит вам, если есть проблема
Прежде всего, большое спасибо за вашу помощь, наконец-то это сработало. Пожалуйста, примите мои плохие знания. и еще раз большое спасибо.
Нет проблем - приятно слышать, что у вас все получилось.
Не большой пользователь R1C1, поэтому можете ли вы выразить эту формулу в нотации A1? У меня проблемы с пониманием того, зачем вам нужен ДВССЫЛ...