2014-08-19 7 views
-1

, поэтому я пытаюсь написать формулу, которая позволяет мне скопировать определенное значение, которое находится на листе 2 на лист 1, если и только если оно существует в столбце «Num Available» "Excel: Помогите преобразовать рабочую формулу в VBA/Macro

Sheet 2/Line 1: 
    B   C 
PRODUCT "NUM AVAILABLE" 
    A   12 
    B   
    C   15 
    D   13 
    E 
Sheet 1: 

RUN 1 
PRODUCT "NUM AVAILABLE" 
    A   12 

RUN 2 
PRODUCT "NUM AVAILABLE" 
    C   15 

RUN 3 
PRODUCT "NUM AVAILABLE" 
D   13 

формула Я использую для Run 1 является:

=IF('Line 1'!C5>0,'Line 1'!$B5,IF('Line 1'!C6>0,'Line 1'!$B6,IF('Line 1'!C7>0,'Line 1'!$B7,IF('Line 1'!C8>0,'Line 1'!$B8,IF('Line 1'!C9>0,'Line 1'!$B9,IF('Line 1'!C10>0,'Line 1'!$B10,IF('Line 1'!C11>0,'Line 1'!$B11,IF('Line 1'!C12>0,'Line 1'!$B12,IF('Line 1'!C13>0,'Line 1'!$B13,IF('Line 1'!C14>0,'Line 1'!$B14,IF('Line 1'!C15>0,'Line 1'!$B15,IF('Line 1'!C16>0,'Line 1'!$B16,IF('Line 1'!C17>0,'Line 1'!$B17,IF('Line 1'!C18>0,'Line 1'!$B18,IF('Line 1'!C19>0,'Line 1'!$B19,IF('Line 1'!C20>0,'Line 1'!$B20,IF('Line 1'!C21>0,'Line 1'!$B21,IF('Line 1'!C22>0,'Line 1'!$B22,IF('Line 1'!C23>0,'Line 1'!$B23,IF('Line 1'!C24>0,'Line 1'!$B24,IF('Line 1'!C25>0,'Line 1'!$B25,IF('Line 1'!C26>0,'Line 1'!$B26,IF('Line 1'!C27>0,'Line 1'!$B27, "NO ENTRY")))))))))))))))))))))))

линии одно и то же, как листы.

Моя проблема в том, что этот код в конечном итоге становится массивным, когда я использую его на других линиях и увеличиваю количество прогонов, на которые я смотрю. Этот код выводит название продукта для Run 2, если он существует в «Число доступных» и не существует в опыте 1

Run 2: 

=IF(AND(NOT(D$5='Line 1'!$B5),'Line 1'!C5>0),'Line 1'!$B5,IF(AND(NOT(D$5='Line 1'!$B6),'Line 1'!C6>0),'Line 1'!$B6,IF(AND(NOT(D$5='Line 1'!$B7),'Line 1'!C7>0),'Line 1'!$B7,IF(AND(NOT(D$5='Line 1'!$B8),'Line 1'!C8>0),'Line 1'!$B8,IF(AND(NOT(D$5='Line 1'!$B9),'Line 1'!C9>0),'Line 1'!$B9,IF(AND(NOT(D$5='Line 1'!$B10),'Line 1'!C10>0),'Line 1'!$B10,IF(AND(NOT(D$5='Line 1'!$B11),'Line 1'!C11>0),'Line 1'!$B11,IF(AND(NOT(D$5='Line 1'!$B12),'Line 1'!C12>0),'Line 1'!$B12,IF(AND(NOT(D$5='Line 1'!$B13),'Line 1'!C13>0),'Line 1'!$B13,IF(AND(NOT(D$5='Line 1'!$B14),'Line 1'!C14>0),'Line 1'!$B14,IF(AND(NOT(D$5='Line 1'!$B15),'Line 1'!C15>0),'Line 1'!$B15,IF(AND(NOT(D$5='Line 1'!$B16),'Line 1'!C16>0),'Line 1'!$B16,IF(AND(NOT(D$5='Line 1'!$B17),'Line 1'!C17>0),'Line 1'!$B17,IF(AND(NOT(D$5='Line 1'!$B18),'Line 1'!C18>0),'Line 1'!$B18,IF(AND(NOT(D$5='Line 1'!$B19),'Line 1'!C19>0),'Line 1'!$B19,IF(AND(NOT(D$5='Line 1'!$B20),'Line 1'!C20>0),'Line 1'!$B20,IF(AND(NOT(D$5='Line 1'!$B21),'Line 1'!C21>0),'Line 1'!$B21,IF(AND(NOT(D$5='Line 1'!$B22),'Line 1'!C22>0),'Line 1'!$B22,IF(AND(NOT(D$5='Line 1'!$B23),'Line 1'!C23>0),'Line 1'!$B23,IF(AND(NOT(D$5='Line 1'!$B24),'Line 1'!C24>0),'Line 1'!$B24,IF(AND(NOT(D$5='Line 1'!$B25),'Line 1'!C25>0),'Line 1'!$B25,IF(AND(NOT(D$5='Line 1'!$B26),'Line 1'!C26>0),'Line 1'!$B26,IF(AND(NOT(D$5='Line 1'!$B27),'Line 1'!C27>0),'Line 1'!$B27,IF(AND(NOT(D$5='Line 1'!$B28),'Line 1'!C28>0),'Line 1'!$B28,IF(AND(NOT(D$5='Line 1'!$B29),'Line 1'!C29>0),'Line 1'!$B29,IF(AND(NOT(D$5='Line 1'!$B30),'Line 1'!C30>0),'Line 1'!$B30,IF(AND(NOT(D$5='Line 1'!$B31),'Line 1'!C31>0),'Line 1'!$B31, "NO ENTRY")))))))))))))))))))))))))))

Когда я увеличить число Runss до 5, я превышать количество символов, которые я могу использовать. Мне нужна помощь. Формула делает именно то, что мне нужно - мне просто нужен более эффективный способ достижения моей цели. Рекомендации по упрощению VBA или формулы упрощены.

+0

Что такое содержание 'линии 1' ! C5'? Вы можете найти сводную таблицу полезной. http://stackoverflow.com/help/accepted-answer может представлять интерес. – pnuts

+3

Woah мои глаза горят! Я не могу это прочитать. Проведите некоторое исследование по SELECT CASE в VBA. Посмотрите на это: http://msdn.microsoft.com/en-us/library/cy37t14y.aspx – Gareth

+0

Существует много способов сделать это, но все они будут включать использование цикла. Поэтому я предлагаю начать с изучения циклов. http://msdn.microsoft.com/en-us/library/office/aa221353(v=office.11).aspx –

ответ

1

Это также может быть достигнуто с помощью матричной формулы.

В Лист1 B2:

=INDEX(Sheet2!B$2:B$10000,SMALL(IF(Sheet2!$C$2:$C$10000>0,ROW(Sheet2!$C$2:$C$10000)-1),ROW(A1))) 

Вставить формулу в ячейку, а затем нажмите [Ctrl] + [Shift] + [Enter], чтобы создать матрицу формулу. Затем это выглядит так:

{=INDEX(Sheet2!B$2:B$10000,SMALL(IF(Sheet2!$C$2:$C$10000>0,ROW(Sheet2!$C$2:$C$10000)-1),ROW(A1)))} 

Теперь вы можете скопировать эту формулу вниз и вправо.

Привет

Axel

+0

Ты мужчина! Ваше решение было легко перевести на мои нужды, а не на VBA! Это решение именно то, что я ищу. – redracer67

0

Предлагаю вам взять код в this answer и адаптировать его под свои нужды.

Ядро считывает значения в массивы по мере необходимости, создает петлю для создания выходного массива и затем записывает результаты в одну операцию.

x1 = Range("A2").Resize(N, 1).Value 
x2 = Range("B2").Resize(N, 1).Value 
' Declare array3 
ReDim x3(1 To N, 1 To 1) 

'Process arrays 
For i = 1 To N 
    If Not IsEmpty(x2(i, 1)) Then 
     x3(i, 1) = x2(i, 1) 
    Else 
     x3(i, 1) = x1(i, 1) 
    End If 
Next i 

'Output array 3 
Range("C2").Resize(N, 1).Value = x3 

Я не могу сказать, сколько из данной информации (возможно, снимки экрана, может помочь), так что это лучшее, что я могу сделать сейчас. Возможно, вам нужны две петли, создавая новый рабочий лист во внешнем цикле и копируя значения во внутреннем цикле.

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