Excel:通过使用来自第三列的匹配数据评估来自其他列的数据来编辑列数据

时间:2017-11-30 18:49:42

标签: excel concatenation

我们的系统数据包含保险选择的人口统计数据。员工可以为自己选择保险,为他们及其子女提供保险,为他们及其配偶提供保险,或为他们的全家(他们,他们的配偶和子女)提供保险。传统上,我们会按总数(员工,员工+一人或家庭)对他们进行分组,我们不关心这些组合是否包括儿童或配偶,但承运人希望采用不同的方式。

  • 员工
  • 员工+配偶
  • 员工+孩子
  • 员工+儿童
  • 家庭

我们需要保留行数,因为每一行都是针对不同的人,但会员ID在员工和任何家属之间共享。

我正试图找到一种使用公式的方法,最好是因为它可以被更多人使用,查看所有相同的会员ID (可能是1到无穷大 - 最高的I&到目前为止已经看到的是7)然后是另一个列 self,Spouse或Child 的列,并根据结果添加上述指定之一。

所以基本上我会有一个额外的专栏(让我们说是H栏)会说员工,员工+配偶,员工+子女,员工+子女或家庭,这取决于自我,配偶和家庭的组合在B列中找到匹配的A列ID的子项。

以下是数据示例。我删除了实际数据中包含的不相关的列(电子邮件地址,家庭住址,社交等),并且我更改了所有名称和成员ID,但是我们工作的非常相似。

我见过的大多数解决方案都会产生连续数据的一行,这仍然需要解析为适当的名称,但是我需要对所有行重复它。例如,在下面的示例中:

  • 第2行和第3行都有Employee + Spouse
  • 第4行会有员工
  • 第5-7行将有员工+子女
  • 第8行会有员工
  • 第9-15行将有家庭
  • 第16行和第17行将有Employee + Child

Excel Data Example

3 个答案:

答案 0 :(得分:2)

我已经找到了与@dwirony相同的解决方案,除非没有VBA,以防VBA不适合您。

将以下数组公式粘贴到单元格>>> from timeit import timeit >>> timeit('aplusb(42, 81)', 'from __main__ import aplusb_local as aplusb', number=10**7) 1.0834476329619065 >>> timeit('aplusb(42, 81)', 'from __main__ import aplusb_return as aplusb', number=10**7) 1.045598166063428 中并根据需要向下拖动(添加换行符以提高可读性):

G2

请注意,这是一个数组公式,因此您必须在键入此公式后按 Ctrl + Shift + Enter 而不是输入

另请注意,在此示例中,数据会下移到第20行,但您必须根据数据的相应情况调整单元格范围。

请参阅下面的工作示例。

enter image description here

答案 1 :(得分:2)

这个通常输入的公式适合我

=CHOOSE(MATCH(SUM(COUNTIFS(A:A,A2,B:B,{"Spouse","Child"})*{100,1}),{0,1,2,100,101}),"Employee","Employee + Child","Employee + Children","Employee + Spouse","Family")

我假设每个ID都有一个“自我”条目,上面没有检查 - 公式为配偶分配值100,为孩子分配1,结果ID的总和将告诉您它是否是家庭或其他组合之一。

如果您需要,可以在计算中包含“Self”,如果没有任何ID,则返回“Error”,例如

=CHOOSE(MATCH(SUM(COUNTIFS(A:A,A2,B:B,{"Self","Spouse","Child"})*{1000,100,1}),{0,1000,1001,1002,1100,1101}),"Error","Employee","Employee + Child","Employee + Children","Employee + Spouse","Family")

数据的顺序无关紧要

答案 2 :(得分:1)

可能是一个草率的解决方案,但它仍然可行 - 只需使用一些布尔值并循环遍历与值匹配的memberID和关系列。

Sub GetBenefitOption()
Application.ScreenUpdating = False

Dim sht As Worksheet, lastrow As Long, i As Long, j As Long
Set sht = ThisWorkbook.Worksheets("Sheet1")
lastrow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row

Dim memberID As String
Dim spouse As Boolean, child As Boolean, children As Boolean, family As Boolean

For i = 2 To lastrow
    memberID = Range("A" & i).Value

    For j = 2 To lastrow
        If Not Range("A" & j).Value = memberID Then
            If j = lastrow Then
                Range("G" & i).Value = "Employee"
            End If
        Else
            If Range("B" & j).Value = "Spouse" Then
                spouse = True
            ElseIf Range("B" & j).Value = "Child" And child = True Then
                children = True
            ElseIf Range("B" & j).Value = "Child" Then
                child = True
            End If
        End If

        If spouse = True And child = True And children = True Then
            family = True
        End If
    Next j

    If family = True Then
        Range("G" & i).Value = "Family"
    Else
        If children = True Then
            Range("G" & i).Value = "Employee + Children"
            child = False
        Else
            If child = True Then
                Range("G" & i).Value = "Employee + Child"
            Else
                If spouse = True Then
                    Range("G" & i).Value = "Employee + Spouse"
                End If
            End If
        End If
    End If

spouse = False
child = False
children = False
family = False

Next i

Application.ScreenUpdating = True
End Sub

Before After