首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >消除重复,列出单细胞中的第二列

消除重复,列出单细胞中的第二列
EN

Stack Overflow用户
提问于 2014-08-27 20:06:46
回答 3查看 71关注 0票数 1

我有一大组数据(40,000+行),它都是多个id数。它们列在第1栏中,然后在第10栏中,我为它们符合条件的多个职位设置了一个SsoftGroup名称。我想把我所有的东西拉到一个单独的标签上我需要的数据.

我拥有的..。

第1栏10列EmplNum SsoftGroup 1大会1大会1清洁2烘焙2 2组装2烘焙3清洁3清洁3烘焙3 3组装4烘焙4烘焙

我在另一个标签上需要什么

第1栏第2栏1工作人员大会:工作人员清洁大会2工作人员大会3工作人员大会:工作人员面包店:工作人员清洁4工作人员面包店

我不知道如何做到这一点,因为我不是很熟悉的VBA宏。我知道一个级联可以用于我需要的第2列;我只是不知道如何做,因为有一个可变的数组大小。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-27 22:08:31

枢轴表。这样,您几乎可以使用简单的excel countif以及sum函数获取任何您想要的信息。也就是说,如果枢轴还没有提供您想要的信息的话。

如果要在工作表中实现要使用的VBA函数,可以使用以下方法:

代码语言:javascript
运行
复制
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是文本分隔符(如":“或”或“等)。在这张截图里

更新以显示它使用指定的范围:

票数 0
EN

Stack Overflow用户

发布于 2014-08-27 20:36:30

您可以使用Dictionary对象将数据存储在键/值对中。Value部件可以是任何数据类型,所以我们将只使用一个字符串&连接B列中的各个项,作为A列中唯一的ID值。

关于字典的.

字典以两种方式创建键/值,或者显式地通过.Add方法,

代码语言:javascript
运行
复制
dict.Add "key", "value"

或者通过引用一个尚未存在的键隐式地:

代码语言:javascript
运行
复制
dict("key") = "value"   

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

代码语言:javascript
运行
复制
If dict.Exists("key") then 
    dict("key") = dict("key") & " some other text!"
Else
    dict.Add "key", "value"
End If

在您的例子中,我们只使用Instr函数来检查和查看来自B列的值是否已经附加到A列中的每个ID的Value中。

未经测试,但我认为这应该可以做到:

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-08-27 21:07:06

如果您对VBA不熟悉或不习惯,而且上面的解决方案很吓人,那么您也可以使用几个Excel函数和许多额外的列来完成您的目标。

基本上,您将创建一个表来计算与每个唯一作业组匹配的唯一员工ID的每个实例。您只需将员工in的非重复列表放在表的最左边列中,在最顶部的行中放置一个取消重复的作业组列表(使用transpose命令)。

下面是使用示例数据应该是什么样子的示例:

代码语言:javascript
运行
复制
Column 1    Assembly    Cleaning    Bakery      ...     Column 2
1                                                 
2   
3   
4   
...

然后你可以使用COUNTIFS(.)在表的每个单元格中放置一个逻辑值,可以在IF(.)中使用语句返回空白单元格或字符串.然后,将最后一列中该行中的每个单元格连接起来。

我在表单元格中使用了这个公式,它工作得很好(显然,您必须更改工作表名称并调整单元格引用):

代码语言:javascript
运行
复制
=IF(COUNTIFS(Sheet1!$A:$A, $B4, Sheet1!$B:$B, D$2) > 0, "Staff " & D$2 & ":", "")

您知道在整个数据集中第10栏中有多少不同的职务组吗?将许多单元格连成一行可能会很乏味,所以如果超过50,您可能应该选择VBA路线。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25536051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档