Ajout ligne table dans Access

Ok parfait

Mais pour les données que je dois injectes, j'ai le meme problème, la variable est trop longue? Comment je fais pour cette partie?

Bah, même principe!

En Vba une variable String peut contenir 2^31 caractères (soit environ 2Go) donc yadlaplace.

Donc par exemple, en bouclant comme tu l'as déjà fait dans ton post du 9/02/2016 15:58 tu mets tout dans une seule variable à injecter dans ta base.

Nb : il ne faut pas confondre les limites de l'éditeur de code de excel avec les limites des variables du Vba!

Merci pour les infos mais à vrai dire j'ai jamais utilisé la boucle car il y avait toujours une erreur mais ici vu que je suis un peu obligé, j'ai fait mes tests, j'ai réussi à faire fonctionné la boucle mais je ne comprends pas pourquoi mais si je prends les valeurs de la colonne M par exemple, si M1 n'est pas un chiffre mais une lettre, il m'indique une erreur d'argument (pas pour la valeur M2 et M3), par contre si c'est un chiffre pas de soucis ca fonctionne et je ne comprends pas le pourquoi, pouvez-vous m'éclairer, voici le code en question:

    Data = Id & "," & Range("M1").Value
    For i = 1 To 2
    Data = Data & ",'" & ActiveSheet.Range("M" & i).Value & "'"
    Next i

Ok,

En fait tout dépend du type des champs de la base et du contenu des cellules d'excel.

Pour tes données, c'est sûr qu'un champ numérique n'acceptera pas de texte. Est-ce le cas pour le champ correspondant à ta valeur M1?

Pour commencer, je t'invite à lire ce que j'ai répondu à Eloo ici

https://forum.excel-pratique.com/viewtopic.php?f=2&t=105555&p=624125#p624125

Il y a notamment 3 de mes fonctions de codage de données qui peuvent être utilisées facilement.

Ensuite :

* pour un INSERT dans lequel on indique les intitulés des entêtes, il est nécessaire d'injecter le même nombre de données que d'entêtes. Par exemple, la requête doit être du genre :

INSERT INTO [Clients] (Id, Nom, Prenom, Age) VALUES (56, 'Rio', 'Derc''hen', 34)

Rq : si la table ne contient que ces 4 champs, la requête suivante est valide :

INSERT INTO [Clients] VALUES (56, 'Rio', 'Derc''hen', 34)

(rq l'apostrophe de Derc'hen est doublée car à l'intérieur d'une donnée texte)

* pour un UPDATE, ce sera du genre :

UPDATE [Clients] SET Nom='RIOU', Prenom='Soizig', Age=35 WHERE Id=56

Déjà avec cet exemple on voit que la boucle pour un INSERT ne peut pas être la même que pour un UPDATE

Pour continuer, je te suggère de tester ta chaine de requête après ta boucle pour vérifier ces points (nb de données/nb de data, type de données, format de données) avec un debug.print par exemple

Pierre

Mais c'est ca que je ne comprends pas car la table de test est composé de :

Id , champ1, champ2, champ3

Les trois champs sont des textes sauf l'id qui est un numero auto

La requette de l'injection fonctionne parfaitement, sauf si je mets dans M1 une lettre, là ca me mets :

Trop peu de parametre . 1 attendu

Je ne comprend pas pourquoi, voici le code complet du VBA

Sub encodageaccess()

Dim Cnx As Object, Rst As Object

Dim Col_SQL As Integer, i As Long, j As Integer

Dim requete As String, Id As Long, maTable As String, Entete As String, Data As String

BDD = ActiveWorkbook.Path & "\BDD\CEF.accdb"

    Set Cnx = CreateObject("ADODB.Connection")

    Cnx.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & BDD

    maTable = "Table1"

    Id = Max_Id(maTable, "id") + 1

    Entete = "Id, Champ1, Champ2, Champ3"

    Data = Id & "," & Range("M1").Value

    For i = 1 To 2

    Data = Data & ",'" & ActiveSheet.Range("M" & i).Value & "'"

    Next i

    requete = "INSERT INTO [" & maTable & "] (" & Entete & ") VALUES (" & Data & ")"

    Set Rst = Cnx.Execute(requete)

    Cnx.Close

    Set Cnx = Nothing

    Set Rst = Nothing

    MsgBox ("C'est ok, c'est dans la boite!")

End Sub

Dans ton code il y a donc 2 erreurs :

1/ si le champs1 est texte il faut y mettre du texte entouré d'apostrophes :

Data = Id & "," & "'" & Range("M1").Value & "'"

2/ dans ta boucle tu réutilises encore M1 pour le mettre dans ton Champs1 :

Range("M" & i).Value quand i=1 => Range("M1").Value

Est-ce que dans ton cas, il ne vaudrait pas mieux :

    Data = Id
    For i = 1 To 3
        Data = Data & ",'" & ActiveSheet.Range("M" & i).Value & "'"
    Next i

Je me disais bien que cela devait être quelques chose de ce genre là mais je n'arrivai pas à mes fins, c'est parfait en tout cas.

Je profite aussi pour vraiment te remercier pour toute ton aide, c'est vraiment très appréciable de pouvoir compter sur tes connaissances dans le domaine et de bien vouloir passer ton temps pour en faire profiter des novices comme moi

Je reviens de nouveau ^^.

Tout fonctionne niquel mtn, j'ai réussi à injecter mes 137 éléments dans ma base de donnée accès sans problème

Mais je viens d'avoir un cas de figure, le nom d'une société qui s’appelle par Exemple "Société d'écaussinnes" possède dans son nom une apostrophe entre le D et Ecaussinnes mais le problème est que le VBA le traduit par l'arret de la commande au niveau du D et génére donc une erreur.

Comment pourrai je insérer une apostrophe dans le nom de la société dans access?

Merci

Ah autre chose ^^ , je veux faire une update d'une ligne de la table.

J'avais déjà eu une aide à ce niveau là et cela avait fonctionné mais ici je veux faire une update complète de la ligne mais avec 137 données différentes, je me demande si je peux le faire également via une boucle comme pour l'injection, j'ai essayé d'adapter le code en fonction mais je n'arrive pas à la faire fonctionne.

Est- ce possible aussi ?

Heum,

Pour toutes ces questions, les réponses sont données plus haut (dont post d'hier à 16h47)

Je te recommande de lire également la réponse faite à Eloo, dont le lien figure également dans le post de 16h47.

Çà fait plaisir de voir que ce que j'écris est lu attentivement ...

No more comments ...

En effet désolé je n'avais pas bien lu ta réponse,

J'ai solution le problème pour l'apostrophe.

Par contre pour l'update, je doit donc avoir une forme de requete avec le nom de la colonne=la donne mis à jour donc je réfléchis un peu, pas de soucis pour faire une boucle avec les données à mettre à jour mais pour les noms de colonnes, comment les appelle un par un vu que je n'ai pas cette information dans mes feuilles excel, je dispose de cette infos via ta fonction que tu m'as donné mais je ne sais pas comment l'exploité dans ce cas de figure?

Bah, il suffit de spliter ta chaine entete="id, champs1, champs2, ..." dans un variant :

dim T as variant
  T=split(entete, ", ")

et là tu obtiens : t(0)="id", t(1)="champs1", etc ...

que tu utilises dans ta boucle avec un code dans le genre:

for i = 0 to ...
  Upd=upd & T(i) & "='" & sheets(truc).range(machin, i+1)  & "', " 'ou .range(i+1,machin)
next i

Simple, basique, ...

Merci pour ces réponses,

J'ai essaye de l'appliqué mais j'ai une erreur de syntaxe mais j'ai deux choses que je ne comprends pas bien dans ta boucle. Tu démarres à la valeur 0, soit l'id mais dans ma requete, l'id est définis dans la variable condition, donc je commence dans ma boucle au 1. Et pour la valeur, tu mets i +1 , ca ne je comprends pas le pourquoi?

Voici le code que j'ai essayé mais qui ne fonctionne pas (j'ai quatre colonnes dans ma base de teste, Id, Champ1, Champ2, Champ3)

Sub commentairebrut()

Dim upd As String, condition As String, T As Variant
    Set Cnx = CreateObject("ADODB.Connection")
    Cnx.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & "C:\Users\benedicte\Documents\Fichiers Outlook\BDD\CEF.accdb"

' ...
 maTable = "Table1"

Entete = EnteteBDD("C:\Users\benedicte\Documents\Fichiers Outlook\BDD\CEF.accdb", "Table1")

T = Split(Entete, ", ")

For i = 1 To 3
  upd = udp & T(i) & "='" & ActiveSheet.Range("AB" & i).Value & "', " '
Next i

condition = "Id=" & ActiveSheet.Range("AD1").Value

requete = "UPDATE  [" & maTable & "] SET " & upd & " WHERE " & condition

Set Rst = Cnx.Execute(requete)

 Cnx.Close
    Set Cnx = Nothing
    Set Rst = Nothing
    MsgBox ("C'est ok")

' ...

End Sub

Tous les exemples de code que j'indique sont à adapter à ton cas de figure

C'est à toi de tester la validité de ta chaine de requête avec un truc du genre :

debug.print upd

Et puis sur mon blog, il y a plein d'exemples fonctionnels d'interaction entre Excel et Access.

J'ai posté aussi une démo ici :

https://forum.excel-pratique.com/viewtopic.php?f=2&t=105552&p=626478#p626478

Voila j'ai réussi à faire fonctionner la requête avec tes aides sur la base de test avec 3 colonnes, ici j'ai adapté pour la base de donne à 137 colonnes mais là par contre j'ai une erreur dans la requête, trop de valeur attendu pourtant je ne vois pas le pourquoi, j'ai donc tenté de voir avec l'espion la requête et celle ci semble correct mais j'ai n'ai pas toute la requête affiché, il m'affiche le début et j'aimerai voir la fin pour voir le problème ^^ mais je n'arrive pas à savoir comment voir toute la valeur de la variable de la requête, comment je peux faire pour copier l'ensemble de la valeur dans la fenêtre espion du VBA?

Voici le code adapté mais celui ci fonctionne c'est juste le nombre de valeur qui n'est pas correcte mais je comprends pas:

Sub commentairebrut()

Dim upd As String, condition As String

    Set Cnx = CreateObject("ADODB.Connection")
    Cnx.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & "C:\Users\benedicte\Documents\Fichiers Outlook\BDD\CEF.accdb"

' ...
 maTable = "deviscreer"

Entete = EnteteBDD("C:\Users\benedicte\Documents\Fichiers Outlook\BDD\CEF.accdb", "deviscreer")

Dim t As Variant
t = Split(Entete, ", ")

 upd = t(1) & "=" & Codage_txt(ActiveSheet.Range("V1").Value) & ""
For i = 2 To 136
  upd = upd & "," & t(i) & "=" & Codage_txt(ActiveSheet.Range("V" & i).Value) & ""
Next i

condition = "id=" & ActiveSheet.Range("U2").Value

requete = "UPDATE  [" & maTable & "] SET " & upd & " WHERE " & condition

Set Rst = Cnx.Execute(requete)
On Error Resume Next

 Cnx.Close
    Set Cnx = Nothing
    Set Rst = Nothing
    MsgBox ("C'est ok, c'est dans la boite!")

' ...

End Sub

Fait simple, écrit ta requete dans un fichier txt, du genre :

Dim f As Integer

    requete = "UPDATE ...    
    f = FreeFile
    Open ActiveWorkbook.Path & "\log.txt" For Output As #f
    Print #f, requete
    Close f

Je viens de le faire , c'est alors la grosse interrogation, car pour moi c'est bon il me dit trop de champs définis, pourtant c'est correct ou je vois pas l'erreur ,

Voici la requetes:

UPDATE  [deviscreer] SET contrat='0',civilite='0',nom='0',prenom='0',societe='0',tva='0',adresse='0',ville='0',telephone='0',mail='0',codeclient='0',datedelocation='0',lieudelocation='0',soltype='0',aidant='0',bachelaterale='0',article1='0',article2='0',article3='0',article4='0',article5='0',article6='0',article7='0',article8='0',article9='0',article10='0',article11='0',article12='0',article13='0',article14='0',article15='0',article16='0',article17='0',article18='0',article19='0',article20='0',aprix1='0',aprix2='0',aprix3='0',aprix4='0',aprix5='0',aprix6='0',aprix7='0',aprix8='0',aprix9='0',aprix10='0',aprix11='0',aprix12='0',aprix13='0',aprix14='0',aprix15='0',aprix16='0',aprix17='0',aprix18='0',aprix19='0',aprix20='0',prix1='0',prix2='0',prix3='0',prix4='0',prix5='0',prix6='0',prix7='0',prix8='0',prix9='0',prix10='0',prix11='0',prix12='0',prix13='0',prix14='0',prix15='0',prix16='0',prix17='0',prix18='0',prix19='0',prix20='0',aremise1='0',aremise2='0',aremise3='0',aremise4='0',aremise5='0',aremise6='0',aremise7='0',aremise8='0',aremise9='0',aremise10='0',aremise11='0',aremise12='0',aremise13='0',aremise14='0',aremise15='0',aremise16='0',aremise17='0',aremise18='0',aremise19='0',aremise20='0',remise1='0',remise2='0',remise3='0',remise4='0',remise5='0',remise6='0',remise7='0',remise8='0',remise9='0',remise10='0',remise11='0',remise12='0',remise13='0',remise14='0',remise15='0',remise16='0',remise17='0',remise18='0',remise19='0',remise20='0',nbrarticle1='0',nbrarticle2='0',nbrarticle3='0',nbrarticle4='0',nbrarticle5='0',nbrarticle6='0',nbrarticle7='0',nbrarticle8='0',nbrarticle9='0',nbrarticle10='0',nbrarticle11='0',nbrarticle12='0',nbrarticle13='0',nbrarticle14='0',nbrarticle15='0',nbrarticle16='0',nbrarticle17='0',nbrarticle18='0',nbrarticle19='0',nbrarticle20='0' WHERE id=4

J'ai bien toute les colonnes affiches, 137 colonnes (136 de données et 1 pour l'id) . J'ai fait une erreur quelque part? Je ne trouve pas

J'ai de nouveau fait quelques test car ca me perturbe cette erreur qui n'a pas de sens.

En fait, il n'y a pas erreur, j'ai fait le teste de supprimer des colonnes dans la bdd et la ca fonctionne, ca fonctionne jusqu'à 127 colonnes, au délà ça provoque une erreur. Je sais pas la raison, quelqu'un peut m'aiguiller?

Je suis entrain de faire un monologue ^^ mais c'est bon j'ai trouve une solution je fais la requete en deux fois et ca roule

Tu peux faire un monologue si tu veux, en attendant il vaudrait mieux structurer ta base correctement :

* une table 'Clients' :

Id, contrat, civilite, nom, prenom, societe, tva, adresse, ville, telephone, mail, codeclient

* une table 'Locations' :

Id, Id_client, datedelocation, lieudelocation, soltype, aidant, bachelaterale

* une table 'Articles' :

Id, Id_client, article, aprix, prix, aremise, remise, nbrarticle

* et des requêtes avec jointure sur l'Id_client

Ce qui te permet d'avoir plusieurs locations pour un client et plusieurs articles pour une location, sans répéter plusieurs fois les même info.

Revoie tes cours sur les bases de données!

Rechercher des sujets similaires à "ajout ligne table access"