2015-08-31 5 views
-3

У меня есть эта формула, которая рассматривает различные критерии по нескольким столбцам и проверяет, чтобы, если все критерии совпадают, они будут вставлять данные из одного столбца в другой. Я пробовал пару способов получить его в VBA, но я не могу заставить ничего работать. Благодаря!Преобразование формулы Excel в VBA

=INDEX($D$2:$D$1112,MATCH(1,($A$2:$A$1112=$U$7)*($C$2:$C$1112=$W$7)*($B$2:$B$1112=F3),0)) 
+6

Что вы пытались и что произошло? –

ответ

0

Вам необходимо 2 изменения:

(1) Для того, чтобы использовать функцию в VBA, когда он доступен в родном Excel, вам необходимо предварить каждую функцию с Application.WorksheetFunction. то есть:

x = Application.WorksheetFunction.Sum(y,z) 

(2) Для ссылки на ячейки в таблице, в VBA, вы должны получить доступ к нему в частности, в одном из нескольких способов. Самый простой для наших целей является собственностью RANGE следующим образом:

x = Application.WorksheetFunction.Sum(Range("A1:A2")) 

Так поставить эти два изменения вместе, ваша формула будет выглядеть следующим образом:

=Application.WorksheetFunction.INDEX(Range("$D$2:$D$1112",Application.WorksheetFunction.MATCH(1,(RANGE("$A$2:$A$1112"=RANGE("$U$7")*(Range("$C$2:$C$1112"=Range("$W$7")*(Range("$B$2:$B$1112"=Range("F3"),0)) 

Хотя я вижу теперь, пройдя через это что вы, кажется, используете Формулу Array - не уверены, требуется ли какое-либо специальное отключение, чтобы заставить это работать.

1

Вы не сможете использовать формулу массива, чтобы прямо вернуть значение в ячейку. VBA не обрабатывает формулу массива так, как это может сделать рабочий лист. Лучший способ - использовать обработку рабочего листа или один из методов Application Evaluate.

Ваш недостаток рабочего листа для справки беспокоит меня. Когда формула находится в ячейке рабочего листа, она знает какой рабочий лист он включен. При использовании формул в VBA родительский лист является «наилучшим вариантом» без явной ссылки на рабочий лист.

Вот три метода, чтобы поместить результаты из этой формулы массива в Z2: Z4 на активной рабочей таблице. Помните, что эти ссылки на ячейки должны быть изменены, чтобы включить имя рабочего листа.

With ActiveSheet 
    'this simply puts the formula into the worksheet then reverts the cell from the formula to the returned formula value 
    .Range("Z2").FormulaArray = "=INDEX($D$2:$D$1112, MATCH(1, ($A$2:$A$1112=$U$7)*($C$2:$C$1112=$W$7)*($B$2:$B$1112=F3), 0))" 
    .Range("Z2") = .Range("Z2").Value 

    'this uses the 'square bracket' method of evaluating a formula on-the-fly 
    'the formula being evaluated can be array or non-array 
    'this method is does not like building a formula string from pieces of text 
    .Range("Z3") = [INDEX($D$2:$D$1112, MATCH(1, ($A$2:$A$1112=$U$7)*($C$2:$C$1112=$W$7)*($B$2:$B$1112=F3), 0))] 

    'similar to the method directly above, Application.Evaluate does just that. 
    'the formula being evaluated can be array or non-array 
    'this method is easier to build a formula string from pieces of text 
    .Range("Z4") = Application.Evaluate("INDEX($D$2:$D$1112, MATCH(1, ($A$2:$A$1112=$U$7)*($C$2:$C$1112=$W$7)*($B$2:$B$1112=F3), 0))") 
End With 
+0

Большое спасибо, что определенно получил мяч, катящий кучу, но есть ли способ пропустить пустой столбец и вставить эту формулу в каждую ячейку в этом пустом столбце? – sunstache32

+0

Не нужно зацикливаться. Метод [Range.SpecialCells] (https://msdn.microsoft.com/en-us/library/office/ff196157.aspx) может помещать его в каждую пустую ячейку, но вы не хотите его перенапрягать. Недостаточно информации (имя рабочего листа, экстенты данных и т. Д.), Чтобы привести пример. – Jeeped

+0

Вот ссылка на новый вопрос: http://stackoverflow.com/questions/32318280/convert-formula-to-vba У этого есть весь код, чтобы вы могли лучше понять, что я делаю. Большое спасибо за помощь! – sunstache32

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