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

我们有来自我们系统的数据,包含保险select的人口统计数据。 员工可以为自己select保险,为他们和子女select保险,为他们和他们的配偶提供保险,或为他们全家(他们的配偶和子女)提供保险。 传统上,我们会按照总数(员工,员工+一个或家庭)对他们进行分组,我们不在乎组合是否包括子女或配偶,但承运人是否有不同的要求。

  • 雇员
  • 员工+配偶
  • 员工+孩子
  • 员工+孩子
  • 家庭

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

我试图find一个使用公式的方法,最好是因为那么它可以被更多的人使用,查看所有相同的成员ID (可以是1到无穷大 – 迄今为止我见过的最高的是7),然后另一列表示自己,配偶或孩子 ,并根据结果添加上述名称之一。

所以基本上我会有一个额外的列(比方说H列),根据自己,配偶和孩子的组合,在B列中find员工,员工+配偶,员工+子女,员工+子女或家庭。匹配的列A ID。

以下是数据的一个例子。 我删除了实际数据中包含的不相关的列(电子邮件地址,家庭地址,社交等),并更改了所有姓名和成员标识,但是我们正在使用的数据非常相似。

我所看到的大多数解决scheme都会导致连续数据的一行,这些数据仍然需要被parsing为适当的名称,但是我需要为所有行重复这些操作。 例如,在下面的例子中:

  • 第2行和第3行都有员工+配偶
  • 第4行将有员工
  • 5-7行将有员工+孩子
  • 第8行将有员工
  • 第9-15行将有家庭
  • 行16和行17将有员工+孩子

Excel数据示例

这通常input公式适用于我

=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都有一个“Self”条目,上面没有检查 – 公式为配偶指定一个值100,给一个孩子指定一个值,一个ID的结果总数会告诉你是一个家庭还是一个的其他组合。

如果你想要,你可以在计算中join“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")

数据的顺序无关紧要

我已经想出了相同的解决scheme@dwirony除了没有VBA的情况下,VBA是不适合你的select。

将以下数组公式添加到单元格G2并根据需要向下拖动(为了便于阅读,添加了换行符):

 = CHOOSE(MIN(IF(SUMPRODUCT(($B$2:$B$20="Spouse")+0,($A2=$A$2:$A$20)+0)=0,5,4), MMULT(MMULT(TRANSPOSE((ROW($A$2:$A$20)>0)+0),(IF($A2=$A$2:$A$20,$B$2:$B$20)= {"self","Spouse","Child"})+0),{1;1;2})), "Employee","Employee + Spouse","Employee + Child","Family","Employee + Children") 

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

另外请注意,在这个例子中,数据下降到第20行,但是你必须根据你的数据来调整单元格范围。

见下面的工作示例。

在这里输入图像描述

可能是一个马虎的解决scheme,但它仍然工作 – 只是使用一些布尔值,并通过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 

之前 后