Option Explicit
Private Enum d 'enumérateur des constante ADO
adInteger = 3
adDouble = 5
adDecimal = 14
adChar = 129
adDate = 7
End Enum
Sub NewTranspose()
Worksheets("feuil2").UsedRange.ClearContents
Dim I As Integer, L As Long, OBJ As Object
Set OBJ = CreateObject("ADODB.RECORDSET")
OBJ.Fields.Append "DATE", adDate, 8
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 [F5] from [feuil1$] where [F5] is not null") 'Recupération des valeur de la colonne E
While Not .EOF 'parcoure le RecordSet
'Acjout des valeur de la colonne D com Champ dnas le recorset
OBJ.Fields.Append .Fields("F5"), adChar, 50
OBJ.Fields.Append "Value" & .Fields("F5"), adDouble, 5
OBJ.Fields.Append "Order" & .Fields("F5"), adDouble, 5
OBJ.Fields.Append "Taux" & .Fields("F5"), adDouble, 5
.MoveNext
Wend
End With
.Close
End With
OBJ.Open
OBJ.AddNew: OBJ.Update
OBJ.AddNew: OBJ.Update
With Sheets("feuil1").Range("A1").CurrentRegion 'on recupère la page 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, "A")) = "", "Null", "#" & Format(.Cells(L, "A"), "yyyy-mm-dd") & "#")
OBJ.Filter = "[DATE]=" & IIf(Trim(.Cells(L, "A")) = "", "Null", "#" & Format(.Cells(L, "A"), "yyyy-mm-dd") & "#") 'je filtre mon Recordset sur AX 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
' j'affect les valeur au RecordSet
If Trim(.Cells(L, "A")) <> "" Then OBJ("DATE") = .Cells(L, "A")
OBJ("Value" & .Cells(L, "E").Text) = .Cells(L, "B")
OBJ.Update
OBJ.Filter = ""
OBJ.Move 1 'Enregistrement 1 soit ligne 2 du tableau sachant qu'un RecorSet commance à 0
' si le champ Order est Null ,OrderABB=Null par exeple
If Trim(OBJ("Order" & .Cells(L, "E").Text)) = "" Then OBJ("Order" & .Cells(L, "E").Text) = .Cells(L, "D")
If Trim(OBJ("Taux" & .Cells(L, "E").Text)) = "" Then OBJ("Taux" & .Cells(L, "E").Text) = .Cells(L, "C")
OBJ.Update 'Mise ajour du recorset
OBJ.movefirst 'retour au début Ligne 0
OBJ(.Cells(L, "E").Text) = .Cells(L, "E").Text 'on affect la valeurde la cellule D au champ qui porte le même nom OBJ("ABB")="OBJ" par exeple
OBJ.Update 'mis a jour du recordset
Next
End With
OBJ.Filter = ""
If Not OBJ.EOF Then Sheets("feuil2").Range("A1").CopyFromRecordset OBJ
End Sub