1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| Option Explicit
Public Sub subTranspose()
Dim oRngV As Excel.Range
Dim bFinTab As Boolean
Dim oRngH As Excel.Range
Dim vV As Variant, iV As Integer, jV As Integer
Dim vH As Variant, iH As Integer, jH As Integer
Dim iNbEvents As Integer
Dim oCol As VBA.Collection
'instancier les plages des tableaux
Set oRngV = ThisWorkbook.Names("nmTabVertical").RefersToRange
Set oRngH = ThisWorkbook.Names("nmTabHorizontal").RefersToRange
'effacer le contenu éventuel du tableau horizontal
vH = oRngH.Value
For iH = 2 To UBound(vH, 1)
For jH = 1 To UBound(vH, 2)
vH(iH, jH) = Empty
Next jH
Next iH
oRngH.Value = vH
'compter les évènements
vV = oRngV.Value
iNbEvents = 0
For iV = 2 To UBound(vV, 1)
If Len(vV(iV, 1)) > 0 Then iNbEvents = iNbEvents + 1
Next iV
'dimensionner le tableau résultat, nb de lignes seulement
Set oRngH = oRngH.Resize(iNbEvents + 1)
'mettre à jour le nom de plage
ThisWorkbook.Names("nmTabHorizontal").RefersTo = "='" & oRngH.Worksheet.Name & "'!" & oRngH.Address
vH = oRngH.Value
'créer une collection des en-têtes pour les champs cités en col 3 du tableau vertical
Set oCol = New VBA.Collection
'extraire les noms de champs à partir de la colonne 4
'dans cette collection, la clé est le nom du champ et la valeur de l'élément est l'indice de colonne dans le tableau H
For jH = 4 To UBound(vH, 2)
oCol.Add jH, vH(1, jH)
Next jH
'transposer
iH = 1
bFinTab = False
For iV = 2 To UBound(vV, 1)
If Len(vV(iV, 1)) > 0 Then
iH = iH + 1
vH(iH, 1) = vV(iV, 1) 'évènement
vH(iH, 2) = vV(iV, 2) 'code erreur
vH(iH, 3) = vV(iV, 3) 'contexte
'pour placer un élément de la colonne 5, on utilise la collection
Do
If Len(vV(iV, 4)) > 1 Then
On Error Resume Next
vH(iH, oCol(vV(iV, 4))) = vV(iV, 5)
On Error GoTo 0
End If
If iV < UBound(vV, 1) Then: iV = iV + 1: Else: bFinTab = True ': End If
Loop Until (Len(vV(iV, 1)) > 0) Or bFinTab
If Not bFinTab Then iV = iV - 1
End If
Next iV
'copier le résultat
oRngH.Value = vH
'libérer les variables
Set oCol = Nothing
Set oRngV = Nothing
Set oRngH = Nothing
vV = Empty
vH = Empty
End Sub |
Partager