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 :

[AC 2010] Vérifier les entêtes de champ d'une table avant import


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut [AC 2010] Vérifier les entêtes de champ d'une table avant import
    Bonjour,

    je souhaiterais que ma base Access contrôle les entêtes de champs contenu dans mes fichiers Excel avant qu'elle n'importe ces derniers dans ma base Access afin d'éviter les erreurs en cas de corruption de ceux-ci.

    Quelle procédure utiliser et existe-t-il des tutoriels ?

    Merci par avance.

  2. #2
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonjour,

    Tes entêtes de champs sont dans ta première ligne ?
    Ouvre ton fichier Excel dans Access avec VBA parcours ta première ligne et fais les vérifications que tu souhaite
    @+


    Pensez au tag

  3. #3
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut
    Bonjour Didier L et merci pour ta réponse.

    Ce que je cherche c'est le type de code à utiliser dans VBA, juste des pistes j'adapterai après tout seul.

    Merci par avance.

  4. #4
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Regarde ce post : ici

    Tu devrais trouver la syntaxe que tu désire
    @+


    Pensez au tag

  5. #5
    Membre régulier Avatar de zoopsys
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 68
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    Si tu as du temps, tu peux regarder la fonction Fct_Xls_Import présente dans l'application de ma signature.
    Je mets quand même le code ici :

    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
    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
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    '---------------------------------------------------------------------------------------
    ' Procedure : Fct_Xls_Import
    ' Author    : Thomas Boulay
    ' Date      : 19/06/2013
    ' Purpose   : Import d'un fichier Excel
    ' Parametres : Chemin et nom du fichier, nom de la feuille, numero de ligne de depart (par defaut : 1ere ligne),
    '              contôle de l'entete (par defaut : non), entete a contrôler
    '---------------------------------------------------------------------------------------
    '
    Function Fct_Xls_Import(ByVal strFilename As String, Optional strSheetName As String, Optional lngStartLine As Long = 1, Optional blnHeaderControl As Boolean = False, Optional strHeader As String) As Boolean
     
    Dim appExcel    As Excel.Application 'Necessite la reference Microsoft Excel Object Library
    Dim wbExcel     As Excel.Workbook   'Classeur Excel
    Dim wsExcel     As Worksheet        'Feuille Excel
    Dim varTab()    As Variant          'Tableau dynamique
    Dim lngLine     As Long             'Numero de ligne
    Dim lngColumn   As Long             'Numero de colonne
    Dim lngNbColumns As Long            'Nombre de colonnes
    Dim lngNbLines  As Long             'Nombre de lignes
    Dim lngLineData As Long
    Dim lngColData  As Long
    Dim rss         As New ADODB.Recordset 'Necessite la reference Microsoft ActiveX Data Objects Library
    Dim dtmChange   As Date             'Date de modification du fichier
    Dim i           As Long
    Dim strFileHeader   As String
     
        dtmChange = Fct_File_DateModif(strFilename)
     
        'Ouverture d'Excel
        Set appExcel = CreateObject("excel.application")
     
        appExcel.ScreenUpdating = False
        appExcel.EnableEvents = False
     
        'Ouverture du classeur
        Set wbExcel = appExcel.Workbooks.Open(strFilename)
     
     
        If strSheetName = "" Then 'si la feuille n'est pas renseignee on importe la 1ere feuille
     
            Set wsExcel = wbExcel.Sheets(1)
     
        Else
            'Verifie si la feuille existe
            If Fct_Xls_SheetIsExist(wbExcel, strSheetName) = False Then
     
     
                MsgBox "L'onglet " & strSheetName & " n'existe pas."
                'Fermeture du classeur Excel
                wbExcel.Close False
     
                appExcel.ScreenUpdating = True
                appExcel.EnableEvents = True
     
                'Fermeture d'Excel
                appExcel.Quit
     
                 'Liberation memoire
                Set wsExcel = Nothing
                Set wbExcel = Nothing
                Set appExcel = Nothing
     
                Fct_Xls_Import = False
     
                Exit Function
            End If
     
            Set wsExcel = wbExcel.Sheets(strSheetName)
     
        End If
     
        'Transfere les donnees d'excel dans la variable tableau : ATTENTION RISQUE DE SATURATION MEMOIRE
        varTab = wsExcel.UsedRange.value 'le UsedRange permet de definir automatiquement la zone des donnees
     
     
         'Recupere les dimensions du tableau
            lngNbColumns = UBound(varTab, 2)
            lngNbLines = UBound(varTab, 1)
     
            'Recherche de la premiere ligne non vide
                'Initialisation des variables
                 lngLine = 1
                 lngColumn = 1
     
                 Do Until varTab(lngLine, lngColumn) <> ""
                    lngLine = lngLine + 1
                 Loop
     
            lngLineData = lngStartLine 'ligne des donnees
            lngColData = 0
     
            'Contrôle de l'entete
            If blnHeaderControl = True Then
     
                Do Until lngColumn = lngNbColumns + 1
     
                    If strFileHeader <> "" Then strFileHeader = strFileHeader & ","
                    strFileHeader = strFileHeader & varTab(lngLine, lngColumn)
                    lngColumn = lngColumn + 1
                Loop
     
                If strFileHeader Like strHeader Then
                    'L'entete est conforme
     
                Else
     
                    'L'entete n'est pas conforme
                    Fct_Nav_Msg Replace(Message("msgHeaderMismatch"), "{1}", strHeader) & " " & strFileHeader, 0, 1, 0, 1
     
                    'Fermeture du classeur Excel
                    wbExcel.Close False
     
                    appExcel.ScreenUpdating = True
                    appExcel.EnableEvents = True
     
                    'Fermeture d'Excel
                    appExcel.Quit
     
                    'Liberation memoire
                    Set wsExcel = Nothing
                    Set wbExcel = Nothing
                    Set appExcel = Nothing
     
                    Fct_Xls_Import = False
     
                    Exit Function
     
                End If
            End If
     
            'Suppression des donnees de la table temporaire
            CurrentDb.Execute "DELETE * FROM tImport_Temp", dbFailOnError
     
            'Ouverture du recordset de la table temporaire pour ajout des donnees
            rss.Open "SELECT * FROM tImport_Temp", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
     
                'Boucle de changement de ligne
            Do
                'Boucle de changement de colonne
                Do
     
                    lngColumn = 1
     
                    'Ajout d'un enregistrement
                    rss.AddNew
     
                    'Ajoute le nom du fichier
                    rss!SOURCING = wbExcel.Name
                    'Ajoute le nom de la feuille qui correspond a la zone dans la 1ere colonne de la table
                    rss!F1 = wsExcel.Name
                    'Ajoute la date de modification du fichier
                    rss!DT_CHANGE = dtmChange
                    i = 1 'les champs precedents ne faisant pas partie du tableau il faudra incrementer de i le nombre de colonnes
     
                    'Recupere les entetes de ligne
                    rss.Fields("F" & i + 1).value = varTab(lngLineData, lngColumn)
     
                        'jusqu'a ce qu'un champ cotienne un nombre ou soit vide
                        lngColumn = lngColumn + 1
                        Do Until lngColumn = lngNbColumns
                            'Ajoute la donnee dans la table
                            rss.Fields("F" & lngColumn + i).value = varTab(lngLineData, lngColumn)
                            lngColumn = lngColumn + 1
                        Loop
     
     
                    'Recupere les quantites
                    rss.Fields("F" & (lngColumn + i - 1 + lngLine)).value = varTab(lngLineData, lngColumn + lngColData)
     
                    rss.Update
     
                    lngColData = lngColData + 1
     
                Loop Until lngColumn + lngColData = lngNbColumns + 1
     
                lngLineData = lngLineData + 1
                lngColData = 0
     
            Loop Until lngLineData = lngNbLines + 1
     
     
        'Efface le contenu du tableau
        Erase varTab
     
        'Fermeture du recordset
        rss.Close
        Set rss = Nothing
     
        'Fermeture du classeur Excel
        wbExcel.Close False
     
        appExcel.ScreenUpdating = True
        appExcel.EnableEvents = True
     
        'Fermeture d'Excel
        appExcel.Quit
     
        'Liberation memoire
        Set wsExcel = Nothing
        Set wbExcel = Nothing
        Set appExcel = Nothing
     
        Fct_Xls_Import = True
     
    End Function

  6. #6
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut
    Bonjour zoopsys,

    je ne cherche qu'a comparer les premières ligne de mes fichiers Excel avec les entêtes de colonnes de mes tables avant qu'une opération d'importation ne soit effectuée.

    As-tu un bout de code qui ferai ca ?

    merci par avance.

  7. #7
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Salut ,

    Ce que je cherche c'est le type de code à utiliser dans VBA, juste des pistes j'adapterai après tout seul.
    Je croyais que tu ne voulais qu'un exemple de code pour ouvrir un fichier excel depuis Access et ensuite un exemple pou pouvoir parcourir des cellules ?
    Si tu veux du code complet, explique plus précisément ce que tu veux.
    Ça veux dire quoi "comparer" pour toi ?
    Lire la première ligne d'un fichier Excel, c'est facile
    Mais que veux tu faire sur chaque valeur ? Les comparer a quoi ?
    A des nom de champs contenu dans une table ?
    S'il n'existe pas, que fais tu, tu arrête la comparaison ?
    Explique mieux ton besoin et on pourra te fournir un exemple de code plus concret
    @+


    Pensez au tag

  8. #8
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut Comparer les enêtes de colonnes de fichiers excel avec les entêtes de champs de tables Access avant Import
    Bonjour,

    Je souhaite mettre en place une procédure de contrôle sous VBA comparant les entêtes de colonnes de mes fichiers excel d'import avec les entêtes de champs des tables de ma base de données. Le but de l'opération est de m'assurer que l'utilisateur ne puisse importer que des fichiers "formatés" convenablement et ainsi éviter les échec d'importation.

    Connaissez-vous quels type de code VBA peut me servir ?

    Merci par avance.

  9. #9
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut
    Bonjour Didier L et désolé pour mon imprécision.

    Ce que je souhaite c'est comparer les entête de colonnes de fichiers Excel qui vont être importés dans ma base avec les entête de champs des tables dans lesquels ceux-ci vont être importés pour éviter qu'un utilisateur par inadvertance importe un mauvais fichier conduisant à une erreur lors de ce processus d'importation.

    Donc je veux m'assurer que les entêtes de colonnes des fichiers Excel et les entêtes de champs des tables de destination sont identiques.

    En cas d'erreur, je veux qu'un message avise l'utilisateur que le fichier qu'il a précédemment sélectionné pour l'importer n'est pas formaté convenablement et que le processus d'import s'arrête là.

    Merci encore pour tes conseils et le temps consacré.

  10. #10
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonjour,
    Coté Access il te faut utiliser la bibliothèque DAO. (cf le tuto DAO)
    Parcours les colonnes en utilisant cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dim fld as dao.field
     
    for each fld in tabledefs(matable).fields
        if  fld.name <> "le nom de la colonne excel" then
            'colonne ne correspond pas
     
        endif
    next
    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  11. #11
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Voila un petit bout de code qui devrait faire l'affaire en reprenant aussi la syntaxe de loufab

    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 OpenExcel(Optional ByVal pbAppVisible As Boolean)
        Set AppEx = CreateObject("Excel.Application")
        AppEx.Application.Visible = pbAppVisible
    End Sub
     
    Sub CloseExcel()
        AppEx.Quit
        Set AppEx = Nothing
    End Sub
     
    Sub ImportFichierExcel(ByVal FileName As String, ByVal TableName As String)
    Dim MaFeuille As Excel.Worksheet
    Dim I As Integer
    Dim vbFormatOk As Boolean
        OpenExcel False
        AppEx.Workbooks.Open FileName
        With AppEx
            vbFormatOk = True
            While I < CurrentDb.TableDefs(TableName).Fields.Count And vbFormatOk
                If CurrentDb.TableDefs(TableName).Fields(I).Name <> .Cells(1, I + 1) Then
                    vbFormatOk = False
                End If
                I = I + 1
            Wend
            If vbFormatOk Then
                vbFormatOk = (.Cells(1, I + 1) = "") 'test si la colonne suivante est bien vide
            End If
        End With
        CloseExcel
        If vbFormatOk Then
            DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, TableName, FileName, True
        Else
            MsgBox "Le format du fichier Excel n'est pas conforme !", vbExclamation
        End If
    End Sub
    A utiliser de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImportFichierExcel "C:\Didier\Classeur1.xls","MaTable"
    @+


    Pensez au tag

  12. #12
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut
    Bonjour Didier L et un grand merci pour ton aide et merci aux autres également.

    Par contre je rencontre une erreur lors de l'éxécution du code me disant que la vairable AppEx n'est pas définit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ImportFichierExcel(ByVal FileName As String, ByVal TableName As String)
    Dim MaFeuille As Excel.Worksheet
    Dim I As Integer
    Dim vbFormatOk As Boolean
        OpenExcel False
        AppEx.Workbooks.Open FileName
    J'ai copié la première partie du code dans un module Excel

    Pour les reste voici le code que j'ai tapé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub btn_import_Click()
     
        ImportFichierExcel "Me.txt_path1", "Import Reste à Livrer mode ALV"
        ImportFichierExcel "Me.txt_path2", "Import Situation Commandes et Livraisons"
        ImportFichierExcel "Me.txt_path3", "Import Reste à Livrer Interdiv"
        ImportFichierExcel "Me.txt_path4", "Import OTD Interdiv ZM13"

  13. #13
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonjour,

    Rien n'est à mettre dans Excel !
    Toute le code est du coté Access

    Effectivement en entête de ton module dans Access il manque la déclaration suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim AppEx As Excel.Application
    Private Sub btn_import_Click()

    ImportFichierExcel "Me.txt_path1", "Import Reste à Livrer mode ALV"
    ImportFichierExcel "Me.txt_path2", "Import Situation Commandes et Livraisons"
    ImportFichierExcel "Me.txt_path3", "Import Reste à Livrer Interdiv"
    ImportFichierExcel "Me.txt_path4", "Import OTD Interdiv ZM13"
    Je doute que ton code marche car tu cherche a importer le fichier qui s’appellerait : Me.txt_path1
    Car tu l'a mis entre guillemets !

    Si tu veux récupérer le contenu de ta zone txt_path1 qui se trouve dans ton formulaire, enlève les guillemets comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ImportFichierExcel Me.txt_path1, "Import Reste à Livrer mode ALV"
    Ensuite j'espère que ta table s'appelle bien "Import Reste à Livrer mode ALV" ?
    @+


    Pensez au tag

  14. #14
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut
    Bonjour Didier L et merci, ton code fonctionne très bien.

    Pour autant j'ai 1 petits soucis.

    Je souhaiterais que l'import des fichiers ne se fassent que si le contrôle de l'ensemble de ceux-ci est correcte, et non après un contrôle un à un des fichiers avec un import individuel de ceux-ci.

    Merci encore.

  15. #15
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonjour,

    A la place de la procédure "ImportFichierExcel" qui fait tout, décompose en deux procédure
    La première est une fonction qui teste tes fichier et ensuite la seconde importe

    Voila un bourt de code qui devrait fonctionner.
    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
    Function TestFichierExcel(ByVal FileName As String, ByVal TableName As String) As Boolean
    Dim MaFeuille As Excel.Worksheet
    Dim I As Integer
    Dim vbFormatOk As Boolean
        OpenExcel False
        AppEx.Workbooks.Open FileName
        With AppEx
            vbFormatOk = True
            While I < CurrentDb.TableDefs(TableName).Fields.Count And vbFormatOk
                If CurrentDb.TableDefs(TableName).Fields(I).Name <> .Cells(1, I + 1) Then
                    vbFormatOk = False
                End If
                I = I + 1
            Wend
            If vbFormatOk Then
                vbFormatOk = (.Cells(1, I + 1) = "") 'test si la colonne suivante est bien vide
            End If
        End With
        CloseExcel
        TestFichierExcel = vbFormatOk
    End Function
     
    Sub ImportFichierExcel(ByVal FileName As String, ByVal TableName As String)
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, TableName, FileName, True
    End Sub
     
    Sub ImportTousFichiersExcel()
    Const cnNbrFichier = 4
    Dim I As Integer
    Dim vsFicName As String
    Dim vsTableName As String
    Dim vbFormatOk As Boolean
        I = 1
        While I <= cnNbrFichier And vbFormatOk
            vsFicName = Me.Controls("txt_path" & I)
            vsTableName = Choose(I, "Import Reste à Livrer mode ALV", "Import Situation Commandes et Livraisons", "Import Reste à Livrer Interdiv", "Import OTD Interdiv ZM13")
            vbFormatOk = TestFichierExcel(vsFicName, vsTableName)
            I = I + 1
        Wend
        If vbFormatOk Then
            For I = 1 To cnNbrFichier
                vsFicName = Me.Controls("txt_path" & I)
                vsTableName = Choose(I, "Import Reste à Livrer mode ALV", "Import Situation Commandes et Livraisons", "Import Reste à Livrer Interdiv", "Import OTD Interdiv ZM13")
                ImportFichierExcel vsFicName, vsTableName
            Next
        Else
            MsgBox "Le format du fichier Excel : '" & vsFicName & "' n'est pas conforme !", vbExclamation
        End If
    End Sub
    Si tu as des questions n'hésite pas
    @+


    Pensez au tag

  16. #16
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut
    Bonjour et un énorme merci,

    par contre j'ai bien copié ton code dans un module mais je me demande comment utiliser le tout.
    En lisant le code je comprend que" ImportTousFichierExcel" devrait suffire pour lancer la procédure mais j'ai une erreur "Erreur de compilation" 3utilisation incorrecte du mot clé Me"

    Et ca bloque la dernière ligne du code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub ImportTousFichiersExcel()
    Const cnNbrFichier = 3
    Dim I As Integer
    Dim vsFicName As String
    Dim vsTableName As String
    Dim vbFormatOk As Boolean
        I = 1
        While I <= cnNbrFichier And vbFormatOk
            vsFicName = Me.Controls("txt_path" & I)
    Merci encore,

    Peux tu me dire si j'utilise mal ton code ou ne l'appelle pas de la bonne manière pour lancer la procédure ?

  17. #17
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    C'est normal car me fait référence à un objet formulaire ou état.

    Tu voulais saisir des noms de fichiers dans un formulaire.
    Dans ce cas met le code dans le module du formulaire.
    Mais si ce n'est pas le cas alors à la place de la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vsFicName = Me.Controls("txt_path" & I)
    Utilise un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vsFicName = Choose(I, "C:\...\Fichier1.xls", "C:\...\Fichier2.xls", "C:\...\Fichier3.xls","C:\...\Fichier4.xls")
    @+


    Pensez au tag

  18. #18
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut
    Bonjour Didier L

    Non ton code devrai fonctionner en l'état car les "liens" vers mes fichiers sont contenus dans des objets nommés txt_path1 etc.

    J'ai donc copié ton code dans un module que j'ai nommé Import_tous_Fichiers_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
    Option Compare Database
    Option Explicit
     
     
    Function TestFichierExcel(ByVal FileName As String, ByVal TableName As String) As Boolean
    Dim MaFeuille As Excel.Worksheet
    Dim I As Integer
    Dim vbFormatOk As Boolean
        OpenExcel False
        AppEx.Workbooks.Open FileName
        With AppEx
            vbFormatOk = True
            While I < CurrentDb.TableDefs(TableName).Fields.Count And vbFormatOk
                If Replace(CurrentDb.TableDefs(TableName).Fields(I).Name, "#", ".") <> .Cells(1, I + 1) Then
                    vbFormatOk = False
                End If
                I = I + 1
            Wend
            If vbFormatOk Then
                vbFormatOk = (.Cells(1, I + 1) = "") 'test si la colonne suivante est bien vide
            End If
        End With
        CloseExcel
        TestFichierExcel = vbFormatOk
    End Function
     
    Sub ImportFichierExcel(ByVal FileName As String, ByVal TableName As String)
     
        Dim appExcel As Excel.Application
        Dim wbExcel As Excel.Workbook
        Dim wsExcel As Excel.Worksheet
     
        Set appExcel = CreateObject("Excel.Application")
        Set wbExcel = appExcel.Workbooks.Open(FileName)
        Set wsExcel = wbExcel.Worksheets(1)
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, TableName, FileName, True
    End Sub
     
    Sub ImportTousFichiersExcel()
    Const cnNbrFichier = 3
    Dim I As Integer
    Dim vsFicName As String
    Dim vsTableName As String
    Dim vbFormatOk As Boolean
        I = 1
        While I <= cnNbrFichier And vbFormatOk
            vsFicName = Me.Controls("txt_path" & I)
            vsTableName = Choose(I, "Import Situation Commandes et Livraisons", "Import Reste à Livrer Interdiv", "Import OTD Interdiv ZM13")
            vbFormatOk = TestFichierExcel(vsFicName, vsTableName)
            I = I + 1
        Wend
        If vbFormatOk Then
            For I = 1 To cnNbrFichier
                vsFicName = Me.Controls("txt_path" & I)
                vsTableName = Choose(I, "Import Situation Commandes et Livraisons", "Import Reste à Livrer Interdiv", "Import OTD Interdiv ZM13")
                ImportFichierExcel vsFicName, vsTableName
            Next
        Else
            MsgBox "Le format du fichier Excel : '" & vsFicName & "' n'est pas conforme !", vbExclamation
        End If
    End Sub
    Et pour faire appelle à celui-ci j'ai saisi dans le module de mon formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub btn_import_Click()
     
    ImportTousFichiersExcel
     
    ...etc
    Par contre ca me renvoie l'erreur indiquée dans mon dernier message "Erreur de compilation" "utilisation incorrecte du mot clé Me".

  19. #19
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Alors a la place de "me" met Forms("leNomdetonformulaire") si ton formulaire est bien ouvert quand tu lance ce code
    @+


    Pensez au tag

  20. #20
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 44
    Points
    44
    Par défaut
    Bonjour Didier L,

    Lorsque je remplace Me par Forms("Import"), l'erreur qui m'est renvoyé indique qu'il ne trouve pas le chemin de mes fichiers excel : "Le format du fichier Excel : " n'est pas conforme !"

    Merci encore pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/12/2007, 19h06
  2. [DB2]Obtenir tous les noms des champs d'une table
    Par ptr83 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/11/2006, 09h31
  3. Réponses: 5
    Dernier message: 11/08/2006, 16h43
  4. Réponses: 2
    Dernier message: 01/08/2006, 13h38
  5. [MySQL] Supprimer les informations des champs dans une table (suite)
    Par snakejl dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 26/05/2006, 15h37

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