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

VBA Access Discussion :

importer des données d'excel vers access


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut importer des données d'excel vers access
    Bonjour à tous,

    Je vais tenter de vous expliquer brievement mon probleme:
    J'ai créé 3 tables ACCESS dans lesquelles je veux rapatrier automatiquement les données de mes tables excel.

    Mes tables ACCESS sont: prodution globale, production par onduleur 1 à 8, production par onduleur 9 à 16 et production de tous les onduleurs.

    Deux appareils me renvoient des données journalieres (donc deux dossiers à aller parcourir) et sur ces fichiers excel, je veux etre capable de selectionner les lignes et colonnes à rapatrier sur mes tablmes ACCESS. De plus, deux colonnes sont crées dans ACCESS: la premiere m'indique l'appareil qui a renvoyé le resultat et le second une colonne avec la date ( à aller cherche parmi le titre du doc excel).

    Après de nombreuses recherches sur le net, j'ai trouvé un début de code que j'ai commencé à programmer.


    Si qqn qi a un peu de temps ici pouvait regardait et tenter de m'aider car c'est un travail d'entreprise!

    Par avance merci à celui qui pourra me venir en aide car les aides sont assez limitées pour un tel problème!!


    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
    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
    Sub Module1()
    'Ici l'importation se déclenche en cliquant sur le bouton "Commande1"
    'mais on peut aussi mettre ce code à l'ouverture d'un formulaire
    Dim oApp As Excel.Application
    Dim oWkb As Excel.Workbook
    Dim oWSht As Excel.Worksheet
     
    Set oApp = CreateObject("excel.application")
    Set oWkb = oApp.Workbooks.Open("C:\Users\toshiba\Desktop\EXCEL_DD_20090127") 'mettez ici le chemin vers votre fichier Excel
    Set oWSht = oWkb.Worksheets("EXCEL_DD_20090") 'mettez ici le nom de la feuille qui contient les données à importer
     
    'première ligne ou commence l'import
    i = 289
     
    'pour éviter les messages lors de l'ajout des enregistrements
    DoCmd.SetWarnings False
     
    'on arrête l'importation lorsque le programme rencontre une case
    'vide :
    'While oWSht.Range("B" & 2517).Value <> "" '(où B représente la colonne et 2517 la ligne)
     
    'condition de remplissage de la table => eviter les doublons
    'si l'enregistrement existe déjà dans la table destination,
    'on passe à la ligne suivante sans l'importer
    'If DCount("*", "[Prod_globale]", "[nom_du_champ_destination_qui_ne_doit_pas_avoir_de_doublons] LIKE '" & oWSht.Cells(i, 9) & "'") = 0 Then
    'le numéro 9 correspond au numéro de la colonne source, tel que : A=1, B=2, C=3 ...
     
    'requète SQL (avec en paramètre la ligne i et le numéro de la colonne comme précisé au-dessus)
    cSQL = "insert into [Prod_globale] ( [Energrid])values(" & Chr(34) & oWSht.Cells(i, 1) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Jour])values(" & Chr(34) & oWSht.Cells(i, 1) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Heure])values(" & Chr(34) & oWSht.Cells(i, 1) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pprod])values(" & Chr(34) & oWSht.Cells(i, 2) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pcons])values(" & Chr(34) & oWSht.Cells(i, 3) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Ppc])values(" & Chr(34) & oWSht.Cells(i, 4) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pinj])values(" & Chr(34) & oWSht.Cells(i, 5) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pabs])values(" & Chr(34) & oWSht.Cells(i, 6) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pc1])values(" & Chr(34) & oWSht.Cells(i, 7) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pc2])values(" & Chr(34) & oWSht.Cells(i, 8) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pc3])values(" & Chr(34) & oWSht.Cells(i, 9) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pc4])values(" & Chr(34) & oWSht.Cells(i, 10) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pa])values(" & Chr(34) & oWSht.Cells(i, 11) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Psi])values(" & Chr(34) & oWSht.Cells(i, 12) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Pso])values(" & Chr(34) & oWSht.Cells(i, 13) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Ia])values(" & Chr(34) & oWSht.Cells(i, 14) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Isi])values(" & Chr(34) & oWSht.Cells(i, 15) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Iso])values(" & Chr(34) & oWSht.Cells(i, 16) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Va])values(" & Chr(34) & oWSht.Cells(i, 17) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Vs])values(" & Chr(34) & oWSht.Cells(i, 18) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [T1])values(" & Chr(34) & oWSht.Cells(i, 19) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [T2])values(" & Chr(34) & oWSht.Cells(i, 20) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Gi1])values(" & Chr(34) & oWSht.Cells(i, 21) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Gi2])values(" & Chr(34) & oWSht.Cells(i, 22) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Ve1])values(" & Chr(34) & oWSht.Cells(i, 23) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Ve2])values(" & Chr(34) & oWSht.Cells(i, 24) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Di1])values(" & Chr(34) & oWSht.Cells(i, 25) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [Di2])values(" & Chr(34) & oWSht.Cells(i, 26) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [TMST])values(" & Chr(34) & oWSht.Cells(i, 27) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R1])values(" & Chr(34) & oWSht.Cells(i, 28) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R2])values(" & Chr(34) & oWSht.Cells(i, 29) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R3])values(" & Chr(34) & oWSht.Cells(i, 30) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R4])values(" & Chr(34) & oWSht.Cells(i, 31) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R5])values(" & Chr(34) & oWSht.Cells(i, 32) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R6])values(" & Chr(34) & oWSht.Cells(i, 33) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R7])values(" & Chr(34) & oWSht.Cells(i, 34) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R8])values(" & Chr(34) & oWSht.Cells(i, 35) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R9])values(" & Chr(34) & oWSht.Cells(i, 36) & Chr(34) & ");"
    cSQL = "insert into [Prod_globale] ( [R10])values(" & Chr(34) & oWSht.Cells(i, 37) & Chr(34) & ");"
     
    'ici, on dit dans quel table, il inserera quels champs.
     
    'exécute la requète
    DoCmd.RunSQL cSQL
     
    'End If
     
    'on incrémente la variable i pour passer à la ligne suivante
    i = i + 1
     
    'Wend
     
    'on réactive les messages d'erreurs
    DoCmd.SetWarnings True
     
    End Sub
    'End Sub

  2. #2
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Salut Nico,

    dans le fond ton script n'a pas l'air mal du tout. As-tu essayé de le lancer ?
    quelle est ta difficulté ?
    merci de donner plus de détails, et là ou tu bloques exactement.
    ++

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Tout d'abor je tiens à te préciser que mon code n'est que pour ma premiere table.
    Il faut que j'y incorpore le code pour les 3 autres tables.
    Oui, je l'ai lancé et en mode débogage, il se fait jusqu'au bout mais rien n'est copié.... à voir pqoi
    Par contre j'ai vu dans les forums qu'on peut créer un "bonton " pour faire de telle sorte que quand on clique dessus, le code s'execute dans access: tu sais comment faire?
    De plus, a ton avis, il faut utiliser une structure en "si " pour competer ma 1 ere et deuxiere colonne: je dois rechercher ces infos qui n'apparaissent que dans le titre du document et qui est du type "...... 1_EXCEL_DD_20090128": je dois donc extraire le "1" et le "20090128"

    Merci en tout cas de m'apporter ton aide!

  4. #4
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Importer dans une table
    peut-être plus lisible
    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
     
    Sub ImportationExcel()
     
    Dim oApp As Excel.Application
    Dim oWkb As Excel.Workbook
    Dim oWSht As Excel.Worksheet
    Dim t As DAO.RecordSet
     
    Set oApp = CreateObject("excel.application")
    Set oWkb = oApp.Workbooks.Open("C:\Users\toshiba\Desktop\EXCEL_DD_20090127") 
    Set oWSht = oWkb.Worksheets("EXCEL_DD_20090")  
     
    Set t = CurrentDB.OpenRecordSet("Prod_globale")
    ligne = 289
    Do Until oWSht.Cells(ligne,1) = ""
     t.MoveFirst
      t.FindFirst "[nom_du_champ_destination_qui_ne_doit_pas_avoir_de_doublons] Like """ & t![nom_du_champ_destination_qui_ne_doit_pas_avoir_de_doublons] & """"
     If t.NoMatch Then   'pas trouvé
       t.AddNew
       t![Energrid] = oWSht.Cells(ligne, 1)
       t![jour] = oWSht.Cells(ligne, 2)
       t![heure] = oWSht.Cells(ligne, 3)
       t![PCons] = oWSht.Cells(ligne, 4
       t![Ppc] = oWSht.Cells(ligne, 5)
       '.......................................
       t![R9] = oWSht.Cells(ligne, n)
       t![R10] = oWSht.Cells(ligne, n+1)
       t.Update
      EndIf
      ligne = ligne + 1
     Loop
     t.Close
    End Sub

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Cela change quoi ton code?
    Tu veux que je crée 1 seule table au lieu des 4? Si c'est cela, je ne peux pas car excel ne dispose pas d'assez de colonne afin de bien réorganiser mes données pour les importer sous access après...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Avant le code ci-dessus, il faudrait également que j'arrive à ce que le code aille chercher la document dont j'ai besoin dans le dossier ENR1, qu'il compare la date du premier document qui est sous la forme "DD20090202" par exemple.
    Si la date figurant dans le titre de ce document est inférieure ou égale à celle de deuxieme colonne de ma table access (colonne date) alors on passe au document suivant sinon on execute le code après et on renouvelle le processus jusqu'a balayer l'ensemble des documents du dossier.
    On passe ensuite au second dossier et on fait de meme...

    Voila l'idée!

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai réussi à toruver un seul fichier ou toutes mes données sont en colonnes !!!
    PLus besoin de créer 36 tables mais plus qu'une.
    Il faudrait alors que j'arrive à selectionner dans mon code les colonnes que je souhaite importer, rajouter une colonne avec la date (figurant dans une partie du titre) et le nom de lappareil (1ou2 qui suit le mot situé dans la seconde colonne premiere ligne de mon doc excel).

    Reste ensuite à importer tous mes fichiers des 2 appareils et après à creer des requetes... pour demande rpar exemple la différence entre la production reelle et théorique...

    Voila les nouvelles du jour mais mes connaissances font que je suis pas mal bloqué à ce niveau!!

  8. #8
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par nicolille Voir le message
    Tout d'abor je tiens à te préciser que mon code n'est que pour ma premiere table.
    Il faut que j'y incorpore le code pour les 3 autres tables.
    Oui, je l'ai lancé et en mode débogage, il se fait jusqu'au bout mais rien n'est copié.... à voir pqoi
    Par contre j'ai vu dans les forums qu'on peut créer un "bonton " pour faire de telle sorte que quand on clique dessus, le code s'execute dans access: tu sais comment faire?
    De plus, a ton avis, il faut utiliser une structure en "si " pour competer ma 1 ere et deuxiere colonne: je dois rechercher ces infos qui n'apparaissent que dans le titre du document et qui est du type "...... 1_EXCEL_DD_20090128": je dois donc extraire le "1" et le "20090128"

    Merci en tout cas de m'apporter ton aide!
    Tiens je connais ce code, vu qu'il est de moi
    Tu peux très bien importer tes données dans plusieurs tables, ce n'est pas un souci du tout ! Il te suffit de faire un second docmd.runsql :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Private Sub Commande1_Click()
    'Ici l'importation se déclenche en cliquant sur le bouton "Commande1"
    'mais on peut aussi mettre ce code à l'ouverture d'un formulaire
    Dim oApp As Excel.Application
    Dim oWkb As Excel.Workbook
    Dim oWSht As Excel.Worksheet
     
    Set oApp = CreateObject("excel.application")
    Set oWkb = oApp.Workbooks.Open("chemin_du_fichier_xls") 'mettez ici le chemin vers votre fichier Excel
    Set oWSht = oWkb.Worksheets("nom_de_la_feuille_concernée_par_limportation")
     
    'première ligne ou commence l'import
    i = 11
     
    'pour éviter les messages lors de l'ajout des enregistrements
    DoCmd.SetWarnings False
     
    'tant qu'on n'est pas arrivés à la ligne 600 du tableur
    While i < 600
     
    ' === INSERTION DES DONNEES DANS LA TABLE1 ===
    If DCount("*", "[nom_da_la_table_destination]", "[nom_du_champ_destination_qui_ne_doit_pas_avoir_de_doublons] LIKE '" & oWSht.Cells(i, 9) & "'") = 0 Then
    'le numéro 9 correspond au numéro de la colonne source, tel que : A=1, B=2, C=3 ...
     
    'requète SQL (avec en paramètre la ligne i et le numéro de la colonne comme précisé au-dessus)
    cSQL = "insert into [table_destination] ( [champ1], [champ2] ) values (" & Chr(34) & oWSht.Cells(i, 13) & Chr(34) & ", " & Chr(34) & oWSht.Cells(i, 11) & Chr(34) & ");"
    'ici, on ne prend que les colonnes M (=13) et K (=11).
     
    'exécute la requète
    DoCmd.RunSQL cSQL
     
    End If
    ' === FIN DE L'INSERTION DANS LA TABLE1 ===
     
    ' === INSERTION DES DONNEES DANS LA TABLE2 ===
    If DCount("*", "[nom_da_la_table_destination]", "[nom_du_champ_destination_qui_ne_doit_pas_avoir_de_doublons] LIKE '" & oWSht.Cells(i, 9) & "'") = 0 Then
    'le numéro 9 correspond au numéro de la colonne source, tel que : A=1, B=2, C=3 ...
     
    'requète SQL (avec en paramètre la ligne i et le numéro de la colonne comme précisé au-dessus)
    cSQL = "insert into [table_destination] ( [champ1], [champ2] ) values (" & Chr(34) & oWSht.Cells(i, 13) & Chr(34) & ", " & Chr(34) & oWSht.Cells(i, 11) & Chr(34) & ");"
    'ici, on ne prend que les colonnes M (=13) et K (=11).
     
    'exécute la requète
    DoCmd.RunSQL cSQL
     
    End If
    ' === FIN DE L'INSERTION DANS LA TABLE2 ===
     
    'on incrémente la variable i pour passer à la ligne suivante
    i = i + 1
     
    Wend
     
    'on réactive les messages d'erreurs
    DoCmd.SetWarnings True
     
    End Sub
    Et pour ta deuxième question, tu peux aussi compléter automatiquement une colonne en fonction d'une autre avec un Si. Je te mets en exemple un bout de code à moi (avec un Case vu qu'il y a 3 possibilités) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If oWSht.Range("A" & i).Value = "" Then
    ' Remplissage du numéro d'agence quand celui-ci n'est pas présent
       Select Case oWSht.Range("B" & i).Value
          Case "AGENCE EN LIGNE": oWSht.Range("A" & i).Value = "AEL"
          Case "UEA SUD MEDITERRANEE": oWSht.Range("A" & i).Value = "UEA"
          Case "UGP SUD MEDITERRANEE": oWSht.Range("A" & i).Value = "UGP"
          Case Else: oWSht.Range("A" & i).Value = oWSht.Range("A" & i - 1).Value
       End Select
    End If
    Si tu veux tester si ton importation se déroule correctement, il faut que tu enlève temporairement le DoCmd.SetWarnings = False qui n'est là que pour éviter des messages d'erreur/de confirmation à l'utilisateur final
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  9. #9
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,

    regarde ici, il y a certainement matière à t'aider.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/06/2011, 12h57
  2. Importation de données d'Excel vers Access
    Par jolemoine dans le forum Access
    Réponses: 9
    Dernier message: 13/07/2007, 14h56
  3. Réponses: 13
    Dernier message: 29/03/2007, 11h30
  4. [VBA-E]Exporter des données d'Excel vers Access
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/06/2006, 15h57

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