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 :

Adapter un code "import de de fichier excel dans table access" avec possibilité d'aller chercher le fichier. [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut Adapter un code "import de de fichier excel dans table access" avec possibilité d'aller chercher le fichier.
    Bonjour à tous,

    Je créer une application sous access et je vais avoir besoin d'importer un fichier excel. Jusque la rien de très dur, plein de post sur ce forum expliquent comment faire et proposent differents codes.

    Ce que je souhaite c'est pouvoir utiliser ce code d'importation, rédiger en partie par totofe et azertix voir le post

    Le code permet de copier les plages de cellules voulues d'un fichier Excel vers les champs voulus d'une table Access, en évitant le doublons.
    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
    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") 'mettez ici le nom de la feuille qui contient les données à importer
     
    '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
    'on peut aussi arrêter l'importation lorsque le programme rencontre une case
    'vide en remplaçant la ligne du While par :
    'While oWSht.Range("I" & i).Value <> "" '(où I représente la colonne et i 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("*", "[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
     
    '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
    Ce code est très pratique et correspond complètement à mes besoins. Le problème est que mon application risque d'etre utilisé dans differents services ne se trouvant pas dans l'enceinte de l'entreprise.

    J'ai donc besoin d'adapter ce code ci dessus. Au lieu de désigner un emplacement pour le fichier dans le code, je voudrais que l'utilisateur puisse aller chercher le fichier lui meme. (les fichiers ne se trouveront pas sur les même réseaux, dossier, en fonction des differents services.)

    voici deux codes permettent de faire ce que je souhaite mais je manque cruellement de compétence en VBA pour l'adapter.

    le premier : ouverture de fichier + importation

    le deuxieme : "Sélectionner et retourner le chemin de un ou plusieurs fichiers séparés par un point-virgule"
    Lien vers le site source

    Je me permet de vous demander votre aide, si quelqu'un est capable de pouvoir arriver à ce que je souhaite cela serait vraiment parfait !!

    merci d'avance

    cordialement Guillaume

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    J'ai inséré le code de sélection d'un fichier excel, à celui que tu as posté :
    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
    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
    Dim fDlg As Office.FileDialog, strFichier As String
     
    ' --------------------------
    ' Selection du fichier Excel
    ' --------------------------
    Set fDlg = Application.FileDialog(msoFileDialogOpen)
    ' Définition du ou des filtres
    fDlg.Filters.Clear
    fDlg.Filters.Add "Fichier Excel", "*.xl*"
    ' Dossier de départ
    fDlg.InitialFileName = CurrentProject.Path
    ' Type d'affichage
    fDlg.InitialView = msoFileDialogViewList
    If fDlg.Show Then
       strFichier = fDlg.SelectedItems(1)
    End If
    Set fDlg = Nothing
    ' Si l'utilisateur a cliqué sur Annuler quitter la procédure
    If Len(strFichier) = 0 Then Exit Sub
     
    ' --------------------------
    ' Ouverture du fichier Excel
    ' --------------------------
    Set oApp = CreateObject("excel.application")
    Set oWkb = oApp.Workbooks.Open(strFichier)   'Fichier sélectionné par l'utilisateur
    Set oWSht = oWkb.Worksheets("nom_de_la_feuille_concernée_par_limportation") 'mettez ici le nom de la feuille qui contient les données à importer
     
    'première ligne ou commence l'import
    ' ...
    End Sub
    Le code initialise la boîte de dialogue "Ouvrir un fichier" et met le fichier choisi dans la variable strFichier.
    Cette variable est ensuite utilisée dans la méthode Open de la collection Workbooks pour ouvrir le fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oWkb = oApp.Workbooks.Open(strFichier)   'Fichier sélectionné par l'utilisateur
    A+

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    mais c'est parfait tout ca !!! et avec les explications en prime !!

    Franchement merci, je testerai ca demain (la journée est fini et je suis un mac user donc pas access...lol certain vont me huer...mdr)

    J'avais juste une question concernant une partie du code. Je l'ai biensur testé avant d'écrire ce post pour voir si tout fonctionnait comme je voulais et je me suis retrouvé devant un petit problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    '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) & ");"
    En faite j'ai bcp de champs à importer dans ma table. Lorsque je nomme les champs et que j'affecte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    " & Chr(34) & oWSht.Cells(i, 13) & Chr(34) & "
    pour chaque colonne, je me retrouve avec un ligne très longue qui forcément au bout d'un moment va à la ligne aumatiquement. Le problème c'est que cela entraine une erreur. J'ai donc essayé de mettre à la ligne moi même avec _ mais cela ne marchait pas du tout et le ; qui se trouve à la fin était surligné.

    j'ai essayer de mettre à la ligne à ce niveau la (avec espace avant ; espace apres, espace entre les deux..)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [champ2] ) _ values (" & Chr(34) & oWSht.Cells(i, 13) & Chr(34) & ",
    mais cela n'a pas marché...

    Alors si tu savais d'ou cela pouvait venir et si il y avait une autre solution...

    Merci encore pour le code modifié

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    je suis un mac user donc pas access...lol certain vont me huer...mdr
    Ce n'est pas moi qui te huerai Je n'ai rien contre les Mac's ni contre Linux.

    Le caractère de continuité ne peux pas se mettre n'importe où, et en particulier, pas à l'intérieur d'une chaîne de caractères.

    Si je veux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strToto = "abcdefghijklmnopqrstuvwxyz"
    sur plusieurs lignes, je devrais scinder ma chaîne de caractère en plusieurs chaînes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strToto = "abcdefghi" & "jklmnopqr" & "stuvwxyz"
    Ecritures revenant au même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strToto = "abcdefghi" & _
              "jklmnopqr" & _
              "stuvwxyz"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strToto = "abcdefghi" _
            & "jklmnopqr" _
            & "stuvwxyz"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strToto = "abcdefghi"
    strToto = strToto & "jklmnopqr"
    strToto = strToto & "stuvwxyz"
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cSQL = "insert into [table_destination] ( [champ1], [champ2], " & _
           "[champ3], [champ4] ) values ("
    ' 1er champ
    cSQL = cSQL & Chr(34) & oWSht.Cells(i, 13) & Chr(34) 
    ' 2e champ
    cSQL = cSQL & ", " & Chr(34) & oWSht.Cells(i, 11) & Chr(34)
    ' 3e champ
    cSQL = cSQL & ", " & Chr(34) & oWSht.Cells(i, 5) & Chr(34)
    ' 4e champ
    cSQL = cSQL & ", " & Chr(34) & oWSht.Cells(i, 6) & Chr(34)
    ' fermeture parenthèse values(..)
    cSQL = cSQL & ");"
    Questions :
    Qu'est-ce que tu as comme type de champs ?
    Parce dans ton code la syntaxe n'est valable que pour des champs de type Texte.
    Si tu veux voir un exemple de construction d'instruction SQL INSERT : lien (partie V-B-1. Zone 1)

    Combien y a-t-il de lignes à importer à partir du fichier Excel ?
    Je me demandes s'il ne vaudrait pas mieux utiliser un recordset plutôt que de multiples requêtes INSERT.
    Qui plus est, on est moins embêté par les problèmes de types de données.

    A+

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    Merci pour ta réponse très claire, je comprend mieux maintenant

    Il y a 18 colonnes et le nombre de ligne n'est pour le moment pas connu. (le fichier excel est en faite une requete émise par un portail externe. La personne récupère ca requete, asigne une personne (controleur) pour chaque ligne. pour le moment je n'ai pass cette requete car le portail est tjr en cour de création.

    En faite si j'ai choisi ce code c'est aussi parce que je pouvais choisir d'importer mes données à partie de la colonne numéro 2. La colonne 1 étant un champ IDdossier de type numeroauto. Donc le but est que chaque enregistrement importé dans la table T_dossierimportexcel est un numero unique.

    Cette table ne sert qu'a recevoir les données. Une requete ajout les transphert dans la table T_dossier. A chaque transphert la table T_dossierimportexcel est vidé.

    Par contre je t'avoue ne pas vraiment comprendre les recordset. Il y a peut etre un code adapté à cela.?

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Voila un exemple de code (Je suis parti sur la base du tien).
    J'ai ajouté une gestion d'erreurs, et du code pour fermer proprement les objets Excel.

    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    Sub ImporterCmdes()
    Dim oApp As Excel.Application
    Dim oWkb As Excel.Workbook
    Dim oWSht As Excel.Worksheet
    Dim i As Long, strTrc As String
    Dim db As DAO.Database, rsDest As DAO.Recordset
    Dim fDlg As Office.FileDialog, strFichier As String
     
    On Error GoTo ErrH:
     
    ' --------------------------
    ' Selection du fichier Excel
    ' --------------------------
    Set fDlg = Application.FileDialog(msoFileDialogOpen)
    ' Définition du ou des filtres
    fDlg.Filters.Clear
    fDlg.Filters.Add "Fichier Excel", "*.xl*"
    ' Dossier de départ
    fDlg.InitialFileName = CurrentProject.Path
    ' Type d'affichage
    fDlg.InitialView = msoFileDialogViewList
    If fDlg.Show Then
       strFichier = fDlg.SelectedItems(1)
    End If
    Set fDlg = Nothing
    ' Si l'utilisateur a cliqué sur Annuler quitter la procédure
    If Len(strFichier) = 0 Then Exit Sub
     
    ' --------------------------
    ' Ouverture du fichier Excel
    ' --------------------------
    Set oApp = CreateObject("excel.application")
    Set oWkb = oApp.Workbooks.Open(strFichier)   'Fichier sélectionné par l'utilisateur
    Set oWSht = oWkb.Worksheets("Feuil1") 'mettez ici le nom de la feuille qui contient les données à importer
     
    ' On ouvre un recordset sur la table dans laquelle on veut
    ' ajouter des enregistrements
    Set db = CurrentDb
    Set rsDest = db.OpenRecordset("tblCmdes", dbOpenDynaset)
     
    'première ligne ou commence l'import
    i = 11
     
    'Tant que la colonne 1 (A) n'est pas vide
    While Len(oWSht.Cells(i, 1).Text) > 0
     
        '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("*", "[tblCmdes]", "[NumCmde] = " & oWSht.Cells(i, 1)) = 0 Then
        'le numéro 1 correspond au numéro de la colonne source, tel que : A=1, B=2, C=3 ...
           rsDest.AddNew
           strTrc = "Champ [NumCmde]"
             rsDest("NumCmde") = oWSht.Cells(i, 1)
           strTrc = "Champ [CodeClient]"
             rsDest("CodeClient") = oWSht.Cells(i, 2)
           strTrc = "Champ [NumEmploye]"
             rsDest("NumEmploye") = oWSht.Cells(i, 3)
           strTrc = "Champ [DateCmde]"
             rsDest("DateCmde") = oWSht.Cells(i, 4)
           strTrc = "Champ [À livrer avant]"
             rsDest("À livrer avant") = oWSht.Cells(i, 5)
           strTrc = "Champ [DateEnvoi]"
             rsDest("DateEnvoi") = oWSht.Cells(i, 6)
           strTrc = "Champ [NumMessager]"
             rsDest("NumMessager") = oWSht.Cells(i, 7)
           strTrc = "Champ [NumCmPortde]"
             rsDest("Port") = oWSht.Cells(i, 8)
           strTrc = "Sauver Nouvel Enregistrement"
           rsDest.Update
        End If
        strTrc = ""
        'on incrémente la variable i pour passer à la ligne suivante
        i = i + 1
    Wend
     
    Sortie:
    Set oWSht = Nothing
    If Not (oWkb Is Nothing) Then oWkb.Close False
    Set oWkb = Nothing
    If Not (oApp Is Nothing) Then oApp.Quit
    Set oApp = Nothing
    If Not (rsDest Is Nothing) Then rsDest.Close
    Exit Sub
     
    ErrH:
    Select Case Err.Number
        Case 3022 ' Risque de doublon - Violation Clé/Index unique
             ' on annule l'ajout et on continue
             rsDest.CancelUpdate
             Resume Next
        ' Erreur ignorées. Pour les prendre en compte, mettre en commentaire
        ' l'instruction Resume Next
        Case 3163 ' Le champ est trop petit pour accepter la quantité de données que vous voulez ajouter
             Resume Next
        Case 3349 ' Dépassement de capacité sur un champ numérique
             Resume Next
        Case 3421 ' Erreur de conversion de type
             Resume Next
    End Select
     
    MsgBox "Erreur No. " & Err.Number & " : " & Err.Description, , _
           "Ligne " & i & ". " & strTrc
    Resume Sortie
    End Sub
    A+

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Citation Envoyé par Chagui Voir le message
    En faite si j'ai choisi ce code c'est aussi parce que je pouvais choisir d'importer mes données à partie de la colonne numéro 2. La colonne 1 étant un champ IDdossier de type numeroauto. Donc le but est que chaque enregistrement importé dans la table T_dossierimportexcel est un numero unique.

    Cette table ne sert qu'a recevoir les données. Une requete ajout les transphert dans la table T_dossier. A chaque transphert la table T_dossierimportexcel est vidé.
    Je suppose que le champ IDdossier (NuméroAuto) est dans la table T_dossier.
    Pas dans la table de transit T_dossierimportexcel ?

    Tu peux très bien importer le fichier Excel dans T_dossierimportexcel avec Docmd.TransferSpreedsheet.
    A priori, je ne pense pas que le fichier excel contienne des doublons.
    Ensuite tu fais une requête ajout de T_dossierimportexcel dans T_dossier,
    avec comme condition que le dossier de T_dossierimportexcel ne soit pas dans T_dossier.

    Cela se fait sur la base d'une requête de non correspondance entre T_dossierimportexcel et T_dossier.
    Tu transformes ensuite cette requête en requête ajout, en choisissant T_dossier comme table de destination.
    Vérifier qu'aucun champ de T_dossier ne va être ajouté.
    "Ajouter à :" doit être vide pour tout champ provenant de la table T_dossier.
    Et bien sûr, le champ IDdossier ne doit pas apparaître dans la ligne "Ajouter à :"

    A+

  8. #8
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    Bonjour,

    Merci pour le code que tu as modifié. Il marche très bien. Par contre j'ai eu un message d'erreur Erreur No. 3075 : Erreur de syntaxe (opérateur absent) dans l'expression "[N° de dossier PRESTA/PRESTO]="

    Donc je l'ai mise parmis les erreur possible dans le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Case 3075 
             Resume Next
    Forcément l'importation fonctionne apres. Mais est ce que cette erreur est importante? Je me demande si ce n'est pas à cause de la reconnaissance des differents types de données. ce champ étant le 1er en numérique.

    Par rapport à ta question

    Je suppose que le champ IDdossier (NuméroAuto) est dans la table T_dossier.
    Pas dans la table de transit T_dossierimportexcel ?
    Non ca peut parraitre bizarre et pas très conventionnel (peut etre) mais mon numeroauto se trouve bien dans T_dossierimportexcel, je m'explique:
    Lorsque le fichier excel est importé, j'indique dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'première ligne ou commence l'import
    i = 2
    Mon numeroauto étant sur la premiere. Dans cette table T_dossierimportexcel il est vrai que les types de données ne sont pas reconnus. Par contre l'import via la requete ajout dans T_dossier replace les données dans le bon champ (logique) et chaque donnée retrouve ca "catégorie" (texte, numerique, date, montant).

    Donc au final ca répond completement à mes attentes; Mais tu vas peut etre soulever un probleme que je ne remarque pas encore...

    Ensuite tu fais une requête ajout de T_dossierimportexcel dans T_dossier,
    avec comme condition que le dossier de T_dossierimportexcel ne soit pas dans T_dossier.

    Cela se fait sur la base d'une requête de non correspondance entre T_dossierimportexcel et T_dossier.
    Tu transformes ensuite cette requête en requête ajout, en choisissant T_dossier comme table de destination.
    Vérifier qu'aucun champ de T_dossier ne va être ajouté.
    "Ajouter à :" doit être vide pour tout champ provenant de la table T_dossier.
    Et bien sûr, le champ IDdossier ne doit pas apparaître dans la ligne "Ajouter à :"
    je t'avoue ne pas etre sur de bien comprendre les requêtes de non correspondance. cela veut dire qu'elle non pas de jointure? Ou qu'il faut une jointure particuliere de type gauche ou droite?

    Enfin j'ai un peu de mal à voir comment mettre ca en forme... Mon manque de pratique je pense..!

    Donc est ce que ce que j'ai mis en place peut fonctionner dans le temps ou tu soupçonnes d'éventuelles erreurs à venir...

  9. #9
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Erreur No. 3075 : Erreur de syntaxe (opérateur absent) dans l'expression "[N° de dossier PRESTA/PRESTO]="
    J'avoue que je ne sais pas d'où vient l'erreur, ne sachant pas à quoi correspond "N° de dossier PRESTA/PRESTO".
    Pour déboguer il faudrait que tu mettes en commentaire la ligne
    Ainsi tu verra sur quelle ligne de code elle se produit.

    Je me demande si ce n'est pas à cause de la reconnaissance des différents types de données. ce champ étant le 1er en numérique.
    Comme on passe par le modèle objet Excel, il n'y a pas de reconnaissance de type.
    Sur une ligne de code de ce type ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             rsDest("DateCmde") = oWSht.Cells(i, 4)
    ... DAO essaie de convertir le type de ce que retourne oWSht.Cells(i, 4) dans celui du champ concerné.
    Le champ "DateCmde" étant ici de type Date/Heure, DAO tentera une conversion en date/heure si nécessaire.

    Je t'avoue ne pas etre sur de bien comprendre les requêtes de non correspondance.
    C'est une requête avec jointure gauche (le plus souvent) ou droite.
    Par exemple, j'ai deux tables clients, T1 et T_CLI, et je veux connaître les clients de T1 qui ne sont pas dans T_CLI.
    T_CLI (IdClient, NomClient, cpClient, ...)
    Admettons que je ne puisse pas le faire par la clé de la table T_CLI (IdCLient).
    Je vais dire que la combinaison NomClient+cpClient est unique et que les deux champs ne sont jamais vides.
    La requête sera celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT T1.NomClient, T1.cpClient
    FROM T1 LEFT JOIN T_CLI ON T1.NomClient= T_CLI.NomClient And T1.cpClient = T_CLI.cpClient
    WHERE T_CLI.NomClient Is Null
     
                     T_CLI
    T1               ==========
    ==========       IdClient
    NomClient -----> NomClient
    cpClient  -----> cpClient
    ....             ....
    Voir ici pour de meilleures explications.

    A+

  10. #10
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    Yep merci pour ton message. L'importation marche très bien. je n'ai aucun souci donc je vais rester comme ca. Pour le moment je n'ai pas le vrai fichier à importer donc ce ne sont que des tests. Je me concentrerai plus sur l'import plus tard mais la base est déjà la et pour ca je t'en remercie.

    la seule chose qui m'énerve c'est que j'ai mis sur l'évènement fermeture du formulaire une requete ajout vers T_dossier
    et une requette supression de T_dossierimportexcel

    Ce qui est génant c'est les messages demandant si l'on veut ajouter, et le nombre de lignes que l'on ajoute. De meme pour la supression.

    j'ai ce code mais il a l'air de servir à l'ajout de champ rempli dans un formulaire vers une table sépcifique. as tu une idée pour éviter les messages d'ajout pour l'impoprt du table à une autre et de même pour la surpression ??

    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
    Dim MaTable as RecordSet
    Set MaTable = CurrentDb.OpenRecordset("Utiisateurs", dbOpenDynaset)
    On Error Resume Next
    With MaTable
        .AddNew
        !Nom = Form_ajout!txtnom
        !Prenom = Form_ajout!txtprenom
        !Service = Form_ajout!lstservice
        .Update
        .Requery
    End With
    If Err.Number <> 0 Then
        MsgBox Err.Description, , Err.Number
        GoTo Fin:
    End If
    MaTable.Close
    Set MaTable = Nothing
    Fin:
    End Sub

  11. #11
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Pour ne pas avoir les messages d'avertissement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.SetWarnings False
    Pour les réactiver :
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DoCmd.SetWarnings False
    DoCmd.OpenQuery "RequêteAction1"
    DoCmd.OpenQuery "RequêteAction2"
    DoCmd.SetWarnings True
    Il faut bien penser à toujours réactiver les messages d'avertissement.
    Ils servent aussi lorsqu'on ferme un objet et qu'on ne l'a pas sauvegardé.

    A+

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

Discussions similaires

  1. [AC-2010] Importation fichier Excel dans table
    Par Nicolase dans le forum Modélisation
    Réponses: 4
    Dernier message: 30/07/2013, 09h58
  2. [AC-2010] Import fichier excel dans table access
    Par ouinih dans le forum VBA Access
    Réponses: 1
    Dernier message: 16/04/2013, 19h38
  3. import fichier excel vers table access
    Par Debutant10 dans le forum VBA Access
    Réponses: 1
    Dernier message: 17/04/2011, 17h37
  4. importation fichier excel dans base access existante
    Par stabil0 dans le forum Access
    Réponses: 2
    Dernier message: 25/08/2009, 16h57
  5. Importation fichier Excel dans table Access
    Par kemasse dans le forum Access
    Réponses: 2
    Dernier message: 27/06/2006, 15h12

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