У меня здесь несколько вопросов. Сначала используется VBA для динамического построения формулы, которая затем вычисляет третье значение, которое затем используется в формуле, которая, наконец, вычисляет результат. Это похоже на ненужное количество ошибок для значения, которое может быть выполнено либо с помощью формулы, построенной на лицевой стороне, либо вычисляемой через VBA на задней панели. Второй - это все динамический поиск всего. Это не столько проблема, сколько многое, чтобы отслеживать, когда вы прыгаете через четыре обруча. Точно так же ...
Первыми параметрами вашего HLOOKUP могут быть либо значения типа «SM1804», либо ссылка на ячейку, содержащую «SM1804». Вы можете использовать VBA, чтобы довести это значение непосредственно в формулу и сохранить Excel некоторой обработку, имея для поиска, что значение во время обработки формулы:
ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(" & Sheets(selectTab).Cells(r, 21).Offset(0, -17).value & ",'DM RC[-19]!'RC[2]:RC[3],RC[3]-RC[2]+1,0)"
Или вы можете вставить ссылку на ячейку там (что что вы делаете сейчас):
ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(RC[-17],'DM RC[-19]!'RC[2]:RC[3],RC[3]-RC[2]+1,0)"
ко второму параметру ... Я считаю, что у вас есть имя листа в DM!RC[-19]
Это совершенно нормально, но вы должны будете использовать «Непрямой», чтобы получить этот лист название в формулу HLOOKUP:
ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(RC[-17],Indirect("'" & DM!RC[-19] & "'!RC[2]:RC[3]"),RC[3]-RC[2]+1,0)"
... здесь все становится немного сложнее. Если, например, в DM! RC [-19] у вас есть имя листа «Sheet1», то косвенное возвращается: «Sheet1»! RC [2]: RC [3], и ваш HLOOKUP будет использовать этот диапазон для выполнения lookup ... Не имеет большого смысла делать HLOOKUP в диапазоне с двумя ячейками. Поэтому я предполагаю, что у вас есть числовые значения в RC[2]
и RC[3]
, которые представляют строки. Так на самом деле косвенная бы выглядеть следующим образом:
ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(RC[-17],Indirect("'" & DM!RC[-19] & "'!R" & RC[2] & "C:R" & RC[3] & "C"),RC[3]-RC[2]+1,0)"
Теперь, если ваш RC[2]
имеет значение «4» и ваш RC[3]
имеет значение «20» ваш непрямого возвратит: 'Sheet1'!R4C:R20C
и ваш ГПР будет использовать это значение в качестве диапазон, в котором он будет искать.
Вы также занимаетесь математикой по этим значениям в RC[2]
и RC[3]
, так что это, вероятно, все хорошо и не нужно менять. Вам просто нужно держать в голове то, что VBA собирается вернуть в качестве формулы, а затем, что эта формула собирается получить от Indirect
, а затем то, что собирается получить HLOOKUP
.
Это очень важно отслеживать и может быть упрощено только путем написания формул непосредственно в ячейке и копирования или просто выполнения функций HLOOKUP непосредственно в VBA.
Вам нужна часть имени листа, чтобы оставаться динамической частью формулы? Если это так, вам нужно включить функцию INDIRECT в формулу. – Rory
Каков пример значения, хранящегося в RC [-17], это ссылка на ячейку, например, «A1», или это значение само по себе как «Боб» или «15» или что-то еще? – JNevill
@Rory да имя листа должно оставаться динамическим. Для каждой строки я вставляю функцию HLOOKUP, которая потенциально может ссылаться на другой лист. – ddwport