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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| Option Explicit
Sub MacroJ()
'! Pas de cellules vides dans la colonne 1 ou la ligne 1 du tableau
'! Pas de cellules non vides dans la colonne 1 ou la ligne 1 au delà du tableau
' conseil : laisser la colonne détail être la plus à droite des colonnes fixes et la colonne value la première des col variables en raison du param field du filtrage (moyennant quoi la macro restera fonctionnelle en cas d'ajout de colonnes fixes)
'déclaration tableau initial colonnes fixes et variables, tableau final colonnes
Dim vColOF As Byte, vColOV As Byte, vColD As Byte 'origine nb colonnes fixes et variables, destination nb colonnes
Dim vRowO As Long 'nb de ligne tableau d'origine
Dim oShtO As Worksheet, oShtD As Worksheet 'feuille d'origine et destinations
Dim oRngF As Range 'objet plage de cellules fixes
Dim i As Integer 'compteur
Const cDB = "Données brutes" 'nom de la feuille d'origine
'paramètres
Set oShtO = Worksheets(cDB) 'feuille des données initiales
vColOF = Application.InputBox(prompt:="Nombre de colonnes fixes ?", Type:=1, Default:=10)
If vColOF = 0 Then Exit Sub 'sortie si click Annuler
vColOV = oShtO.Cells(1, Columns.Count).End(xlToLeft).Column - vColOF 'la derniere cellule ligne 1 doit etre non vide
'contrôle de cohérence de l'entrée vColOF
If vColOV <= 0 Then
MsgBox "Anomalie, la largeur du tableau n'est pas plus grande que le nombre de colonnes fixes"
Exit Sub
End If
vRowO = oShtO.Cells(Rows.Count, 1).End(xlUp).Row - 1
'contrôle de cohérence : nombre de lignes
If vRowO = 0 Then
MsgBox "Anomalie, pas de lignes au tableau"
Exit Sub
End If
Sheets.Add 'ajout d'une feuille
Set oShtD = ActiveSheet 'déclaration de la nouvelle feuille
'nouvelles colonnes
oShtD.Cells(1, vColOF + 1) = "Value"
oShtD.Cells(1, vColOF + 2) = "Period"
oShtD.Cells(1, vColOF + 3) = "Version"
vColD = oShtD.Cells(1, Columns.Count).End(xlToLeft).Column
'traitement
'ligne de titre
oShtO.Range("A1").Resize(1, vColOF).Copy oShtD.Range("A1")
'déclaration de la plage fixe (corps du tableau)
Set oRngF = oShtO.Range("A2").Resize(vRowO, vColOF)
'copie
For i = 1 To vColOV 'autant de collages que de colonnes variables
With oShtD
oRngF.Copy .Range(oRngF.Address).Offset((i - 1) * vRowO, 0) 'copie de la plage fixe
'copie valeurs
Range(oShtO.Cells(2, vColOF + i), oShtO.Cells(vRowO + 1, vColOF + i)).Copy .Range(oShtD.Cells(vRowO * (i - 1) + 2, vColOF + 1), oShtD.Cells(vRowO * i + 1, vColOF + 1))
'copie period
oShtO.Cells(1, vColOF + i).Copy Range(oShtD.Cells(vRowO * (i - 1) + 2, vColOF + 2), oShtD.Cells(vRowO * i + 1, vColOF + 2)) 'copie de la plage period
End With
Next i
'date
Range(oShtD.Cells(2, vColOF + 3), oShtD.Cells(vRowO * vColOV + 1, vColOF + 3)) = Date
'formats
'police
With Range(oShtD.Cells(1, 1), oShtD.Cells(vRowO * vColOV + 1, vColD)).Font
.Name = "Calibri"
.Size = 10
.FontStyle = "Normal"
End With
'fonds
Range(oShtD.Cells(1, 1), oShtD.Cells(1, vColOF)).Interior.Color = 14997432
Range(oShtD.Cells(2, vColOF + 1), oShtD.Cells(vRowO * vColOV + 1, vColOF + 1)).Interior.Color = 16775662
Range(oShtD.Cells(2, 1), oShtD.Cells(vRowO * vColOV + 1, vColOF)).Interior.Color = 16051415
Range(oShtD.Cells(2, vColOF + 2), oShtD.Cells(vRowO * vColOV + 1, vColD)).Interior.Color = 16051415
Range(oShtD.Cells(1, vColOF + 1), oShtD.Cells(1, vColD)).Interior.Color = 16051415
'bordures
Range(oShtD.Cells(1, 1), oShtD.Cells(1, vColOF + 2)).Borders.LineStyle = xlNone
With Range(oShtD.Cells(2, 1), oShtD.Cells(vRowO * vColOV + 1, vColD)).Borders
.LineStyle = xlContinuous
.Weight = xlThin
End With
'alignements
Range(oShtD.Cells(1, vColOF + 1), oShtD.Cells(vRowO * vColOV + 1, vColD)).HorizontalAlignment = xlCenter
Range(oShtD.Cells(1, 1), oShtD.Cells(vRowO * vColOV + 1, vColOF)).HorizontalAlignment = xlLeft
Range(oShtD.Cells(1, 1), oShtD.Cells(vRowO * vColOV + 1, vColOF)).IndentLevel = 1
Range(oShtD.Cells(1, 1), oShtD.Cells(1, vColD)).EntireColumn.AutoFit 'ajustement
'filtres
Range(oShtD.Cells(1, 1), oShtD.Cells(1, vColD)).AutoFilter
Range(oShtD.Cells(2, 1), oShtD.Cells(vRowO * vColOV + 1, vColD)).AutoFilter Field:=vColOF, Criteria1:=Array( _
"yz1", "yz2", "yz3", "yz4"), Operator:=xlFilterValues 'critères à adapter
Range(oShtD.Cells(2, 1), oShtD.Cells(vRowO * vColOV + 1, vColD)).AutoFilter Field:=vColOF + 1, Criteria1:="<>0", _
Operator:=xlAnd, Criteria2:="<>"
'copie des cellules visibles, la ligne de titre non inclue
Range(oShtD.Cells(2, 1), oShtD.Cells((vRowO - 1) * vColOV + 1, vColD)).SpecialCells(xlCellTypeVisible).Copy
'libération des objets
Set oShtO = Nothing
Set oShtD = Nothing
Set oRngF = Nothing
End Sub |