为了便于论证,我有一个姓名列表,其中有一列包含数字数据,如下所示:
Dave 1
Bob 2
Frank 1
Dennis 3
我希望在另一张表上有另一个表格,该表格根据姓名旁边的数字选择并显示姓名。
例如,该列1
将列出 Dave 和 Frank 的名字
这可能吗?
答案1
您可以使用数组公式执行此操作。执行以下操作:
- 在新工作表上设置表格。创建列标题
1
、、2
等3
。 在标题
1
(在A2
)下,输入以下内容。=IFERROR(INDEX(Sheet1!$A$1:$A$5,SMALL(IF(Sheet1!$B$1:$B$5=Sheet2!A$1,ROW(Sheet1!$B$1:$B$5)),ROWS(B$2:B2))),"")
其中
Sheet1
是包含原始数据的工作表,A1:A5
是原始数据中的名称列表(包括列标题),B1:B5
是原始数据中的数字列表(包括列标题)。输入公式后,将光标放在公式栏中,然后按Ctrl+ Shift+ Enter。这会将公式作为数组公式输入。该公式将显示在公式栏中,并被花括号包围。
现在将此公式填入新表的所有列。然后向下填充公式,直到显示所有名称为止。
公式解释:
公式部分SMALL(IF(Sheet1!$B$1:$B$5=Sheet2!A$1,ROW(Sheet1!$B$1:$B$5)),ROWS(B$2:B2))
会查看原始数据,查找与列标题指定的数字相匹配的记录。如果找到匹配项,则返回每个匹配项的行号,并向下填充。
INDEX(Sheet1!$A$1:$A$5, ...)
公式部分根据找到的行号返回名称。
该IFERROR(..., "")
部分检查返回的内容INDEX
以查找错误。如果发现错误,则公式不返回任何内容。
答案2
以下是使用 VBA 的解决方案:
Public Sub columns()
Dim wks, wks1 As Worksheet
Set wks = ThisWorkbook.Sheets(1)
Set wks1 = ThisWorkbook.Sheets(2)
firstrowsource = 1
wks1.Application.ScreenUpdating = False
wks1.Cells.Clear
Last = wks.Cells(Rows.Count, "A").End(xlUp).Row
For i = firstrowsource To Last
Name = wks.Cells(i, 1)
Position = wks.Cells(i, 2)
j = 1
looking = True
While looking
If wks1.Cells(j, Position) = "" Then
If j <> 1 Then
wks1.Cells(j, Position) = Name
Else
wks1.Cells(j, Position) = Position
wks1.Cells(j + 1, Position) = Name
End If
looking = False
Else
j = j + 1
End If
Wend
Next i
wks1.Application.ScreenUpdating = True
Final = MsgBox("Finished", vbInformation)
End Sub
您必须转到 Macros / Visual Basic,在 ThisWorkbbok 下插入一个新模块,然后将代码粘贴到右侧。
假设源工作表为 Sheet1,目标工作表为 Sheet2。如果源工作表有标题,则修改变量的值firstrowsource
。