'TRANSPOSE
Sub NewTranspose()
Worksheets("CALCUL").UsedRange.ClearContents
Dim I As Integer, L As Long, OBJ As Object
Set OBJ = CreateObject("ADODB.RECORDSET")
OBJ.Fields.Append "DATE", adDate, 8
'1 ) On récupère le nom des champs via une requête sur le fichier actif
With CreateObject("ADODB.CONNECTION") 'Objet de Connection ADODB
.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No;""" 'Connexion sur le fichier Actif
With .Execute("Select distinct [F2] from [DONNEES_EA$] where [F2] is not null") 'Recupération des valeur de la colonne B (code support)
While Not .EOF 'parcoure le RecordSet
'Acjout des valeur de la colonne B com Champ dnas le recorset
OBJ.Fields.Append .Fields("F2"), adChar, 50
OBJ.Fields.Append "Value" & .Fields("F2"), adDouble, 5
OBJ.Fields.Append "Order" & .Fields("F2"), adDouble, 5
OBJ.Fields.Append "Taux" & .Fields("F2"), adDouble, 5
.MoveNext
Wend
End With
.Close
End With
'2 ) Fin création des champs
'3 ) on ouvre le recordset (OBJ.Open) et on ajoute 5 lignes vides
OBJ.Open
OBJ.AddNew: OBJ.Update
OBJ.AddNew: OBJ.Update
OBJ.AddNew: OBJ.Update
OBJ.AddNew: OBJ.Update
'4) traitement du tableau de la feuil1 CALCUL
With Sheets("DONNEES_EA").Range("A1").CurrentRegion 'on recupère la plage de cellules qui ont des valeurs
For L = 1 To .Rows.Count 'de la ligne 1 à la dernière
Debug.Print IIf(Trim(.Cells(L, "F")) = "", "Null", "#" & Format(.Cells(L, "F"), "yyyy-mm-dd") & "#")
OBJ.Filter = "[DATE]=" & IIf(Trim(.Cells(L, "F")) = "", "Null", "#" & Format(.Cells(L, "F"), "yyyy-mm-dd") & "#") 'je filtre mon Recordset sur F qui es une date
If OBJ.EOF Then 'Si la date nexiste pas
OBJ.AddNew 'je l'ajoute au recorset
For I = 0 To OBJ.Fields.Count - 1
If Left(OBJ(I).Name, 5) = "Value" Then OBJ(I) = 0 'je mets tous les champs Value à 0
Next
End If
'4.2) j'affect les valeur au RecordSet
If Trim(.Cells(L, "F")) <> "" Then OBJ("DATE") = .Cells(L, "F")
OBJ("Value" & .Cells(L, "B").Text) = .Cells(L, "G")
OBJ.Update 'mis a jour du recordset
OBJ.Filter = ""
OBJ.Move 3 'Enregistrement 2 soit ligne 4 du tableau sachant qu'un RecordSet commance à 0
' si le champ Order est Null ,OrderABB=Null par exeple
If Trim(OBJ("Order" & .Cells(L, "B").Text)) = "" Then OBJ("Order" & .Cells(L, "B").Text) = .Cells(L, "H")
If Trim(OBJ("Taux" & .Cells(L, "B").Text)) = "" Then OBJ("Taux" & .Cells(L, "B").Text) = .Cells(L, "C")
OBJ.Update 'Mise ajour du recorset
OBJ.MoveFirst 'retour au début Ligne 1, soit ligne 3
OBJ(.Cells(L, "B").Text) = "CD_SUPPORT" & Space(3) & .Cells(L, "B").Text 'on affect la valeurde la cellule B au champ qui porte le même nom OBJ("ABB")="OBJ" par exeple
OBJ.Update 'mis a jour du recordset
Next
End With
'4.3) on copie les données
OBJ.Filter = ""
If Not OBJ.EOF Then Sheets("CALCUL").Range("F9").CopyFromRecordset OBJ
'
'With OBJ
' For I = 0 To .Fields.Count - 1
' If .Fields(I).Name Like "Value*" Then Sheets("CALCUL").Columns(I + 1).NumberFormat = "#0.00 €"
' If .Fields(I).Name Like "Order*" Then Sheets("CALCUL").Columns(I + 1).NumberFormat = "#0.00 €"
' If .Fields(I).Name Like "Taux*" Then Sheets("CALCUL").Columns(I + 1).NumberFormat = "#0.00 %"
' Next
'End With
End Sub