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 :

Boîte de dialogue d'import de fichier en VBA


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut Boîte de dialogue d'import de fichier en VBA
    Bonjour,

    Je travaille sur Access 2007, et je souhaite rendre plus dynamique mon application. Ce que je cherche à faire c'est :
    - Aller chercher un fichier sur mon poste
    - Sélectionner l'onglet du fichier en question à importer
    - Exécuter l'importation dans une table déjà existante

    Est-ce que qqs lignes de code pas trop compliqué permettrait de faire ça ?

    Merci beaucoup pour vos réponses !
    EM

  2. #2
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Voila un exemple de code pour récupérer un fichier dans une variable sFichier :
    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 TestSelectionFichier()
    Dim oFDlg As Object
    Dim sFichier As String
     
    ' Initialisation variable objet oFDlg
    Set oFDlg = Application.FileDialog(1)  ' msoFileDialogOpen = 1, msoFileDialogSaveAs = 2
    ' Titre de la boîte de dialogue
    oFDlg.Title = "Sélectionner le fichier"
    ' Dossier de départ
    oFDlg.InitialFileName = CurrentProject.Path
    ' Sélection multiple = Non
    oFDlg.AllowMultiSelect = False
    ' Filtre
    oFDlg.Filters.Clear
    oFDlg.Filters.Add "Fichier Excel ou Csv", "*.csv;*.xl*"
     
    ' Affichage de la boîte de dialogue
    sFichier = ""
    If oFDlg.Show Then
       sFichier = oFDlg.SelectedItems(1)
    End If
    ' Libération variable objet
    Set oFDlg = Nothing
     
    ' Exploitation résultat
    ' Soit la variable sFichier est vide (longueur = 0)
    ' soit elle contient un chemin complet + nom de fichier
    If Len(sFichier) = 0 Then
       MsgBox "Aucune sélection", , "Fichier sélectionné"
    Else
       MsgBox sFichier, , "Fichier sélectionné"
    End If
    End Sub
    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    Bonjour,

    Merci pour cette réponse.
    Je l'ai testé mais ça ne fait pas ce que je souhaite.

    Je voudrais ouvrir un fichier excel, sélectionner un onglet particulier, et l'importer dans Access dans une table existante (écraser les données).
    Exactement comme la fonction d'import de données externes, mais appliquée à un bouton dans un formulaire.

    Je ne sais pas si je suis assez claire...

    Merci pour votre aide !

  4. #4
    Expert confirmé
    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
    Par défaut
    Bonsoir,

    Mon code ne fait pas plus que ce que j'ai écrit qu'il faisait. Récupérer un nom de fichier.

    Comme je ne savais pas qu'il s'agissait de fichiers Excel, je pensais que le terme «onglet» faisait référence à autre chose.

    Voila un exemple complet.
    Créer un nouveau formulaire.
    Ajouter ...
    • Un bouton et le nommer cmdChoisirFichier.
      (Rappel : le nom d'un contrôle est la propriété «Nom» que l'on trouve dans l'onglet «Autres» de la feuille de propriétés)
    • Une zone texte et la nommer txtFichier
    • Une zone de liste et la nommer lstOngletsExcel.
      Feuille de propriétés, onglet «Données» :
      Origine Source : Liste valeurs
    • Un bouton et le nommer cmdImporterOnglet


    Code de l'événement «sur clic» du bouton cmdChoisirFichier:
    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
    Private Sub cmdChoisirFichier_Click()
    Dim oFDlg As Object, sFichier As String
    Dim xldb As DAO.Database, tdf As DAO.TableDef
    Dim sListOnglets As String, sOnglet As String
     
    On Error GoTo ErrH
     
    ' Initialisation variable objet oFDlg
    Set oFDlg = Application.FileDialog(1)  ' msoFileDialogOpen = 1, msoFileDialogSaveAs = 2
    ' Titre de la boîte de dialogue
    oFDlg.Title = "Sélectionner le fichier"
    ' Dossier de départ
    oFDlg.InitialFileName = CurrentProject.Path
    ' Sélection multiple = Non
    oFDlg.AllowMultiSelect = False
    ' Filtre
    oFDlg.Filters.Clear
    oFDlg.Filters.Add "Fichier Excel", "*.xl*"
     
    ' Affichage de la boîte de dialogue
    sFichier = ""
    If oFDlg.Show Then
       sFichier = oFDlg.SelectedItems(1)
    End If
    ' Libération variable objet
    Set oFDlg = Nothing
     
    ' Exploitation résultat
    ' Soit la variable sFichier est vide (longueur = 0)
    ' soit elle contient un chemin complet + nom de fichier
    If Len(sFichier) = 0 Then
       Me.txtFichier = ""
       Me.lstOngletsExcel.RowSource = ""
    Else
       Me.txtFichier = sFichier
       ' On ouvre le fichier excel avec DAO
       Set xldb = DAO.DBEngine.OpenDatabase(sFichier, False, True, "Excel 12.0")
       ' On énumère les onglets (=table)
       sListOnglets = ""
       For Each tdf In xldb.TableDefs
           sOnglet = NettoyerNomOnglet(tdf.Name)
           If Len(sOnglet) > 0 Then sListOnglets = sListOnglets & sOnglet & ";"
       Next
       ' On ferme le fichier excel
       xldb.Close
       Set xldb = Nothing
       ' On met à jour la liste des onglets
       If Len(sListOnglets) > 0 Then
          sListOnglets = Left(sListOnglets, Len(sListOnglets) - 1)
          Me.lstOngletsExcel.RowSource = sListOnglets
       Else
         Me.lstOngletsExcel.RowSource = ""
       End If
    End If
     
    Sortie:
    Exit Sub
     
    ErrH:
    MsgBox "Erreur No. " & Err.Number & " : " & Err.Description
    Resume Sortie
     
    End Sub
    En dessous du code de la sub ci-dessus, coller cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function NettoyerNomOnglet(sNom As String) As String
    ' Retirer guillemets simples
    If sNom Like "'*'" Then sNom = Mid(sNom, 2, Len(sNom) - 2)
    ' Si le nom finit par "$" c'est un onglet, sinon on ignore
    If Right(sNom, 1) = "$" Then
       sNom = Left(sNom, Len(sNom) - 1)
    Else
       sNom = ""
    End If
    NettoyerNomOnglet = sNom
    End Function
    Tant qu'on est dans l'éditeur Visual Basic, vérifier que l'une de ces deux références est cochée :
    • «Microsoft Office 12.0 Access database engine Object Library»
      ou
    • «Microsoft DAO 3.6 Object Library»

    Jusqu'à présent on peut sélectionner un fichier excel et afficher ses onglets dans la zone de liste lstOngletsExcel.
    Le nom complet du fichier est mis dans la zone de texte txtFichier.

    Voici maintenant le code de l'événement «sur clic» du bouton cmdImporterOnglet :
    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
    Private Sub cmdImporterOnglet_Click()
    Dim sFichier As String, sOnglet As String
    Dim sTableDestination As String
     
    ' Table dans laquelle on va importer les données
    sTableDestination = "test"
     
    On Error Resume Next
    ' On s'assure que la table est fermée
    DoCmd.Close acTable, sTableDestination, acSavePrompt
     
    ' Si on veut détruire la table avant d'importer
    'DoCmd.DeleteObject acTable, sTableDestination
     
    ' Si on veut simplement vider la table avant d'importer
    'Application.CurrentDb.Execute "DELETE FROM [" & sTableDestination & "]"
     
    On Error GoTo ErrH
     
    ' Récupérer le nom (complet) du fichier et de l'onglet
    sFichier = Nz(Me.txtFichier, "")
    sOnglet = Nz(Me.lstOngletsExcel, "")
     
    If Len(sFichier) > 0 Then
       If Len(sOnglet) > 0 Then
          sOnglet = sOnglet & "!"
          ' Importer l'onglet
          DoCmd.TransferSpreadsheet acImport, , sTableDestination, sFichier, True, sOnglet
       Else
          ' Importer l'onglet par défaut (le premier du fichier)
          DoCmd.TransferSpreadsheet acImport, , sTableDestination, sFichier, True
       End If
       DoCmd.OpenTable sTableDestination
    End If
     
    Sortie:
    Exit Sub
     
    ErrH:
    MsgBox "Erreur No. " & Err.Number & " : " & Err.Description
    Resume Sortie
    End Sub
    Ici on met le nom de la table de destination (test dans mon exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Table dans laquelle on va importer les données
    sTableDestination = "test"
    A+

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 38
    Par défaut
    Bonjour LedZeppII,

    ton code à l'air super, et je souhaitais savoir s'il est possible de l'adapter pour mon cas.

    J'ai des fichiers Excel (qui ne contiennent qu'un onglet), qui ont tous une structure semblable.
    Je souhaiterais pour ma part faire la même chose avec la liste déroulante, mais ne pas écraser dans la même table. Il faudrait que le code créer une nouvelle table dans access pour chaque tableur Excel choisi, et dont je peux choisir le nom.

    Penses-tu que c'est possible? Car pour l'instant je fonctionne avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub importmultiples()
    Dim i As Integer
     
    ChDir "C:\Users\Desktop\Travaux\FormatPivotAnalyse\FormatPivot"
    monfichier = Dir("*.*")
    i = 1
    On Error Resume Next
      While monfichier <> ""
          DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "pivot n°" & i, monfichier, True
          monfichier = Dir()
          i = i + 1
      Wend
    End Sub
    Qui importe tous mes fichiers contenus dans le répertoire, mais le soucis c'est que je ne peux pas choisir le nom (j'aimerais que ce soit une date à la place de pivot numéro i, du genre pivot du 30062013, pivot du 31122013, un truc dans le genre). Mais impossible de modifier quoique ce soit depuis ce code...

    Si ton code peut-être adapté, il serait parfait pour ce que je veux!

    Merci d'avance!

  6. #6
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Est-ce qu'on peut récupérer cette date quelque part ?
    Dans le nom du fichier ou dans le nom de l'onglet ?

    Sinon je pense qu'il faut remplir une table avec les noms de fichiers Excel et leurs onglets, pour que tu puisse taper le nom de la table à créer.
    Cette table serait affichée en tant que sous-formulaire.
    Fichier Excel Onglet Nom Table
    fichier1.xls Feuil1 04042014
    fichier2.xls Feuil1 05042014
    fichier3.xls Feuil1 07042014


    A+

Discussions similaires

  1. [VI-2007] Ouverture d'une boîte de dialogue pour ouvrir un fichier
    Par Ariaar dans le forum Visio
    Réponses: 3
    Dernier message: 14/12/2012, 16h56
  2. Réponses: 4
    Dernier message: 28/07/2007, 13h04
  3. Réponses: 2
    Dernier message: 09/01/2007, 10h21
  4. Réponses: 3
    Dernier message: 25/12/2006, 17h28
  5. Réponses: 2
    Dernier message: 27/10/2006, 16h11

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