使用VBA将Excel中的两列组合成“虚拟助手列”

时间:2013-05-02 23:29:40

标签: excel excel-vba excel-formula array-formulas vba

我有两个列,通过连接它们,我将它组合成第三个辅助列。

一个是4位数的列,另一个是单个数字。

例如:

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

然后我在第4列中运行数组公式(使用每行中的标识符),表示每个标识符的列C有多少唯一值。

如果可能的话,我想绕过辅助列的使用 - 在VBA中构建一个范围(以数字格式),我可以在代码中引用它,这样我就可以取消帮助列了。

希望这对某人有意义,并且他们知道如何去做。

提前致谢。

编辑:抱歉 - 基于下面Santosh提供的非常有用的答案(我可以肯定地使用我的另一个问题),我意识到我还没有完全解释自己。

每一行都有一个标识符(此处显示为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
然后,我创建一个表 - 使用数组公式(基于FREQUENCY函数) - 显示每个唯一标识符(在本例中为555和666),对于连接的COLUMN C,会出现多少个唯一值。所以,在这里它将为2 555和2为666)。

我最终得到了这样的报告:

IDENT   UNIQUE_COUNT
555     2
666     2

我正在尝试使用代码来摆脱原始表中对辅助COLUMNC的需求,并且仍允许我在第二个表中实现相同的结果。

再次,先谢谢。

2 个答案:

答案 0 :(得分:0)

尝试以下代码。

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

enter image description here

答案 1 :(得分:0)

好的,几个月后我已经意识到了自己问题的答案。

你可以通过几种方式(可能还有更多),

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))]

所以,如果有人想知道,那就是构建"虚拟助手列的几种方式"。