消除重复并列出单个单元格中的第二列

我有一大组数据(40,000+行),它都是多个ID号码。 他们列在第1列。然后在第10列,我有一个SsoftGroup名称,他们有资格的多个职位。 我想采取我所拥有的,并拉到一个单独的选项卡我需要的数据…

我拥有的…

Column 1 Column 10 EmplNum SsoftGroup 1 Assembly 1 Assembly 1 Cleaning 2 Bakery 2 Assembly 2 Assembly 2 Bakery 3 Cleaning 3 Cleaning 3 Bakery 3 Assembly 3 Assembly 4 Bakery 4 Bakery 

我需要在另一个标签

 Column 1 Column 2 1 Staff Assembly:Staff Cleaning 2 Staff Assembly:Staff Bakery 3 Staff Assembly:Staff Bakery:Staff Cleaning 4 Staff Bakery 

我不知道如何做到这一点,因为我不是很熟悉macros的VBA。 我知道一个连接可以用于我所需要的第二列。 我只是不知道该怎么做,因为有一个可变的数组大小。

数据透视表。 从这里,你可以使用简单的excel countifsum函数来获得任何你想要的信息。 这就是说,如果枢纽还没有提供你想要的信息。

枢

如果你想实现一个VBA函数在工作表中使用,你可以使用这个:

 Function JobCat(ByVal BaseValue, ByRef rng As Range, ByVal delim As String) As String Dim a, i, k As Long Dim last_col As Integer Set jobs = New Collection last_col = rng.Columns.Count a = rng.Value On Error Resume Next For i = 1 To UBound(a, 1) If Val(a(i, 1)) = Val(BaseValue) Then jobs.Add "Staff " & a(i, last_col), "Staff " & a(i, last_col) End If Next For k = 1 To jobs.Count JobCat = JobCat & IIf(JobCat = "", "", delim) & jobs.Item(k) Next End Function 

参数1是EmplNum,参数2是整个范围(两列),参数3是文本分隔符(如“:”或“,”等)。 就像这个截图一样

在这里输入图像说明

已更新,以显示它使用命名范围:

NAMED_RANGE

您可以使用一个Dictionary对象来存储键/值对中的数据。 Value部分可以是任何数据types,所以我们将使用一个string&连接列B中的各个项目,以获得列A中唯一的ID值。

关于字典…

一个字典通过两种方式创build键/值,明确地通过.Add方法,

 dict.Add "key", "value" 

或者通过引用一个还不存在的键来隐含的:

 dict("key") = "value" 

如果密钥已经存在,后者将覆盖现有值。 所以我们可以使用返回布尔值的.Exists方法来查看项目是否已经存在。

 If dict.Exists("key") then dict("key") = dict("key") & " some other text!" Else dict.Add "key", "value" End If 

在你的情况下,我们只是使用Instr函数来检查,看看列B中的值是否已经被附加到来自列A的每个ID的Value

未经testing,但我认为这应该做到这一点:

 Sub foo() Dim dict as Object Dim rng as Range Dim r as Range Dim val as String Dim id as String Dim key as Variant Dim i as Long Set rng = Range("A1", Range("A1").End(xlDown)) 'Modify as needed Set dict = CreateObject("scripting.dictionary") 'iterate the range.rows: For each r in rng.Rows ' id = r.Value 'get the value from the same row, cell in column 10 and prefix with "Staff " val = "Staff " & r.Offset(0,9).Value 'Add this item if it doesn't already exist: If Not dict.Exists(id) Then dict.Add id, val Else 'avoid printing duplicate "values" in the dictionary using some string functions: If Instr(1, dict(id), val) = 0 Then dict(id) = dict(id) & ":" & val End If End If Next 'Print the data to another sheet in columns A, B: With Worksheets("Sheet2") '<~~ MODIFY AS NEEDED TO USE YOUR SHEET NAME For each key in dict.Keys() .Range("A1").Offset(i).Value = key .Range("B1").Offset(i).Value = dict(key) i = i + 1 Next End With End Sub 

如果您对VBA不熟悉或不熟悉上述解决scheme,您也可以使用几个Excel函数和大量额外的列来实现您的目标。

基本上,您将创build一个表,统计与每个唯一工作组匹配的唯一员工ID的每个实例。 您只需将表格的最左列中的员工id的非重复列表以及最上面一行中的作业组列表(使用转置命令)去除重复列表。

以下是使用您的示例数据的示例:

 Column 1 Assembly Cleaning Bakery ... Column 2 1 2 3 4 ... 

然后,您可以使用COUNTIFS(…)在表中可以在IF(…)语句中使用的每个单元格中放置逻辑值,以返回空白单元格或string…然后您只需连接最后一列中该行的每个单元格。

我在表格单元格中使用这个公式,它工作正常(显然你必须改变工作表名称和调整单元格引用):

 =IF(COUNTIFS(Sheet1!$A:$A, $B4, Sheet1!$B:$B, D$2) > 0, "Staff " & D$2 & ":", "") 

你知道整个数据集中第10列有多less独特的工作组吗? 连续连接很多单元格可能非常繁琐,所以如果超过50个单元格,则可能应该使用VBA路线。