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 :

Modifier une table Excel avant importation [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Autres
    Inscrit en
    février 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : février 2018
    Messages : 35
    Points : 11
    Points
    11
    Par défaut Modifier une table Excel avant importation
    Bonjour à tous,
    Voici mon problème.
    Je veux importer des fichiers Excel dans Access pour pouvoir travailler dessus puis les exporter à nouveau sous format Excel. Je ne compte travailler avec un seul fichier Excel à la fois. Je ne veux donc qu'en exporter un seul à la fois, le manipuler, puis l'exporter ensuite.
    Je ne connais à l'avance ni le nom du fichier Excel, ni le nom de la feuille de ce fichier que je compte importer sur Excel.
    En revanche je sais que ce sera la deuxième feuille de ce fichier et je sais quelle est sa structure (le nombre de colonnes, leurs intitulés, leur nature -texte, chiffre, etc.- ), mais je ne sais pas à l'avance le nombre de lignes renseignées.
    Sur VBA, Je n'ai pas de problème pour récupérer le chemin du fichier Excel ni pour récupérer celui de cette deuxième feuille que je veux importer.
    Le problème est le test qu'Access fait pour identifier la nature des colonnes text. Je ne sais pas exactement comment il le fait mais au terme de celui-ci, il décide que telle colonne est au format text (donc moins de 255 caractères) et telle autre au format mémo (pas de limitation du nombre de caractères).
    Or dans ce fichier Excel, j'ai plusieurs colonnes qui contiennent du texte dont j'ignore à l'avance la longueur pour chacune de ses cellules. Une de ses cellules peut contenir 200 caractères, la suivante 400, la suivante 50, l'autre 1000, etc.
    Donc quand Access fait son test, sur un nombre limité de cellule j'imagine, il décide que celle-là, ce sera du texte, mais manque de bol les cellules suivantes contiennent plus de 255 caractères, et du coup Import Error, et le champ apparaît vide (sans texte importé sur Excel).
    Et j'ai plusieurs colonnes qui contiennent du texte dont la longueur est aléatoire.
    Du coup, je voudrais dire en VBA à Access: "ecoute mon vieux, dès que tu vois une colonne texte, tu lui colles un format memo et pi t'importe..."
    Je ne sais pas si c'est possible, mais une chose est sûre, je ne sais pas le faire.
    Je me suis dit "et si, avant d'importer, je t'insérais dans le fichier Excel une première ligne modèle -genre des nombres quand la colonne est remplie de nombre- et un texte bateau de plus de 255 caractères quand la colonne est remplie de texte, comme ça quand Access fait son test, sur la première ligne de la feuille Excel, Access verra des textes de plus de 255 caractères dans les colonnes texte, et hop! il lui attribuera le format memo et m'importera le tout sans Import Error". Mais ça non plus, je ne sais pas le faire...
    Bref, au secours et merci!

  2. #2
    Membre éclairé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    août 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : août 2017
    Messages : 348
    Points : 878
    Points
    878
    Par défaut
    Citation Envoyé par Montastruc Voir le message
    Je ne connais à l'avance ni le nom du fichier Excel, ni le nom de la feuille de ce fichier que je compte importer sur Excel.
    En revanche je sais que ce sera la deuxième feuille de ce fichier et je sais quelle est sa structure (le nombre de colonnes, leurs intitulés, leur nature -texte, chiffre, etc.- ), mais je ne sais pas à l'avance le nombre de lignes renseignées.
    Dans ce cas tu peux passer par une spécification d'importation, qui sert justement à préciser quelle(s) colonne(s) importer et sous quel format.
    En as-tu déjà utilisé ?
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  3. #3
    Membre à l'essai
    Homme Profil pro
    Autres
    Inscrit en
    février 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : février 2018
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Paraffine Voir le message
    Dans ce cas tu peux passer par une spécification d'importation, qui sert justement à préciser quelle(s) colonne(s) importer et sous quel format.
    En as-tu déjà utilisé ?
    Bonjour Paraffine,
    Non, je ne l'ai pas fait. Pour la bonne raison que je suis un peu une bille en la matière. Saurais-tu me dire comment faire?
    Mmmerci!

  4. #4
    Membre éclairé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    août 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : août 2017
    Messages : 348
    Points : 878
    Points
    878
    Par défaut Quelle version d'Access ?
    Pour Access 2016, en utilisant l'assistant d'importation, on peut définir toutes les colonnes texte en "texte long" pour l'import, puis enregistrer le format d'importation:

    Nom : Capture.JPG
Affichages : 23
Taille : 120,7 Ko
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  5. #5
    Membre à l'essai
    Homme Profil pro
    Autres
    Inscrit en
    février 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : février 2018
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Merci pour ça, mais je voudrais pouvoir le faire en code VBA. Je veux créer une interface ACCESS pour des usagers qui ne sont pas du tout familier avec Access. Ils auront un formulaire avec un bouton "Sélection du fichier Excel", qui lance toute la procédure d'importation une fois que l'usager à choisi le fichier Excel. Puis ils navigueront dans la base importée toujours au travers de formulaires (que je n'ai pas encore créés, mais pour ceux là, je pense pouvoir me dépatouiller).

  6. #6
    Membre éclairé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    août 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : août 2017
    Messages : 348
    Points : 878
    Points
    878
    Par défaut
    J'avais compris que le format était fixe ; à ce compte il suffit de le définir une fois.
    Mais Microsoft n'est pas allé au bout de la logique, car la commande TransferSpreadsheet n'admet pas de spécification d'import, est-ce bête

    Donc il faut en premier lieu enregistrer le 2e onglet dans un autre format ; csv ou texte.
    Il faut également une spécification d'import de fichier Texte, donc exit la spécification Excel, on utilisera l'assistant sur un fichier csv (une seule fois).
    Après quoi cette spécification est utilisable avec une commande docmd.TransferText pour tous les fichiers qui respectent le format.

    Cela dit, ne serait-il pas plus simple de lier le fichier Excel (ou une copie du fichier, pour le préserver) dans la base ?
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  7. #7
    Membre à l'essai
    Homme Profil pro
    Autres
    Inscrit en
    février 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : février 2018
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Alors, j'ai essayé de lier le fichier Excel, mais il me fait la même erreur d'importation. Ce que j'essaye de faire en ce moment, c'est d'importer le fichier Excel, puis j'efface toutes les colonnes en fichiers text, puis je rajoute les mêmes colonnes en les paramétrant en format memo. Ca, j'ai su le faire, après je bloque. Je voudrais rajouter les lignes du fichier Excel dans la base que j'ai modifiée. Je ne sais toujours pas faire. Mon premier obstacle étant que le nombre total de ligne est aléatoire d'un fichier Excel à un autre. Ensuite, je ne sais pas dire "rajoute" en VBA, je ne sais que dire "Import" et en faisant cela, j'écrase la table dont j'avais modifié les colonnes text en memo. Du coup, saurait tu me dire :
    1) comment connaitre le numéro du dernier enregistrement de la feuille du fichier Excel que je veux importer; et
    2) comment rajouter les enregistrement sachant que je connaitrait alors le nombre de colonne (fixe, celui-là) et le nombre de ligne (que je viens de récupérer).
    Voilà, voilà où j'en suis.
    Encore merci pour votre disponibilité.

  8. #8
    Membre éclairé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    août 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : août 2017
    Messages : 348
    Points : 878
    Points
    878
    Par défaut
    Bizarre. Mon import de fichier Excel dans une table existante new3 procède bien par ajout (Access 2016) - on peut même ajouter n fois les mêmes ; et le nombre d'enregistrements n'y fait rien, on n'importe pas un nombre de lignes ?

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Sub TestImpExcel()
    Dim stFileX As String
     
        stFileX = "C:\temp\Test.xls"
        DoCmd.TransferSpreadsheet acImport, , "new3", stFileX
     
    End Sub

    Quel est ton code ?
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  9. #9
    Membre à l'essai
    Homme Profil pro
    Autres
    Inscrit en
    février 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : février 2018
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Alleluya... J'ai trouvé une solution entretemps... Surement un truc que vous m'avez suggéré: Avant j'allais chercher la deuxième feuille de mon fichier Excel d'origine et l'importais. Cette fois-ci, j'ai sauvegardé cette feuille sous format csv, et j'ai importé ce fichier csv sous forme de format Excel, et là, Access reconnais les colonnes qui doivent être sous format memo...
    Vous voulez les codes?

  10. #10
    Membre éclairé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    août 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : août 2017
    Messages : 348
    Points : 878
    Points
    878
    Par défaut Juste pour ceux qui cherchent aussi...
    Bonne solution de passer par un fichier .csv (voire un format texte), car Excel est aussi pénible qu'une savonnette quand on veut contrôler les formats.
    Juste pour les prochains qui seront confrontés au problème : finalement, la solution retenue consiste t-elle à lier le fichier ("sous forme de format Excel" me laissant légèrement perplexe) ?
    Ou à l'importer (a priori en utilisant docmd.TransferText?) dans une table existante avec ses colonnes Mémo?
    Merci pour le retour! (et ne pas oublier de passer le sujet en "Résolu")
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  11. #11
    Membre à l'essai
    Homme Profil pro
    Autres
    Inscrit en
    février 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : février 2018
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Ce que j'ai fait, c'est, depuis Access, en VBA, c'est sélectionner la deuxième feuille de mon fichier Excel, puis de la sauvegarder en CSV, et enfin de l'importer.
    Je ne suis pas certain que mon code soit le plus élégant, mais voici comment j'ai fait.
    Donc, au départ, j'ai un formulaire qui n'est lié à aucune table dans lequel il y a un bouton qui renvoit au code suivant:

    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
    Dim NomFeuilleExcel As String
    Dim NomFichierExcel As Variant
    Dim NomCheminFichierExcel As Variant
    Dim Antislash As String
     
     
    Dim wkb As Excel.Workbook
    Dim wks As Excel.Worksheet
     
    Dim ObjXl As Excel.Application
    ' Pour que Excel.workbook, etc. apparaissent dans la liste de déclaration, il faut aller auparavant dans Menu/Tool.Reference et sélectionner Microsoft Excel Object library
     
    NomFichierExcel = GetExcelFile
    ' La fonction GetExcelFile va me permettre de récupérer le fichier Excel qui est mis ensuite dans la chaîne de caractère NomdeFichierExcel
    ' Voici la Fonction renvoyée en module
     
    Public Function GetExcelFile()
     
        Set fDialog = Application.FileDialog(3)
       ' Pour que Filedialog apparaisse dans la liste, il faut aller auparavant dans Menu/Tool.Reference et sélectionner Microsoft Office Object Library
     
        With fDialog
     
            .AllowMultiSelect = False
            ' Ici, on ne veut qu'un seul choix possible
     
            .Title = "Please select Excel file to import"
            ' Ici on met le titre de la boite de recherche
     
            .Filters.Clear
           ' Ici on enlève les éventuels filtres d'extension
     
            .Filters.Add "Sélectionnez le Dashboard", "*.xlsm,*.xlx,*.xlsx"
            ' Ici on paramètre les extensions de fichiers que l'on veut permettre
     
            If .Show = True Then
                        GetExcelFile = .SelectedItems(1)
            ' Ici on renseigne GetExcelFile seulement si l'usager à sélectionné un fichier
            Else
                 GetExcelFile = Null
            End If
        End With
     End Function
    ' Ce code n'est pas de moi, je l'ai adapté de... Je ne sais plus, je ne l'ai pas noté. gloire à l'auteur donc
     
    ' Ci dessous, la suite du code que l'on avait laissé le temps d'expliciter la fonction appelée
    If IsNull(NomFichierExcel) = True Then
       MsgBox ("Veuillez sélectionner un fichier Excel")
       Exit Sub
    End If
    ' Le code ci-dessus permet de sortir de la procédure si aucun fichier n'est sélectionné
     
    Antislash = "\"
    NomCheminFichierExcel = GetExcelPath(NomFichierExcel, Antislash) & "MonDashboard"
     
    ' La fonction publique GetExcelPath permet de récupérer le chemin du fichier sélectionné via GetExcelFile et de rajouter le nom Mondashboard, Mondashboard ce sera le nom de mon fichier csv
    ' Là encore, je la met à la suite, tout en sachant que c'est en fait un module
    Public Function GetExcelPath(Chemin As Variant, Antislash As Variant) As Variant
    ' Chemin est le chemin complet du fichier excel, y compris son nom, et Antislash est l'antislash du chemin avant le nom du fichier excel)
    Dim position As Integer
    position = InStr(1, StrReverse(Chemin), Antislash)
    ' Ci-dessus, on a inversé l'écriture de Chemin et l'on cherche la position du premier antislash qui est le dernier dans l'écriture du chemin à l'endroit
     
     
    position = Len(Chemin) - position + 1
    ' On soustrait de la longueur du chemin la portion avant le dernier antislash
    ' On a alors le nombre de caractère contenu dans le chemin du dossier contenant le fichier Excel
     
    GetExcelPath = Left(Chemin, position)
    ' et on récupère ce chemin en le coupant juste avant la mention du nom du ficher Excel de NomFichierExcel identifié par Chemin dans la fonction
    End Function
     
    ' Retour au code de la private sub du bouton du formulaire
    Set ObjXl = New Excel.Application
    ObjXl.Visible = False
    ObjXl.UserControl = False
    ' Le code ci-dessus ouvre Excel mais ne le montre pas à l'usager
     
    Set wkb = ObjXl.Workbooks.Open(NomFichierExcel)
    ' Ce code sélectionne le fichier dont on a récupéré le chemin (NomFichierExcel)
     
    For Each wks In wkb.Worksheets
        If wks.Index = 2 Then
        wks.SaveAs NomCheminFichierExcel, 23, True
        End If
    Next
    ' Le code ci-dessus va chercher la deuxième feuille du fichier Excel et l'enregistrer sous le nom MonDashboard au même endroit que le fichier Excel initial au format csv
    Set wks = Nothing
    wkb.Close
    Set wkb = Nothing
    ObjXl.Quit
    Set ObjXl = Nothing
    ' Le code ci-dessus ferme ensuite le fichier Excel ouvert
     
    NomFichierExcel = NomCheminFichierExcel & ".csv"
    ' On reprend le chemin du fichier csv
    DoCmd.TransferText acImportDelim, , "MontableaudeBord", NomFichierExcel, True
    ' Puis on importe le fichier csv créé
     
    On Error Resume Next
    Kill NomFichierExcel
    On Error GoTo 0
    Reste pour ma part le problème suivant: comment créer un formulaire ayant comme référence une table qui n'existe pas encore (puisque la procédure ci-dessus va la créer). Mais ça, c'est une autre histoire

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

Discussions similaires

  1. importer une table excel dans phpmyadmin
    Par Ben2903 dans le forum Administration
    Réponses: 4
    Dernier message: 24/07/2012, 23h16
  2. Réponses: 3
    Dernier message: 01/03/2010, 16h42
  3. filtrer une table excel avant de remplir un combobox
    Par alexsolex dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/10/2007, 19h56
  4. Importation d'une table excel avec nom paramétrable
    Par mastasushi dans le forum Access
    Réponses: 4
    Dernier message: 13/02/2007, 19h20
  5. Réponses: 6
    Dernier message: 15/05/2006, 17h04

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