Insérer valeur multi cellules excel dans Access avec formulaire

simon7339 Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   -  
simon7339 Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

Je bloque sur un problème de lien entre excel et access.

Le but est d'insérer un document excel dans une table Access.

Name = MySheet.Range("A1").Value
Nom = MySheet.Range("B3").Value
Age = MySheet.Range("B4").Value
PostCode = MySheet.Range("D4").Value
Ville = MySheet.Range("F4").Value
 
cSQL = "insert into [Simon] ( [champ1], [champ2], [champ3], [champ4], [champ5]  ) values (" & Chr(34) & Name & Chr(34) & ", " & Chr(34) & Nom & Chr(34) & "," & Chr(34) & Age & Chr(34) & "," & Chr(34) & PostCode & Chr(34) & "," & Chr(34) & Ville & Chr(34) & ");"

DoCmd.RunSQL cSQL


Dans mon fichier excel j'ai des valeurs dans plusieurs cellules éparpillées.

Le code ci-dessus fonctionne mais sachant que j'ai une vingtaine de cellules à insérer je le trouve un peu barbare.

Est-ce que quelqu'un aurait une piste à me donner sur une autre façon de faire?

Merci d'avance pour votre aide.
A voir également:

6 réponses

Zawarudio Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   1
 
Nous manquons cruellement d'informations sur le formatage de ton excel.
Première chose, pour te simplifier la vie à la lecture de ta requête SQL, je te conseille de formatter directement pour le SQL tes valeurs :


Name = "'" & MySheet.Range("A1").Value & "'"
Nom = chr(34) & MySheet.Range("B3").Value & chr(34)
ect...

Tu auras beaucoup moins de mal à relire ta requête SQL, simplement avec ces économies de taille.
Dans la même optique, je te conseille de mettre des retours à la ligne dans ta requête.

cSQL = "insert into [Simon] ( [champ1], [champ2], [champ3], [champ4], [champ5] )" & _
"values (" & Chr(34) & Name & Chr(34) & ", " & Chr(34) & Nom & Chr(34) & "," & Chr(34) & Age & Chr(34) & "," & Chr(34) & PostCode & Chr(34) & "," & Chr(34) & Ville & Chr(34) & ");"




Quant à ta question, tu peut utiliser des array par exemple

Dim i as integer
Dim MyArray() as String

'remplissage de MyArray
'...

cSQL = "insert into [Simon] ( [champ1], [champ2], [champ3], [champ4], [champ5] ) values ("

for i = 0 to Ubound(MyArray)
cSQL = cSQL & chr(34) & MyArray(i) & "', "
next i
cSQL = left(cSQL, Len(cSQL) - 2) & ");"
DoCmd.RunSQL cSQL


PS: J'ai écrit ce code directement ici, je n'ai pas testé, donc il se peut qu'il y ai des erreurs.
C'était juste pour donner une idée
0
simon7339 Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour Zawarudio,

Merci pour ta réponse, en effet en allant à la ligne le code devient plus clair.

Si jamais tu as le temps pourrais-tu me détailler un peu plus la méthode de l'array. Je n'ai jamais utilisé cette façon de coder.

Je chercher parallèlement sur internet pour comprendre.

Encore merci
0
Zawarudio Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   1
 
C'est simple en réalité : au lien d'avoir plusieurs dims, tu as un tableau de dim.


'Plusieurs dims
Dim a, b, c, d, e, aDim, anotherDim as String
a = "1"
b = "2"
c = "3"

'Un seul dim qui est un tableau
Dim tab() as String
tab(0) = "1"
tab(1) = "2"
tab(2) = "3"

Dim i as integer
i = 3
tab(i) = "4"


Comme montré sur les trois dernières lignes, tu peut utiliser un integer pour accéder à ta valeur de tableau, donc tu peut boucler dessus.


Dim tab() as String
Dim compteur as integer

'on remplis le tableau
for compteur = 0 to 10
tab(compteur) = "compteur n°" & compteur
next compteur

'on accède au tableau
for compteur = 0 to 10
msgbox tab(compteur)
next compteur


Ma proposition dans mon poste précédent était simplement de faire du traitement de chaine de caractère en utilisant ce principe :


'On commence par initialiser la valeur cSQL
cSQL = "insert into [Simon] ( [champ1], [champ2], [champ3], [champ4], [champ5] ) values ("
'A partir de ce string, on va concaténer pour rajouter les valeurs qu'on veut insert

'Ubound(MyArray) renvoie vers la dimension de ton tableau dans le cas ou ton tableau est à une dimension (CAD tab(ligne) et pas tab(ligne)(colonne))
'Donc, on boucle de 0 à la fin de ton tableau
for i = 0 to Ubound(MyArray)
'avec cette ligne, on dit que cSQL est égal à la concaténation de la valeur précédente de cSQL avec la valeur de MyArray et enfin le string "', " (qui est la virgule après une valeur de INSERT into x (a, b) VALUE (c, d);
cSQL = cSQL & chr(34) & MyArray(i) & "', "
next i

'Cependant, quand on arrive ici, ca signifie qu'on a
' "INSERT INTO x(a,b) VALUES ('c', 'd', "
'On retire donc les deux derniers caractères du string, et on y rajoute la parenthèse et le point virgule qui est la fin de ta requête SQL
cSQL = left(cSQL, Len(cSQL) - 2) & ");"
0
simon7339 Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   1
 
Salut, merci à toi je comprends un peu mieux.

Suite à tes conseils j'ai fait quelque chose comme ça :

Option Compare Database

Private Sub Commande1_Click()

Dim oApp As Excel.Application
Dim oWkb As Excel.Workbook
Dim oWSht As Excel.Worksheet


Dim Filename As String
Dim NomTableau As Variant
Dim i As Integer
    
Filename = OpenFile()
 
Set MyExcel = CreateObject("excel.application")
Set MyFile = MyExcel.Workbooks.Open(Filename)
'Set MyFile = Filename
Set MySheet = MyFile.Sheets("Feuil1")


DoCmd.SetWarnings False

NomTableau = Array(Range("A1").Value, Range("C2").Value, Range("B3").Value)
 
 
cSQL = "insert into [Simon] ( [champ1], [champ2], [champ3]  ) values ("

For i = 0 To 2
    
   
cSQL = cSQL & Chr(34) & NomTableau(i) & "', "
'cSQL = cSQL & Chr(34) & NomTableau(i) & "', "
    Next i
    
cSQL = Left(cSQL, Len(cSQL) - 2) & ");"

DoCmd.RunSQL cSQL
 
 
DoCmd.SetWarnings True
Set oWSht = Nothing
Set oWbk = Nothing
Set oApp = Nothing
End Sub

Function OpenFile() As String

    Dim Finput As FileDialog
    Set Finput = Application.FileDialog(msoFileDialogOpen)
    Finput.Show
    OpenFile = Finput.SelectedItems(1)
End Function


Le problème c'est qu'il me met " erreur de syntaxe (opérateur absent) dans l'expression". Je suis pas très familier avec la syntaxe de SQL. Tu vois où ça pèche?

En tout cas merci j'avance un peu grâce à toi
0
simon7339 Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   1
 
Je viens de trouver, il fallait en faite mettre

cSQL = cSQL & Chr(34) & NomTableau(i) & Chr(34) & " , "
0
Zawarudio Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   1
 
C'est peut être du à une erreur d'inattention... Je ne vois pas ce qui pose problème dans ton code non plus.

Quand j'ai un problème similaire, je fais un msgbox de mon cSQL avant de l'exécuter pour vérifier à l'oeil que tout va bien. (note qu'il n'y aura pas d'espace, donc ça sera moche)
Si en faisant un msgbox de ton cSQL tu ne vois pas d'erreur évidente, écris ta variable cSQL dans une case excel, récupère ton cSQL et teste la requête directement dans ta base de données.
0
simon7339 Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   1 > Zawarudio Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour le conseil, c'est vrai que c'est subtile comme syntaxe mais très intéressant.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
simon7339 Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   1
 
Enfaite j'ai encore un problème ahahaha.

Le code fonctionne pour importer un fichier xlsx mais pas un fichier xlsm.

Dois-je le signaler dans le code?

Merci d'avance
0
Zawarudio Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   1
 
Alors la je sêche...
le format d'un fichier n'impacte pas le fonctionnement de la macro, mais peut être que tu ne va pas chercher dans le bon classeur ou la bonne page.

Si tu poste le code, avec la ligne renvoie l'erreur, ainsi que l'erreur renvoyée, je pourrais peut être t'aider.
0
simon7339 Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour Zawarudio,

En effet tu as raison c'était une erreur de ma part sur le nom de la feuille...


Il y'a autre chose qui me chagrine, dès que j'upload le fichier excel dans Access, ce dernier devient "un fichier en cours d'utilisation" dès que je veux l'ouvrir indépendamment de la macro.

Comme si après l'upload il restait "en attente".

C'est pas très grave mais j'aimerais bien comprendre d'où ça peut venir et ce qui se passe au niveau informatique.

Est-ce que tu vois ce dont je parle?

Encore merci c'est cool que tu m'aides comme ça
0
Zawarudio Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   1
 
La seule chose qui me viens à l'idée, si tu exécutes ta macro depuis access pour aller chercher dans les Excel.

Bien penser à faire à la fin de la macro

Sub test
Dim xl as Excel.Application
Dim wb as Excel.Workbook

'le code

wb.Close
Set wb = nothing
xl.Exit
set xl = nothing
End Sub


Sinon, je ne sais pas

Et tant que j'y suis, comment formattes tu ton code pour avoir la ligne/un truc beau?
La balise <'code><'/code> renvoie un truc beaucoup plus moche que ce que vous faites, et il ne semble pas avoir de formattage vb pour cette même balise
0
simon7339 Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   1 > Zawarudio Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour ton retour, je vais essayer ça.

J'utilise la balise : code basic></code
0