2017-10-10 29 views

回答

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 

enter image description here

0

我写了一个解决方案,它适用于我。该公式非常复杂,可能很难理解。虽然我会尽我所能解释它,但更新公式可能仍然是一项艰巨的工作。所有这三个公式都写入数组公式,按Ctrl + Shift + Enter结束。

公式在G6:

=IFERROR(OFFSET($A$5,0,SMALL(
IF($B$6:$D$9<>"",1,99999999)*(COLUMN($B$6:$D$9)-1),ROW(A1))),"") 

外IFERROR保持从任何#ERR您的工作表。用于调用正确日期的OFFSET。 SMALL内部的公式会生成一个规则数组:如果有事件,则该值为偏移日期的数字,否则为99999999,给OFFSET一个错误并被IFERROR阻塞。随着你给的数据,该阵列将

{  1,99999999,  3; 
     1,  2,99999999; 
     1,99999999,99999999; 
    99999999,99999999,  3 } 

公式在H6:

=IFERROR(OFFSET($A$5, 
    SMALL(IF($B$6:$D$9<>"",ROW($B$6:$D$9)-5)* 
     IF(COLUMN($B$6:$D$9)=MATCH(G6,$B$5:$D$5,0)+1,1,99999999),99999999),COUNTIF($G$6:G6,G6)), 
    MATCH(G6,$B$5:$D$5,0)),"") 

的IFERROR和OFFSET工作方式相同G6。在OFFSET.ROW式产生几乎相同的阵列G6。这次的值是由列G确定的日期的行。其他给出999999999或更多。

公式在I6:

=IFERROR(OFFSET($A$5,MAX((ROW($B$6:$D$9)-5)*($B$6:$D$9=H6)* 
(COLUMN($B$6:$D$9)=MATCH(G6,$B$5:$D$5,0)+1)),0),"") 

IFERROR和OFFSET仍然是相同的。而这个时候只有事件的日期和本身的名称相匹配具有值,其他保持为0

最后,我为穷人可读性道歉。希望有人能帮助我这个:]

相关问题