我有一个充满姓名和人物角色的电子表格,如下所示:
Role Name Change
1 A Yes
2 A No
5 A N/Ap
1 B Yes
3 B No
2 C Yes
4 C No
我必须提出如下所示的电子表格:
1 2 3 4 5 6
A Yes
B
C
基本上,它应该从第一个电子表格中检索信息,并在第二个电子表格中清楚地列出。
手动执行此操作的名称和角色太多了。 VLMOVE
无效,我已尝试MATCH
和INDEX
。
答案 0 :(得分:2)
同意@Melanie,如果您可以将数据强制转换为可以解释为数字的结构(例如,1表示是,0表示为假),则数据透视表是最简单的方法(因为它们将显示)数字作为值 - 而不是文本)。 *(见下文)
如果您想显示任意文字,可以试试这个:
=IF(
SUMPRODUCT(--($A$2:$A$8=F$1),--($B$2:$B$8=$E2),ROW($A$2:$A$8))=0,"",
INDEX(
$A$1:$C$8,
SUMPRODUCT(--($A$2:$A$8=F$1),--($B$2:$B$8=$E2),ROW($A$2:$A$8)),
3))
这将检查三列中的SUMPRODUCT
是否总计为0(这将在没有匹配x / y的组合时发生(例如Name: C
,Role: 5
) ,如果是,则返回""
。否则,它返回Value
列中的值。
*'数据透视表选项'将表示更改为数字(例如,将D2中的公式复制下来)。然后从(在示例中)A1:D8创建一个数据透视表,其中的字段如图所示。使用“粘贴特殊值/值”将数据透视表复制到另一个工作表(尽管在F11中显示:示例中为同一工作表的K15)。然后在那个以名称A开头并且根据需要向下的其他工作表选择行中,将-1替换为否,将1替换为是,将0替换为N / Ap。
答案 1 :(得分:2)
替代@RocketDonkey(但感谢更完整的预期结果!)可以将角色和名称串起来(比如在Sheet1中插入B& C之间的列中[因为我认为OP想要一个单独的表格用于结果]):
C2=A1&B2 copied down as required
然后在Sheet2中使用查找!B2:
=IFERROR(VLOOKUP(B$1&$A2,Sheet1!$C$2:$D$8,2,FALSE),"")
根据需要反复复制。
这假定已经构建了结果的网格(如有问题)(并且有7行数据 - 否则需要调整8美元。)
答案 2 :(得分:1)
如果没有VBA,还有另一种方法可以解决这个问题。如果您创建另一列连接第一个电子表格中的前两个,如下所示:
Role Name Change CheckColumn
1 A Yes 1A
2 A No 2A
5 A N/Ap 5A
1 B Yes 1B
3 B No 3B
2 C Yes 2C
4 C No 4C
然后,您可以同时使用Offset
和Match
函数来查找第二张表中的更改。因此,假设您的数据是从单元格A1中放置的,则单元格B2中的公式将为:
=iferror(offset(Sheet1!$A$1,match(B$1&$A2,sheet1!$D:$D,0),2),"")
或者,如果在角色列之前将连续列放在sheet1中,则可以在sheet2中使用vlookup
,其公式为:
=iferror(vlookup(B$1&$A2,sheet1!$A:$D,4,false),"")
答案 3 :(得分:1)
修订
您可以使用数组公式重新组织表,而无需更改其结构。假设数据在Sheet1上的A2:C8范围内,结果表在Sheet2的范围A1:G4中,下面的公式将是结果表中的第一个条目(角色1和名称A)。
=IFERROR(INDEX(Sheet1!$A$2:$C$8,MATCH(B$1&$A2,Sheet1!$A$2:$A$8&Sheet1!$B$2:$B$8,0),3),"-")
MATCH公式返回角色/名称组合1A出现的行号。 INDEX函数返回由MATCH公式和列号3找到的行号的单元格内容,即数据表的“更改”列。如果角色/名称组合不在数据表中,则IFERROR返回“ - ”。
请务必使用Control-Shift-Enter组合键输入公式。然后将公式复制到结果表的其余单元格中。
Sheet1上的数据表:
Sheet2上的结果表:
答案 4 :(得分:1)
好了,因为有Excel-VBA
标签,认为它会通过在VBA中添加一个来完成解决方案类型:)以下代码不优雅,无论如何你需要使用代码库,试一试:)
代码:
Option Explicit
Public Sub sortAndPivot()
Dim d As Object
Dim ws As Worksheet
Dim sourceArray As Variant, pvtArray As Variant, v As Variant
Dim maxRole As Long
Dim i, j, k, m As Integer
Set d = CreateObject("Scripting.Dictionary")
Set ws = Worksheets("Sheet3") '-- set according to your sheet
'-- you could enhance by using an input box to select the range
sourceArray = Application.WorksheetFunction.Transpose(ws.Range("B3:D9").Value)
'-- max role number
maxRole = Application.WorksheetFunction.Max(ws.Range("B3:B9"))
'-- find unique name list
For i = LBound(sourceArray, 2) To UBound(sourceArray, 2)
If Not d.exists(sourceArray(2, i)) Then
d.Add sourceArray(2, i), i
End If
Next i
ReDim pvtArray(d.Count, maxRole)
pvtArray(0, 0) = "Name"
'-- add unique names from dictionary
j = 1
For Each v In d.keys
pvtArray(j, 0) = v
j = j + 1
Next
'-- add unique Role number list
For i = UBound(pvtArray, 2) To LBound(pvtArray) + 1 Step -1
pvtArray(0, i) = i
Next i
'-- sort into the correct positions
For k = LBound(pvtArray, 1) + 1 To UBound(pvtArray, 1)
For m = LBound(pvtArray, 2) + 1 To UBound(pvtArray, 2)
For i = LBound(sourceArray, 2) To UBound(sourceArray, 2)
If pvtArray(k, 0) = sourceArray(2, i) Then
If pvtArray(0, m) = sourceArray(1, i) Then
pvtArray(k, m) = sourceArray(3, i)
End If
End If
Next i
Next m
Next k
'Output the processed array into the Sheet in pivot view.
Range("F2").Resize(UBound(pvtArray) + 1, _
UBound(Application.Transpose(pvtArray))) = pvtArray
Set d = Nothing
End Sub
结果: