Option Explicit
Enum d
adInteger = 3
adDouble = 5
adDecimal = 14
adChar = 129
End Enum
Sub transpose()
Dim Obj As Object, Nb As Object: Set Obj = CreateObject("ADODB.Recordset"): Set Nb = CreateObject("ADODB.Recordset") 'on creer la collection
Obj.Fields.Append "Name", adChar, 50
Obj.Open
Nb.Fields.Append "Name", adChar, 50
Nb.Fields.Append "NB", adInteger, 4
Nb.Open
Dim Lib As String, L As Integer, nom As String, X As Integer, col As Integer
Worksheets("feuil2").UsedRange.ClearContents
With Worksheets("feuil1").Range("A1").CurrentRegion
nom = .Cells(1, 1)
col = 0
For X = 1 To .Rows.Count
If Not CBool(InStr(1, Lib, "©" & .Cells(X, 2) & "©")) Then
col = col + 1
Sheets("feuil2").Range("A1").Offset(, col) = .Cells(X, 2)
Lib = Lib & "©" & .Cells(X, 2) & "©"
End If
Obj.AddNew 'on ajoute un enregistrement à la collection
Nb.Filter = "Name='" & Replace(.Cells(X, "A"), "'", "''") & "'"
If Nb.EOF Then Nb.AddNew
Obj("Name") = .Cells(X, "A"): Nb("Name") = .Cells(X, "A")
Nb("NB") = Nb("NB") + 1
Obj.Update: Nb.Update
Nb.Filter = ""
Obj.MoveFirst: Nb.MoveFirst
Nb.Sort = "NB Desc"
Next
End With
Obj.Filter = "Name='" & Replace(Nb("Name"), "'", "''") & "'"
If Not Obj.EOF Then Sheets("feuil2").Range("A2").CopyFromRecordset Obj
End Sub
Option Explicit
Enum d
adInteger = 3
adDouble = 5
adDecimal = 14
adChar = 129
adDate = 7
' adDBDate = 133
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")
.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No;"""
With .Execute("Select distinct [F4] from [feuil1$] where [F4] is not null")
While Not .EOF
OBJ.Fields.Append .Fields("F4"), adChar, 50
OBJ.Fields.Append "Value" & .Fields("F4"), adInteger, 8...
Bonjour,
Oui c'est normal, ce lié à la ligne que je t'ai fait rajouter c'était pour connaître le nom des feuilles vue que le reste ne fonctionnait pas !
Supprimes la ligne avec openshema
Set Rs=Cn.execute(SQL)
while not Rs.eof
Rs.moveNext
wend
Rs.MoveLast
Rs.moveFirst
OBJ.Move 1
Rs.filter ="Champ=Valeur"
IF Rs.eof then msgbox "Pas trouvé"
Enum d
adInteger = 3
adDouble = 5
adDecimal = 14
adChar = 129
adDate = 7
End Enum
Dim OBJ as Object
Set OBJ = CreateObject("ADODB.RECORDSET")
OBJ.Fields.Append "Cham1", adInteger, 8
OBJ.Fields.Append "Cham2" ,adDouble, 18
OBJ.Fields.Append "Cham3",adDecimal, 18
OBJ.Fields.Append "Cham4",adChar, 500
OBJ.Fields.Append "Cham5",adDate, 10
OBJ.Open
OBJ.AddNew
OBJ("Cham1")=255
OBJ("Cham2")=12.5
OBJ("Cham3")=123.345
OBJ("Cham4")="TOTO"
OBJ("Cham5")=Date
OBJ.Update
OBJ.filter="Cham4='TOTO'"
if Not OBJ.eof then
OBJ.AddNew
OBJ("Cham1")=255
OBJ("Cham2")=12.5
OBJ("Cham3")=123.345
OBJ("Cham4")="TOTO"
OBJ("Cham5")=Date
OBJ.Update
end if
OBJ.Sort = "Cham5 ASC
OBJ.Sort = "Cham5 DESC
OBJ.Sort = "Cham5 DESC,Cham2 ASC"
Worksheets("feuil2").UsedRange.ClearContentsDim 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 [F4] from [feuil1$] where [F4] is not null") 'Recupération des valeur de la colonne D
While Not .EOF 'parcoure le RecordSet
'Acjout des valeur de la colonne D com Champ dnas le recorset
OBJ.Fields.Append .Fields("F4"), adChar, 50
OBJ.Fields.Append "Value" & .Fields("F4"), adInteger, 8
OBJ.Fields.Append "Order" & .Fields("F4"), adInteger, 8
.MoveNext
Wend
End With
.Close
End With
OBJ.OpenOBJ.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
OBJ.Filter = "[DATE]=#" & 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
OBJ("DATE") = .Cells(L, "A")
OBJ("Value" & .Cells(L, "D").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, "D").Text)) = "" Then OBJ("Order" & .Cells(L, "D").Text) = .Cells(L, "C")
OBJ.Update 'Mise ajour du recorset
OBJ.MoveFirst 'retour au début Ligne 0
OBJ(.Cells(L, "D").Text) = .Cells(L, "D").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
Option Explicit
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 [F4] from [feuil1$] where [F4] is not null") 'Recupération des valeur de la colonne D
While Not .EOF 'parcoure le RecordSet
'Acjout des valeur de la colonne D com Champ dnas le recorset
OBJ.Fields.Append .Fields("F4"), adChar, 50
OBJ.Fields.Append "Value" & .Fields("F4"), adInteger, 8
OBJ.Fields.Append "Order" & .Fields("F4"), adInteger, 8
.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
OBJ.Filter = "[DATE]=#" & 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
OBJ("DATE") = .Cells(L, "A")
OBJ("Value" & .Cells(L, "D").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, "D").Text)) = "" Then OBJ("Order" & .Cells(L, "D").Text) = .Cells(L, "C")
OBJ.Update 'Mise ajour du recorset
OBJ.MoveFirst 'retour au début Ligne 0
OBJ(.Cells(L, "D").Text) = .Cells(L, "D").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
Merci beaucoup !Bonjour,
déjà on va aborder le sujet hors contexte, apprendre à manipuler l'objet RecordSet!
maintenant il es possible de créer un RecordSet en mémoire sans qu'il soit rattaché à un connexion adodb; comme je n'utilises pas les références ActiveX Data Object dans mon projets j'ai besoin de définir les constante ADO que je doit Utiliser!
- l'objet RecordSet est souvent associé à une connexion ADODB!
VB:Set Rs=Cn.execute(SQL)
- on peut parcourir le RecordSet
Code:while not Rs.eof Rs.moveNext wend
- on peut aller à la fin
VB:Rs.MoveLast
- aller au début
Makefile:Rs.moveFirst
- aller à un enregistrement précis!
Code:OBJ.Move 1
- filtre le RecordSet
Code:Rs.filter ="Champ=Valeur" IF Rs.eof then msgbox "Pas trouvé"
DataTypeEnum (Access desktop database reference)
Office developer client VBA reference documentationlearn.microsoft.com
Code:Enum d adInteger = 3 adDouble = 5 adDecimal = 14 adChar = 129 adDate = 7 End Enum
je vais maintenant créer un Objet RecordSet et le manipuler!
maintenant étudions ce qui nous intéresse!
- j'ajout un Objet RecorSet:
Code:Dim OBJ as Object Set OBJ = CreateObject("ADODB.RECORDSET")
- je lui ajoute des champs
Code:OBJ.Fields.Append "Cham1", adInteger, 8 OBJ.Fields.Append "Cham2" ,adDouble, 18 OBJ.Fields.Append "Cham3",adDecimal, 18 OBJ.Fields.Append "Cham4",adChar, 500 OBJ.Fields.Append "Cham5",adDate, 10
- une fois les champs créé on peut ouvrir le RecordSet !
Code:OBJ.Open
- Maintenant que j'ai ouvert mon RecordSet je peut lui ajouter des données
Code:OBJ.AddNew OBJ("Cham1")=255 OBJ("Cham2")=12.5 OBJ("Cham3")=123.345 OBJ("Cham4")="TOTO" OBJ("Cham5")=Date OBJ.Update
- bien évidement je peux vérifier si il existe un valeur avant d'ajouter!
Code:OBJ.filter="Cham4='TOTO'" if Not OBJ.eof then OBJ.AddNew OBJ("Cham1")=255 OBJ("Cham2")=12.5 OBJ("Cham3")=123.345 OBJ("Cham4")="TOTO" OBJ("Cham5")=Date OBJ.Update end if
- je peux faire un tri de marnière ascendante
VB:OBJ.Sort = "Cham5 ASC
- de manière descente
Code:OBJ.Sort = "Cham5 DESC
- sur plusieurs champs
Code:OBJ.Sort = "Cham5 DESC,Cham2 ASC"
nous voulons récupérer un tableau qui ressemble à ceci!
Regarde la pièce jointe 1156186
sir la ligne une nous avons le nom des champs de notre recordset
et dA2:A9 les enregistrement dans le recordset!
Voila c'est fini!
- dans un premier je j'ajoute un RecordeSet et je lui donne un champ Date!
VB:Worksheets("feuil2").UsedRange.ClearContentsDim I As Integer, L As Long, OBJ As Object Set OBJ = CreateObject("ADODB.RECORDSET") OBJ.Fields.Append "DATE", adDate, 8
- via une requête sur le fichier actif je récupère le nom des champs
Regarde la pièce jointe 1156188
Code: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 [F4] from [feuil1$] where [F4] is not null") 'Recupération des valeur de la colonne D While Not .EOF 'parcoure le RecordSet 'Acjout des valeur de la colonne D com Champ dnas le recorset OBJ.Fields.Append .Fields("F4"), adChar, 50 OBJ.Fields.Append "Value" & .Fields("F4"), adInteger, 8 OBJ.Fields.Append "Order" & .Fields("F4"), adInteger, 8 .MoveNext Wend End With .Close End With
- on ouvre le recordset et on ajoute 2 ligne vide qui correspondent à la ligne 1 et 2 du premier tableau!
Code:OBJ.OpenOBJ.AddNew: OBJ.Update OBJ.AddNew: OBJ.Update
- traitement du tableau de la feuil1
Code: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 OBJ.Filter = "[DATE]=#" & 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 OBJ("DATE") = .Cells(L, "A") OBJ("Value" & .Cells(L, "D").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, "D").Text)) = "" Then OBJ("Order" & .Cells(L, "D").Text) = .Cells(L, "C") OBJ.Update 'Mise ajour du recorset OBJ.MoveFirst 'retour au début Ligne 0 OBJ(.Cells(L, "D").Text) = .Cells(L, "D").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
- J'enlaive un filtre évetuel et je transvase le recordset dans la feuil2
Code:OBJ.Filter = ""If Not OBJ.EOF Then Sheets("feuil2").Range("A1").CopyFromRecordset OBJ
Code:Option Explicit 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 [F4] from [feuil1$] where [F4] is not null") 'Recupération des valeur de la colonne D While Not .EOF 'parcoure le RecordSet 'Acjout des valeur de la colonne D com Champ dnas le recorset OBJ.Fields.Append .Fields("F4"), adChar, 50 OBJ.Fields.Append "Value" & .Fields("F4"), adInteger, 8 OBJ.Fields.Append "Order" & .Fields("F4"), adInteger, 8 .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 OBJ.Filter = "[DATE]=#" & 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 OBJ("DATE") = .Cells(L, "A") OBJ("Value" & .Cells(L, "D").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, "D").Text)) = "" Then OBJ("Order" & .Cells(L, "D").Text) = .Cells(L, "C") OBJ.Update 'Mise ajour du recorset OBJ.MoveFirst 'retour au début Ligne 0 OBJ(.Cells(L, "D").Text) = .Cells(L, "D").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
Oui, justement, le code marche bien. Je voulais le modifier car le modèle a changé, j’ai des données à vide. Je me demande si c’est faisable.essais de faire un tableau dans le même style que ça avec test valeur!
Regarde la pièce jointe 1156220
OBJ.Fields.Append "Cham1", adInteger, 8 'integer
OBJ.Fields.Append "Cham2", adDouble, 18 'double decimale
OBJ.Fields.Append "Cham3", adChar, 500 'Texte
OBJ.Fields.Append "Cham4", adDate, 10 'Date
Le curseur jaune est sur OBJ.Filter, car les cellules sont vides alors que le format date est demandé. Quand je remplace les valeurs vide par les dates le code marche.Refais un imprime écran après avoir cliqué sur le bouton débogage de la fenêtre d'erreur !
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 Trim(.Cells(L, "A")) <> "" Then OBJ("DATE") = .Cells(L, "A")
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 [F4] from [feuil1$] where [F4] is not null") 'Recupération des valeur de la colonne D
While Not .EOF 'parcoure le RecordSet
'Acjout des valeur de la colonne D com Champ dnas le recorset
OBJ.Fields.Append .Fields("F4"), adChar, 50
OBJ.Fields.Append "Value" & .Fields("F4"), adInteger, 8
OBJ.Fields.Append "Order" & .Fields("F4"), adInteger, 8
.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, "D").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, "D").Text)) = "" Then OBJ("Order" & .Cells(L, "D").Text) = .Cells(L, "C")
OBJ.Update 'Mise ajour du recorset
OBJ.movefirst 'retour au début Ligne 0
OBJ(.Cells(L, "D").Text) = .Cells(L, "D").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
Merci beaucoup ! C'est plus clair maintenant.on peux filtre sur NULL mais toute les date à Null ????
VB: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!
si la date est Null
Code:If Trim(.Cells(L, "A")) <> "" Then OBJ("DATE") = .Cells(L, "A")
Code: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 [F4] from [feuil1$] where [F4] is not null") 'Recupération des valeur de la colonne D While Not .EOF 'parcoure le RecordSet 'Acjout des valeur de la colonne D com Champ dnas le recorset OBJ.Fields.Append .Fields("F4"), adChar, 50 OBJ.Fields.Append "Value" & .Fields("F4"), adInteger, 8 OBJ.Fields.Append "Order" & .Fields("F4"), adInteger, 8 .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, "D").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, "D").Text)) = "" Then OBJ("Order" & .Cells(L, "D").Text) = .Cells(L, "C") OBJ.Update 'Mise ajour du recorset OBJ.movefirst 'retour au début Ligne 0 OBJ(.Cells(L, "D").Text) = .Cells(L, "D").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
En fait, j'ai modifié le code pour afficher une colonne supplémentaire (le taux), mais elle s'affiche pas correctement, pourriez-vous regarder la coquille s'il vous plaît ?Merci beaucoup ! C'est plus clair maintenant.
Je suis en train de regarder comment modifier le code si jamais il y des colonnes supplémentaires.
J'aurais une question : dans l'output les décimals ne s'affichent pas et quand je mets : OBJ.Fields.Append "Value" & .Fields("F4"), adDecimal, 8 (en décimal), l'output affiche 343131 au lieu de 343131,43.
Est-ce qu'il y a un format d'affichage spécifique pour ce genre de données ?
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"), adDecimal, 8
OBJ.Fields.Append "Taux" & .Fields("F5"), adDecimal, 8
OBJ.Fields.Append "Order" & .Fields("F5"), adInteger, 8
.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("Taux" & .Cells(L, "E").Text) = .Cells(L, "C")
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")
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
Voici mes données en entrée :En fait, j'ai modifié le code pour afficher une colonne supplémentaire (le taux), mais elle s'affiche pas correctement, pourriez-vous regarder la coquille s'il vous plaît ?
VB: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"), adDecimal, 8 OBJ.Fields.Append "Taux" & .Fields("F5"), adDecimal, 8 OBJ.Fields.Append "Order" & .Fields("F5"), adInteger, 8 .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("Taux" & .Cells(L, "E").Text) = .Cells(L, "C") 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") 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
Merci, ça marche bien et j'ai réussi à modifier le code !Oui je n'ai pas réussi à utiliser le décimal utilises adDouble!
Le décimal fonction sur un nombre de caractères avant et après la virgule mais j'ai pas pigé la règle de nomage
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
Dim Condition As Boolean, F As Integer
If Not OBJ.EOF Then
For I = OBJ.RecordCount - 1 To 0 Step -1
OBJ.Move I
Condition = False
For F = 0 To OBJ.fields.Count - 1
Condition = IIf(Trim(OBJ.fields(F)) = "" Or Trim(OBJ.fields(F)) = "0", False, True)
If Condition Then Exit For
Next
If Not Condition Then OBJ.Delete
OBJ.movefirst
Next
OBJ.movefirst
Sheets("feuil2").Range("A1").CopyFromRecordset OBJ
End If
Merci,bonjour,
tu commence à métriser le sujet!
je suis sur mon téléphone portable je ne peux pas tester mais ça devrait ressembler à ça!
VB:Dim Condition As Boolean, F As Integer If Not OBJ.EOF Then For I = OBJ.RecordCount - 1 To 0 Step -1 OBJ.Move I Condition = False For F = 0 To OBJ.fields.Count - 1 Condition = IIf(Trim(OBJ.fields(F)) = "" Or Trim(OBJ.fields(F)) = "0", False, True) If Condition Then Exit For Next If Not Condition Then OBJ.Delete OBJ.movefirst Next OBJ.movefirst Sheets("feuil2").Range("A1").CopyFromRecordset OBJ End If