Объединение двух столбцов в Excel в виртуальный вспомогательный столбец с использованием VBA

У меня есть два столбца, которые я объединяю в третий вспомогательный столбец, объединяя их.

Один представляет собой четырехзначный столбец, другой - однозначный.

Например:

COLUMNA    COLUMNB  COLUMNC
1234       1        12341
1234       1        12341
1234       2        12342
2345       1        23451
2345       2        23452
2345       2        23452

Затем я запускаю формулу массива в четвертом столбце (используя идентификатор, который находится в каждой строке), который указывает, сколько уникальных значений есть для столбца C для каждого идентификатора.

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

Надеюсь, это имеет смысл для кого-то, и у них есть идея, как это сделать.

Заранее спасибо.

РЕДАКТИРОВАТЬ: ИЗВИНИТЕ - на основе очень полезного ответа, предоставленного Сантошем ниже (который я определенно могу использовать для другой проблемы, которая у меня есть), я понял, что не полностью объяснил себя.

Каждая строка имеет идентификатор (показанный здесь как COLUMN_IDENT)

COLUMNA    COLUMNB  COLUMNC    COLUMN_IDENT
    1234   1        12341      555
    1234   1        12341      555
    1234   2        12342      555
    2345   1        23451      666
    2345   2        23452      666
    2345   2        23452      666

Затем я создаю таблицу, которая — используя формулу массива (на основе функции ЧАСТОТА) — показывает для каждого уникального идентификатора (в данном случае 555 и 666), сколько уникальных значений встречается для объединенного СТОЛБЦА C. Итак, здесь это будет 2 для 555 и 2 для 666).

В итоге получаю такой отчет:

IDENT   UNIQUE_COUNT
555     2
666     2

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

Еще раз спасибо заранее.


person EndlessLoop    schedule 02.05.2013    source источник


Ответы (2)


Попробуйте код ниже.

Sub sample()

    Dim lastRow As Long

    With Sheets("Sheet1")
        lastRow = .Range("A" & .Rows.Count).End(xlUp).Row
        .Range("A1:B" & lastRow).RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
    End With
End Sub

введите здесь описание изображения

person Santosh    schedule 03.05.2013
comment
Большое спасибо Сантош - это ведет меня в правильном направлении, но это еще не совсем так. Я отредактировал исходный пост для уточнения. - person EndlessLoop; 03.05.2013

Хорошо, спустя несколько месяцев я понял ответ на свой вопрос.

Вы можете сделать это несколькими способами (возможно, их больше),

1) Вы можете сделать это без VBA, используя формулу массива.

Итак, если у вас есть:

+---+---------+---------+-----+
|   |    A    |    B    |  C  |
+---+---------+---------+-----+
| 1 | COLUMNA | COLUMNB | ID  |
| 2 | 1234    | 1       | 555 |
| 3 | 1234    | 1       | 555 |
| 4 | 1234    | 2       | 555 |
| 5 | 2345    | 1       | 666 |
| 6 | 2345    | 2       | 666 |
| 7 | 2345    | 2       | 666 |
| 8 |         |         |     |
+---+---------+---------+-----+

... и вы хотите сгенерировать это:

+---+-----+--------------+
|   |  D  |      E       |
+---+-----+--------------+
| 1 | ID  | UNIQUE COUNT |
| 2 | 555 | 2            |
| 3 | 666 | 2            |
| 4 |     |              |
+---+-----+--------------+

... затем поместите это как формулу массива в E2 и E3 (убедившись, что диапазоны верны):

=SUM(IF(FREQUENCY(IF(C2:C7=D2,MATCH(A2:A7&B2:B7,A2:A7&B2:B7,0)),IF(C2:C7=D2,MATCH(A2:A7&B2:B7,A2:A7&B2:B7,0)))>0,1))

2) Если вам это нужно в VBA, вы можете (среди прочего) сделать Evaluate "чит" (здесь я использовал квадратные скобки, которые являются сокращением для Evaluate):

Range("E2") = [SUM(IF(FREQUENCY(IF(C2:C7=D2,MATCH(A2:A7&B2:B7,A2:A7&B2:B7,0)),IF(C2:C7=D2,MATCH(A2:A7&B2:B7,A2:A7&B2:B7,0)))>0,1))]

Итак, если кому-то интересно, вот несколько способов создания «виртуальных вспомогательных столбцов».

person EndlessLoop    schedule 08.03.2014