Macro dynamique

Résolu
senecartour Messages postés 391 Statut Membre -  
senecartour Messages postés 391 Statut Membre -
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

--
Partager son savoir est la meilleure façon d'apprendre!

2 réponses

  1. Frenchie83 Messages postés 2254 Statut Membre 339
     
    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
    1. senecartour Messages postés 391 Statut Membre 3
       
      Bonjour Franchie83,
      Merci beaucoup, c'est exactement ce que je voulais.
      Merci et bon fin de WE.
      0
    2. senecartour Messages postés 391 Statut Membre 3
       
      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
  2. Frenchie83 Messages postés 2254 Statut Membre 339
     
    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
    1. senecartour Messages postés 391 Statut Membre 3
       
      Bonjour Franchie83,
      Je vais tester et reviens vers vous dès que possible.
      Merci encore pour votre disponibilité.
      0