Macro dynamique

Résolu/Fermé
senecartour Messages postés 325 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 - 19 nov. 2015 à 21:31
senecartour Messages postés 325 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 - 26 nov. 2015 à 15:13
Bonjour,

J'intègre régulièrement des données contenues dans des tables Excel dans la base sql.

Pour chaque base de données, je suis obligé de faire le traitement des données pour pouvoir faire des inert dans sql.

J'ai réussi, à faire une première macro qui transforme mes données prêtes à être insérées dans la base. Mais je me rends compte que mon code n'est pas très flexible dans la mesure où je suis obligé de le mettre à jour à chaque fois que j'ajoute une colonne dans mes données Excel.

Mon souhait, c'est que la macro soit dynamique, c'est à dire s'adapter par rapport au nombre de colonnes et lignes de ma tables Excel.

Par exemple, si j'ajoute dans ma table Excel, des colonnes "POPULATION", "MONNAIE" avec des données, ma macro doit tenir en compte ces données dans la conversion des données.

Je vous joins en pièce jointe la première version de mon fichier avec la macro
https://www.cjoint.com/c/EKtuERyQYuG

Merci d'avance
A voir également:

2 réponses

Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
22 nov. 2015 à 09:04
Bonjour
Ceci peut-être
Sub Insertion()
    Dim DerLi, DerCo As Integer
    DerLi = ThisWorkbook.Sheets("Donnees Excel").Range("A" & Rows.Count).End(xlUp).Row
    DerCo = ThisWorkbook.Sheets("Donnees Excel").Range("A2").End(xlToRight).Column
    sep = ","
    Champs1 = ""
    For i = 1 To DerCo
        If Cells(1, i + 1) = "" Then Exit For
        Champs1 = Champs1 & sep & Cells(1, i + 1)
    Next i
    Champs1 = Right(Champs1, Len(Champs1) - 1)
    
    Champs2 = ""
    For i = 1 To DerCo
        Champs2 = Champs2 & sep & Cells(2, i)
    Next i
    Champs2 = Right(Champs2, Len(Champs2) - 1)
    
    Valeurs = ""
    ReDim Valeur(DerLi, DerCo) As String
    For i = 3 To DerLi
        For j = 1 To DerCo
            Valeur(i, j) = Cells(i, j)
            Valeurs = Valeurs & sep & Valeur(i, j)
        Next j
        Valeurs = Right(Valeurs, Len(Valeurs) - 1)
        Sheets("Donnees sql").Cells(i, 1).Value = "INSERT INTO " & Champs1 & " (" & Champs2 & ")" & " VALUES" & " ('" & Valeurs & "');"
        Valeurs = ""
    Next i
    
    MsgBox ("Vos données ont été converties au format sql")
    Sheets("Donnees sql").Select
End Sub
Cdlt
0
senecartour Messages postés 325 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
22 nov. 2015 à 13:41
Bonjour Franchie83,
Merci beaucoup, c'est exactement ce que je voulais.
Merci et bon fin de WE.
0
senecartour Messages postés 325 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
24 nov. 2015 à 21:30
Bonsoir Franchie83,
J'ai essayé d'insérer les données en base mais il reste quelques détails à ajouter dans la macro pour que les données puissent s'intégrer.

En effet deux choses sont à prendre en compte:
-Au niveau de la partie Value, les données doivent aussi être entourées par des ' '.
-Lorsqu'on a une apostrophe dans, on doit remplacer l'apostrophe par deux cotes ''.

Voici l'exemple de résultat attendu:
INSERT INTO PAYS (Pays,Capital,Population,Entrprise,CA) VALUES ('France','Paris','60000000','L''OREAL,20');
INSERT INTO ASSET (Pays,Capital,Population,Entrprise,CA) VALUES ('Allemagne','Berlin','70000000','L''ESCO,34');

Je vous joins également, le fichier avec la macro et l'exemple du résultat attendu.
https://www.cjoint.com/c/EKyuEqg1fuG
Je vous serais très reconnaissant si vous voulez bien m'aider à résoudre le problème.
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
25 nov. 2015 à 05:53
Bonjour
Dans votre exemple, la dernière valeur ne devrait-elle pas être entourée d'apostrophe elle aussi?
Sub Insertion()
    Dim DerLi, DerCo As Integer
    DerLi = ThisWorkbook.Sheets("Donnees Excel").Range("A" & Rows.Count).End(xlUp).Row
    DerCo = ThisWorkbook.Sheets("Donnees Excel").Range("A2").End(xlToRight).Column
    sep = ","
    Champs1 = ""
    For i = 1 To DerCo
        If Cells(1, i + 1) = "" Then Exit For
        Champs1 = Champs1 & sep & Cells(1, i + 1)
    Next i
    Champs1 = Right(Champs1, Len(Champs1) - 1)
    
    Champs2 = ""
    For i = 1 To DerCo
        Champs2 = Champs2 & sep & Cells(2, i)
    Next i
    Champs2 = Right(Champs2, Len(Champs2) - 1)
    
    Valeurs = ""
    ReDim Valeur(DerLi, DerCo) As String
    For i = 3 To DerLi
        For j = 1 To DerCo
            Valeurs = Valeurs & sep & "'" & Replace(Cells(i, j), "'", """") & "'"
        Next j
        Valeurs = Right(Valeurs, Len(Valeurs) - 1)
        Sheets("Donnees sql").Cells(i, 1).Value = "INSERT INTO " & Champs1 & " (" & Champs2 & ")" & " VALUES" & " (" & Valeurs & ");"
        Valeurs = ""
    Next i
    
    MsgBox ("Vos données ont été converties au format sql")
    Sheets("Donnees sql").Select
End Sub

A tester
Cdlt
0
senecartour Messages postés 325 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
26 nov. 2015 à 15:13
Bonjour Franchie83,
Je vais tester et reviens vers vous dès que possible.
Merci encore pour votre disponibilité.
0