Ajout ligne table dans Access

Y compris Power BI, Power Query et toute autre question en lien avec Excel
b
boulezor
Jeune membre
Jeune membre
Messages : 49
Inscrit le : 14 juin 2012
Version d'Excel : 2010

Message par boulezor » 15 février 2018, 16:18

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?
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'149
Appréciations reçues : 187
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 15 février 2018, 16:51

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!
b
boulezor
Jeune membre
Jeune membre
Messages : 49
Inscrit le : 14 juin 2012
Version d'Excel : 2010

Message par boulezor » 20 février 2018, 15:08

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
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'149
Appréciations reçues : 187
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 20 février 2018, 16:47

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
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
b
boulezor
Jeune membre
Jeune membre
Messages : 49
Inscrit le : 14 juin 2012
Version d'Excel : 2010

Message par boulezor » 20 février 2018, 17:23

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

Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'149
Appréciations reçues : 187
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 20 février 2018, 17:32

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
b
boulezor
Jeune membre
Jeune membre
Messages : 49
Inscrit le : 14 juin 2012
Version d'Excel : 2010

Message par boulezor » 20 février 2018, 20:55

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 :)
b
boulezor
Jeune membre
Jeune membre
Messages : 49
Inscrit le : 14 juin 2012
Version d'Excel : 2010

Message par boulezor » 21 février 2018, 11:55

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 :)
b
boulezor
Jeune membre
Jeune membre
Messages : 49
Inscrit le : 14 juin 2012
Version d'Excel : 2010

Message par boulezor » 21 février 2018, 16:30

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 ?
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'149
Appréciations reçues : 187
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 21 février 2018, 17:44

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 ...
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message