2017-10-10 9 views

Répondre

0

Essayez d'utiliser 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

J'ai écrit une solution et cela fonctionne très bien avec moi. La formule est vraiment complexe et probablement difficile à comprendre. Bien que je ferai de mon mieux pour l'expliquer, la mise à jour de la formule peut encore être un travail difficile. Toutes ces trois formules sont écrites dans Array Formula, appuyez sur ctrl + shift + enter pour terminer.

Formule en G6:

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

Le IFERROR extérieur maintient votre feuille de toute #Err. L'OFFSET pour appeler la bonne date. La formule dans SMALL génère un tableau avec la règle: S'il y a un événement, la valeur sera le numéro de la date de décalage, sinon, ce sera 99999999 qui donnera une erreur à OFFSET et sera bloquée par IFERROR. Avec les données que vous avez donné, le tableau sera

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

Formule en 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)),"") 

Le IFERROR et OFFSET fonctionne comme G6. La formule dans OFFSET.ROW génère presque le même tableau que G6. Cette fois, la valeur est la ligne de l'événement avec la date déterminée par la colonne G. Autre donne 999999999 ou plus.

formule dans 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 et OFFSET sont toujours les mêmes. Et cette fois seulement l'événement qui correspond à la date et le nom de lui-même a une valeur, l'autre reste 0.

Enfin, je m'excuse pour la mauvaise lisibilité. Souhaitent que quelqu'un peut me aider avec ceci:]