IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Importer fichier CSV vers MYSQL en VBA Excel [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut Importer fichier CSV vers MYSQL en VBA Excel
    Bonjour,

    Je suis totalement novice en VBA donc faudra être surement patient avec moi ^^'

    J'ai déjà réalisé une petite macro pour créer un fichier CSV à partir d'un fichier excel et maintenant j'aimerai importé ce fichier CSV sur ma base de donnée MYSQL dans la database "test_data" et dans ma table "test_table".

    J'ai fais des recherches et j'ai trouvé qu'il fallait utiliser la commande: DoCmd.TransferDatabase
    Par contre je ne comprends pas comment on l'utilise :/

    Merci par avance de votre aide

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Si tu as une base MySQL tu peux utiliser du SQL donc utiliser cette commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    USE test_data
     
    LOAD DATA LOCAL INFILE 'c:\Fichier.csvr'  INTO TABLE test_table 
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'  
    LINES TERMINATED BY "\r\n"  
    IGNORE  1 LINES
    Si tu veux lancer l'import via un fichier excel c'est différent il faut ouvrir une connexion avec MySQL et exécuter le code que je t'ai fournis

    T.

  3. #3
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Justement je veux exécuter l'import via mon fichier excel grâce à une macro

    Comment on ouvre une connexion à Mysql via la macro et d’exécuter ton code par exemple?

  4. #4
    Invité
    Invité(e)
    Par défaut Bonjour,
    DoCmd.TransferDatabase est une instruction ACCESS vba!
    tu exporte EXCEL vers CSV puis tu veux iporter CSV dans mySql???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Sub test()
    Dim Connexion_MySql As New ADODBRD
    Dim Sql As String
    Dim Sql2 As String
    Dim R As Range
    Dim L As Long
    '1 - ODBC
    '2 - ORACLE
    '3 - ACCESS 2012
    '4 - ACCESS 2000
    '5 - ACCESS 97
    '6 - SQL SERVER
    '7 - SQL SERVER 2005 Express
    '9 - SQLite
    '10 - SQLite3
    '11 - Mysql
    Connexion_MySql.TYPEBASE = 11
    Connexion_MySql.BASE = "LaposteAvance"
    Connexion_MySql.Server = "localhost"
    Connexion_MySql.User = "root"
    Connexion_MySql.PassWord = "123456789"
    Connexion_MySql.OpenConnetion
     
    Sql = "INSERT INTO `codepostal` (`codePostalCP`,`Ville`) VALUES " & vbCrLf
    Set R = ActiveSheet.UsedRange
    For L = 2 To R.Rows.Count
    If Sql2 = "" Then
     Sql2 = "('" & R(L, 1) & "','" & R(L, 1) & "')" & vbCrLf
     Else
     Sql2 = Sql2 & ",('" & R(L, 1) & "','" & R(L, 1) & "')" & vbCrLf
     End If
    Next
    Sql = Sql & Sql2 & ";"
    Connexion_MySql.Execute Sql
    End Sub

    Code module de classe ADODBRD : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    Private Connexion
    Public TYPEBASE
    Public BASE
    Public Server
    Public Fichier
    Public User
    Public PassWord
     
    Private Function GenereCSTRING()
    'Permet de générer le Cornec String
    '1 - ODBC
    '2 - ORACLE
    '3 - ACCESS 2012
    '4 - ACCESS 2000
    '5 - ACCESS 97
    '6 - SQL SERVER
    '7 - SQL SERVER 2005 Express
    '9 - SQLite
    '10 - SQLite3
    '11 - Mysql
    If Trim("" & Fichier) = "" Then Fichier = BASE
     
    Select Case TYPEBASE
        Case 1
            GenereCSTRING = "Provider=MSDASQL.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Data Source=" & BASE
        Case 2
            GenereCSTRING = "Provider=OraOLEDB.Oracle.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Data Source=" & BASE
     
        Case 3
            GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier & ";"
     
        Case 4
            GenereCSTRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Fichier & ";Persist Security Info=False"
        Case 5
            GenereCSTRING = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & Fichier
        Case 6
                GenereCSTRING = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Fichier
               ' GenereCSTRING = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Fichier & ";user=" & User & ";Passwors=" & PassWord
        Case 7
            GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Initial Catalog=" & BASE & ";Data Source=" & Server
        Case 8
            GenereCSTRING = "Provider=SQLNCLI.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Initial Catalog=" & BASE & ";Data Source=" & Server
        Case 9
            GenereCSTRING = "Provider=OleSQLite.SQLiteSource.3; Data Source=" & Fichier
     
            GenereCSTRING = "Driver={SQLite ODBC (UTF-8) Driver};Database=" & Fichier & ";StepAPI=;Timeout="
        Case 10
            GenereCSTRING = "Driver={SQLite3 ODBC Driver};Database=" & Fichier & ";LongNames=0;Timeout=4000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;"
        Case 11
            GenereCSTRING = " DRIVER={MySQL ODBC 5.1 Driver};SERVER=" & Server & ";UID=" & User & ";DATABASE=" & BASE & ";Password=" & PassWord
        Case Else
            GenereCSTRING = "PAS ASSEZ DE PARAMETRES RENSEIGNES !!!"
     
     
    End Select
    ''MsgBox GenereCSTRING
    'Response.End
    End Function
     
     
    Public Function OpenConnetion()
    'Ouvre une connexion à  la base de données.
    'Dim Fso As New Scripting.FileSystemObject
        OpenConnetion = False
        On Error Resume Next
        Dim ConnecString
     
         Dim NbErr
     
        Set Connexion = CreateObject("ADODB.Connection")
        Connexion.Open GenereCSTRING
    'ConnecString
     
        If Err = 0 Then
     
            OpenConnetion = True
           Connexion.CommandTimeout = 14400
        Else
      MsgBox Err.Description
     
        End If
    '    Debug.Print Err.Description
        Err.Clear
        On Error GoTo 0
    End Function
     
     
    Public Function CloseConnection()
    'Referme la connexion
    CloseConnection = False
    On Error Resume Next
        Connexion.Close
        Set Connexion = Nothing
         If Err = 0 Then
            CloseConnection = True
        End If
        Err.Clear
        On Error GoTo 0
    End Function
     
     
    Public Function OpenRecordSet(Sql)
    'Retourne un RecordeSet
    On Error Resume Next
        Dim Rs
    Dim NbErr
     
    Err.Clear
    If Connexion.State = 0 Then
        OpenConnetion
    End If
    'Debug.Print Sql 'Replace(Sql, "%", "*")
        Set OpenRecordSet = CreateObject("ADODB.Recordset")
     
       ' OpenRecordSet.LockType = adLockOptimistic
        ''MsgBox  adLockOptimistic & vbcrlf & Err.Description
        Debug.Print Sql
        OpenRecordSet.Open Sql, Connexion, 1, 3
     
        If Err Then
       MsgBox Err.Description
     
        NbErr = NbErr + 1
            If NbErr < 11 Then
     
                Set OpenRecordSet = Nothing
     
     
            End If
     
        End If
        Err.Clear
     
    End Function
    Public Function RetournConnection()
    Set RetournConnection = Connexion
    End Function
    Public Function OpenRecordSetParametre(Sql, Param)
    Dim Commande
    Dim Params
    Set Commande = CreateObject("ADODB.Command")
    Dim MyParameter
    Set MyParameter = CreateObject("ADODB.Parameter")
    Set Commande.ActiveConnection = Connexion
    Commande.CommandText = "select Requête2.* from Requête2;"
     Commande.CommandType = adCmdText
     
     Set MyParameter = Commande.CreateParameter("[NumJob]", adNumeric)
             MyParameter.Value = 10
    Commande.Parameters.Append MyParameter
     
     
     
    'aa.Parameters.Append("MyRef") = "243410M660"
    Set Rs2 = Commande.Execute
     
    End Function
    Public Function CloseRecordSet(Rs)
    On Error Resume Next
        Rs.Close
        Set CloseRecordSet = Nothing
    End Function
    Public Function Execute(Sql)
        Execute = False
        On Error Resume Next
        Dim NbErr
    Reprise:
    If Connexion.State = 0 Then
        OpenConnetion
    End If
    Debug.Print Sql
        Connexion.Execute Sql
        If Err = 0 Then
            Execute = True
     
     
     
     
    '     Else
    '    'MsgBox Err.Description
    '         Err.Clear
    '    NbErr = NbErr + 1
    '    If NbErr < 11 Then
    '
    '        GoTo Reprise
    '    End If
    Else
        MsgBox Err.Description
        End If
     
        Err.Clear
     
    End Function
    Dernière modification par AlainTech ; 28/06/2014 à 11h01. Motif: Suppression de la citation inutile

  5. #5
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Oui je créais un CSV avec ma macro Excel déjà (macro que j'ai déjà réalisée).
    Ce que j'aimerai ensuite, se serait de pouvoir importer ce fichier CSV dans ma base Mysql avec ma macro déjà réalisée pour avoir qu'un seul bouton à appuyer.

    Merci rdurupt pour les codes mais lorsque que je copie le premier, celui-ci ne fonctionne pas (bien sûr j'ai préalablement modifier les informations pour rentrer dans ma base). Pour le second code, je ne comprends pas à quoi il sert et où faut-il le mettre :/

  6. #6
    Invité
    Invité(e)
    Par défaut
    dans 1 module standard copy sub test
    dans un module de classe copy ADODBRD (menu->insertion->module de classe ) puis renomme le
    mysql ne fourni pas le driver. télécharge mysql-connector-odbc-5.1.8-win32.msi
    Images attachées Images attachées  
    Dernière modification par AlainTech ; 28/06/2014 à 11h03. Motif: Suppression de la citation inutile

  7. #7
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Merci de ton aide rdurupt

    J'ai bien inséré ton premier code en supprimant le "Sub" pour l'intégrer dans ma macro:
    Nom : code1.gif
Affichages : 2767
Taille : 44,4 Ko

    Ainsi que ton deuxième code et le driver Mysql:
    Nom : adodbrd.gif
Affichages : 2611
Taille : 17,4 Ko

    Par contre, quand je lance la macro j'ai ce message d'erreur lorsqu'il arrive à ton code pour Mysql:
    Nom : message_erreur.gif
Affichages : 2387
Taille : 3,9 Ko

    A mon avis, c'est parce qu'il faut importer le fichier csv dans Mysql en Load Data parce que j'ai le bon nombre de colonnes dans Mysql et dans mon fichier csv:
    Nom : csv.gif
Affichages : 2283
Taille : 2,4 Ko

    Comment je peux ajouter cette option pour pouvoir l'importer?

  8. #8
    Invité
    Invité(e)
    Par défaut
    non tu as plus de champ dans sql que dans sql2.
    il faut entre les valeurs pour chaque champ dans sql je vois insert into et au moins 10 champs et dans sql2 je ne vois que 2 valeur du tableau EXCEL!

  9. #9
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Autant pour moi, je n'avais pas compris qu'il fallait aussi mettre autant de champs dans sql2 que dans sql ^^""

    Tout s’exécute sans bug mais ce qui a été inséré dans ma base sql correspond à la première colonne ou la première case de chaque ligne du fichier csv c'est à dire que des "*" au lieu des cases correspondantes:

    Code:
    Nom : code.gif
Affichages : 2511
Taille : 4,8 Ko

    Fichier CSV:
    Nom : csv.gif
Affichages : 2491
Taille : 6,7 Ko

    Mysql:
    Nom : mysql.gif
Affichages : 2474
Taille : 13,1 Ko

    J'ai bien essayé de mettre "1,2,3,4,5..." à la place des 1 dans sql2 mais sans succès :/

  10. #10
    Invité
    Invité(e)
    Par défaut
    r(L,1) l reprisent la ligne de ton Compteur & 1 la colonne. désolé dans mon exemple j'avais mis r(L,1) partout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For L = 2 To R.Rows.Count 
    If Sql2 = "" Then
    ' R(L, 1) A2, A3 A4...
    ' R(L, 2) B2,B3 B4...
     Sql2 = "('" & R(L, 1) & "','" & R(L, 2) & "')" & vbCrLf
     Else
     Sql2 = Sql2 & ",('" & R(L, 1) & "','" & R(L, 2) & "')" & vbCrLf
     End If
    Next

  11. #11
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Merci de ton aide précieuse

    Une dernière question, dans mon csv, j'ai des dates au format AAAA/MM/JJ. Je lance la macro, tout se passe bien sans bug.
    Mais lorsque je regarder ma BDD les colonnes avec mes dates sont remplies par défaut 0000-00-00.

    Pourquoi quelle raison la macro ne m'importe pas les dates comme pour les autres colonnes (int, text...)?

  12. #12
    Invité
    Invité(e)
    Par défaut
    parce que les dates dans tous les systèmes sont au format yyyy-mm-dd c'est les paramètres régionaux qui fixe le format dd/mm/yyyy
    dans ta requête tu dois fixer le bon format!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sql2=("'" & format(date,"yyyy-mm-dd") & "'",....
    'ou plus exactement
    sql2=("'" & format(r(l,1),"yyyy-mm-dd") & "'",....
    enfin le r(l,X) qui corespond à ton champ

  13. #13
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Je te remercie de ton aide !
    Tout fonctionne lors de l'import

    Une dernière petite question, si ce n'est pas indiscret, tu es développeur spécialiste en VBA?

  14. #14
    Invité
    Invité(e)
    Par défaut
    oui et non , regardes sous la photo de Raphaël Mezrahi
    Dernière modification par AlainTech ; 28/06/2014 à 11h19. Motif: Suppression de la citation inutile

  15. #15
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Certes mais c'était pour avoir un peu plus d'infos

    Merci encore pour avoir prit du temps pour moi ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. import d'un fichier .csv vers Mysql
    Par katebe dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 18/10/2009, 22h31
  2. importation fichier csv vers mysql par php
    Par frboyer dans le forum Langage
    Réponses: 4
    Dernier message: 26/05/2009, 09h21
  3. Importation d'un fichier .csv vers MySQL
    Par xenos dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/08/2007, 10h19
  4. Importation fichier plat vers Mysql
    Par xender dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/05/2006, 22h36
  5. [Conseil] Import de fichier CSV vers MySQL
    Par ShinJava dans le forum JDBC
    Réponses: 6
    Dernier message: 15/03/2005, 19h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo