Excel return 所有数据到另一个基于 header 名称的工作表
Excel return all data to another worksheet based on header name
在 Microsoft Excel 我想创建一个 table 如下图所示。
我已经尝试过使用 vlookup 和索引,但我无法让它按我想要的方式工作。
请帮助我
我写了一个解决方案,对我来说效果很好。这个公式真的很复杂,可能很难理解。虽然我会尽力解释它,但更新公式可能仍然是一项艰巨的工作。这三个公式都是用数组公式写的,按ctrl+shift+enter完成。
G6 中的公式:
=IFERROR(OFFSET($A,0,SMALL(
IF($B:$D<>"",1,99999999)*(COLUMN($B:$D)-1),ROW(A1))),"")
外部 IFERROR 使您的 sheet 免受任何 #Err 的影响。调用正确日期的偏移量。 SMALL 里面的公式生成一个数组,其规则是:如果有事件,该值将是偏移日期的编号,否则将为 99999999,使 OFFSET 出错并被 IFERROR 阻止。使用您提供的数据,数组将是
{ 1,99999999, 3;
1, 2,99999999;
1,99999999,99999999;
99999999,99999999, 3 }
H6 中的公式:
=IFERROR(OFFSET($A,
SMALL(IF($B:$D<>"",ROW($B:$D)-5)*
IF(COLUMN($B:$D)=MATCH(G6,$B:$D,0)+1,1,99999999),99999999),COUNTIF($G:G6,G6)),
MATCH(G6,$B:$D,0)),"")
IFERROR 和OFFSET 的作用与G6 相同。 OFFSET.ROW 中的公式生成与 G6 几乎相同的数组。这次取值为G列确定日期的事件行。其他给出999999999或更多。
I6 中的公式:
=IFERROR(OFFSET($A,MAX((ROW($B:$D)-5)*($B:$D=H6)*
(COLUMN($B:$D)=MATCH(G6,$B:$D,0)+1)),0),"")
IFERROR 和 OFFSET 还是一样。而这次只有符合日期和名字的事件本身才有值,其他的仍然是0。
最后,对于可读性不佳,我深表歉意。希望有人能帮我解决这个问题:]
尝试使用VBA:
Sub TransformTbl()
Dim i As Long, j As Long, cnt As Long
With ActiveSheet
.Range("G1:I1") = Array("Date", "Event", "Place")
cnt = 1
For j = 2 To 4 'column
For i = 2 To 5 'row
If Len(.Cells(i, j)) <> 0 Then
cnt = cnt + 1
.Cells(cnt, 7) = .Cells(1, j) 'Date
.Cells(cnt, 8) = .Cells(i, j) 'Event
.Cells(cnt, 9) = .Cells(i, 1) 'Place
End If
Next i
Next j
End With
End Sub
在 Microsoft Excel 我想创建一个 table 如下图所示。
我已经尝试过使用 vlookup 和索引,但我无法让它按我想要的方式工作。 请帮助我
我写了一个解决方案,对我来说效果很好。这个公式真的很复杂,可能很难理解。虽然我会尽力解释它,但更新公式可能仍然是一项艰巨的工作。这三个公式都是用数组公式写的,按ctrl+shift+enter完成。
G6 中的公式:
=IFERROR(OFFSET($A,0,SMALL(
IF($B:$D<>"",1,99999999)*(COLUMN($B:$D)-1),ROW(A1))),"")
外部 IFERROR 使您的 sheet 免受任何 #Err 的影响。调用正确日期的偏移量。 SMALL 里面的公式生成一个数组,其规则是:如果有事件,该值将是偏移日期的编号,否则将为 99999999,使 OFFSET 出错并被 IFERROR 阻止。使用您提供的数据,数组将是
{ 1,99999999, 3;
1, 2,99999999;
1,99999999,99999999;
99999999,99999999, 3 }
H6 中的公式:
=IFERROR(OFFSET($A,
SMALL(IF($B:$D<>"",ROW($B:$D)-5)*
IF(COLUMN($B:$D)=MATCH(G6,$B:$D,0)+1,1,99999999),99999999),COUNTIF($G:G6,G6)),
MATCH(G6,$B:$D,0)),"")
IFERROR 和OFFSET 的作用与G6 相同。 OFFSET.ROW 中的公式生成与 G6 几乎相同的数组。这次取值为G列确定日期的事件行。其他给出999999999或更多。
I6 中的公式:
=IFERROR(OFFSET($A,MAX((ROW($B:$D)-5)*($B:$D=H6)*
(COLUMN($B:$D)=MATCH(G6,$B:$D,0)+1)),0),"")
IFERROR 和 OFFSET 还是一样。而这次只有符合日期和名字的事件本身才有值,其他的仍然是0。
最后,对于可读性不佳,我深表歉意。希望有人能帮我解决这个问题:]
尝试使用VBA:
Sub TransformTbl()
Dim i As Long, j As Long, cnt As Long
With ActiveSheet
.Range("G1:I1") = Array("Date", "Event", "Place")
cnt = 1
For j = 2 To 4 'column
For i = 2 To 5 'row
If Len(.Cells(i, j)) <> 0 Then
cnt = cnt + 1
.Cells(cnt, 7) = .Cells(1, j) 'Date
.Cells(cnt, 8) = .Cells(i, j) 'Event
.Cells(cnt, 9) = .Cells(i, 1) 'Place
End If
Next i
Next j
End With
End Sub