我们的系统数据包含保险选择的人口统计数据。员工可以为自己选择保险,为他们及其子女提供保险,为他们及其配偶提供保险,或为他们的全家(他们,他们的配偶和子女)提供保险。传统上,我们会按总数(员工,员工+一人或家庭)对他们进行分组,我们不关心这些组合是否包括儿童或配偶,但承运人希望采用不同的方式。
我们需要保留行数,因为每一行都是针对不同的人,但会员ID在员工和任何家属之间共享。
我正试图找到一种使用公式的方法,最好是因为它可以被更多人使用,查看所有相同的会员ID (可能是1到无穷大 - 最高的I&到目前为止已经看到的是7)然后是另一个列 self,Spouse或Child 的列,并根据结果添加上述指定之一。
所以基本上我会有一个额外的专栏(让我们说是H栏)会说员工,员工+配偶,员工+子女,员工+子女或家庭,这取决于自我,配偶和家庭的组合在B列中找到匹配的A列ID的子项。
以下是数据示例。我删除了实际数据中包含的不相关的列(电子邮件地址,家庭住址,社交等),并且我更改了所有名称和成员ID,但是我们工作的非常相似。
我见过的大多数解决方案都会产生连续数据的一行,这仍然需要解析为适当的名称,但是我需要对所有行重复它。例如,在下面的示例中:
答案 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行,但您必须根据数据的相应情况调整单元格范围。
请参阅下面的工作示例。
答案 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