Должно ли это быть решением VBA? Вы можете сделать это довольно легко с помощью формул ячеек ...
Вы можете получить уникальные значения X
и Y
с помощью Data> Remove Duplicates, а затем упорядочить их как заголовки таблиц, как вы хотите.
Затем используйте следующие формулы для заполнения XY
столбца и Z
значения стола:
А именно, для 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. CONCAT доступен только в Office 365 Excel и с помощью метода, который вы используете СЦЕПИТЬ() будет работать только штрафом, который доступен во всех Excel , 2. вместо волатильного INDIRECT используйте намного более быстрый и нелетучий INDEX(). '= INDEX ($ C: $ C, MATCH (CONCAT ($ F2,", ", G $ 1), $ D: $ D, 0))' –
hi @ScottCraner, хороший комментарий, я не привык к используя формулы ячеек, я наркоман VBA! Вы видели, что было моим первым рабочим примером кода, твой - хорошая оптимизация :) – Wolfie
Просто короткое замечание о различии между CONCANTENATE и CONCAT.CONCAT будет делать диапазон: 'CONCAT (A1: A10)', в то время как CONCATENATE объединяет ряд входов: 'CONCANTENATE ($ F2,", ", G $ 1)', Затем появляется новый TEXTJOIN, который добавит разделитель и объединит range, '= TEXTJOIN (", ", TRUE, A1: A10)' это приведет к конкатенации всего, что имеет значение в A1: A10 с ',' между ними. –