2014-10-16 9 views
0

Я использую Excel VBA для вставки функции HLOOKUP в конце данной строки. Я пытаюсь использовать функциональные возможности R1C1 в VBA для вставки функции HLOOKUP, которая должна выглядеть следующим образом в Excel:HLOOKUP в нотации R1C1

=HLOOKUP(D2,'DM NYASSOV'!3:34,32,0) 

Моя проблема заключается в том, что мне нужно HLOOKUP быть достаточно динамичными, что он может ссылаться на переменном из той же строки, на которой должна быть вставлена ​​функция HLOOKUP.

В настоящее время мой VBA выглядит следующим образом:

ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(RC[-17],'DM RC[-19]!'RC[2]:RC[3],RC[3]-RC[2]+1,0)" 

RC[-17] ссылается на переменную Я ищу;
RC[-19] - основной идентификатор книги/табуляции;
RC[2] содержит начальное значение строки, а
RC[3] содержит окончательный справочный диапазон строк.

Моя главная проблема с правильной идентификации выбора динамического диапазона:

'DM NYASSOV'!3:34/'DM RC[-19]!'RC[2]:RC[3] 

Все указатели очень ценятся.

+0

Вам нужна часть имени листа, чтобы оставаться динамической частью формулы? Если это так, вам нужно включить функцию INDIRECT в формулу. – Rory

+0

Каков пример значения, хранящегося в RC [-17], это ссылка на ячейку, например, «A1», или это значение само по себе как «Боб» или «15» или что-то еще? – JNevill

+0

@Rory да имя листа должно оставаться динамическим. Для каждой строки я вставляю функцию HLOOKUP, которая потенциально может ссылаться на другой лист. – ddwport

ответ

1

У меня здесь несколько вопросов. Сначала используется 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.

+0

Просто, чтобы больше узнать о том, что делает мой файл. На моей основной вкладке/листе ссылок у меня есть список торгов, которые назначены определенной книге и предназначены для данной валюты. Для каждой книги у меня есть имя вкладки/листа с префиксом «DM», а затем основное имя книги. По каждой книге уровень торговли разлагается на одну валюту. Ссылочные строки будут меняться в зависимости от валюты основных валют. Я попробую комбинацию вашего четвертого варианта выше, чтобы узнать, есть ли у меня больше удачи. – ddwport

+1

Я работаю. Я поправьте код на следующее: ThisWorkbook.Sheets (selectTab) .Cells (r, 21) .FormulaR1C1 = "= HLOOKUP (RC [-17], 'DM" & book & "'! R" & ccyrow & "C: R" & npvrow & "C," & npvrow - ccyrow + 1 & ", 0)" – ddwport

Смежные вопросы