2017-02-12 2 views

ответ

0

Должно ли это быть решением VBA? Вы можете сделать это довольно легко с помощью формул ячеек ...

Вы можете получить уникальные значения X и Y с помощью Data> Remove Duplicates, а затем упорядочить их как заголовки таблиц, как вы хотите.

Layout

Затем используйте следующие формулы для заполнения XY столбца и Z значения стола:

Formulas

А именно, для XY конкатенации:

=CONCAT(A2,",",B2) 

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

Для Z значений таблицы, мы используем значение XY как для поиска MATCH, который возвращает строку сопоставления XY значения из той же конкатенации столбца заголовка/строки таблицы.

=INDIRECT(CONCAT("C", MATCH(CONCAT($F2,",",G$1),$D:$D,0))) 

Введите это в верхнюю левую ячейку и снова перетащите его, чтобы заполнить таблицу.

Обратите внимание на знаки доллара в формуле, которые останавливают автозаполнение от относительно корректировки этих строк/столбцов, фиксируя их, поскольку они являются заголовками столбцов/строк.

Если вам действительно нужно решение VBA, было бы выполнимо, но ваши самые большие задачи будут

1. Making sure the row/column header values are unique, and looking up where they are for each new row. 
2. Handling what happens when they aren't unique (if your data input allows this) 

В противном случае, следовать подобной логике в приведенных выше формулах ячеек!

Edit:

@Scott предложил аналогичную функцию для основной таблицы поиска, которая работает хорошо. Я добавил больше знаков доллара, так что автозаполнения можно использовать

=INDEX($C:$C, MATCH(CONCAT($F2,",",G$1),$D:$D,0)) 
+1

1. CONCAT доступен только в Office 365 Excel и с помощью метода, который вы используете СЦЕПИТЬ() будет работать только штрафом, который доступен во всех Excel , 2. вместо волатильного INDIRECT используйте намного более быстрый и нелетучий INDEX(). '= INDEX ($ C: $ C, MATCH (CONCAT ($ F2,", ", G $ 1), $ D: $ D, 0))' –

+0

hi @ScottCraner, хороший комментарий, я не привык к используя формулы ячеек, я наркоман VBA! Вы видели, что было моим первым рабочим примером кода, твой - хорошая оптимизация :) – Wolfie

+1

Просто короткое замечание о различии между CONCANTENATE и CONCAT.CONCAT будет делать диапазон: 'CONCAT (A1: A10)', в то время как CONCATENATE объединяет ряд входов: 'CONCANTENATE ($ F2,", ", G $ 1)', Затем появляется новый TEXTJOIN, который добавит разделитель и объединит range, '= TEXTJOIN (", ", TRUE, A1: A10)' это приведет к конкатенации всего, что имеет значение в A1: A10 с ',' между ними. –

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