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 :

Comment faire une requête sur des tables DBF de même nom mais stockées dans des répertoires différents ?


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut Comment faire une requête sur des tables DBF de même nom mais stockées dans des répertoires différents ?
    Bonjour,

    J'ai du mal à démarrer un projet de base de données de par la conception dynamique.

    Je souhaiterais établir différents états dans une BDD ACCESS basés sur des données qui sont stockées dans des fichiers de structure DBF. Ces fichiers DBF de même nom sont présents dans des répertoires différents. Pour ne pas à devoir attacher ou importer toutes ces tables DBF dans une BDD ACCESS, je voudrais en rendre l'accès dynamique à ces données via une requête SQL par code VBA.

    J'ai déjà pu mettre en place un système comparable en XL avec du code VBA grâce à de l'aide mais en ACCESS, je manque totalement de notions.

    Voici le shema :

    Les tables DBF :

    Répertoire principal de stockage: c:\données

    Sous-répertoires de stockage des tables DBF :

    c:\données\client1\table.dbf
    c:\données\client2\table.dbf
    c:\données\client3\table.dbf
    c:\données\client4\table.dbf
    ....


    Je dispose également d'une table DBF que j'ai attaché dans la BDD ACCESS et qui stocke dans un champ les noms de dossiers (sous-répertoires) mais pas le chemin du répertoire principal (c:\données). Cette table est mise à jour dans une autre application :
    c:\données\clients.dbf > champ "PATH" qui contient (client1, client2, client3,...)

    Ma question :
    Comment afficher une requête sql en VBA qui affiche le contenu du fichier table.dbf du client qui aurait été choisi via la table c:\données\clients.dbf ?

    En excel, j'utilise une combobox pour le choix du client alimenté par la table clients.dbf. Le choix du client sert ensuite à importer le fichier table.dbf concerné dans une feuille XL.

    D'avance merci pour vos lumières.

  2. #2
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour rcan7412,

    J'avais développé un projet similaire il y a quelques année.
    Je te communique le module (à réimporter dans ton projet) d'attachement des tables. Il y aura surement du ménage et des adaptations à faire, mais il est parfaitement opérationnel.

    pour lancer les fonction, j'avais mis dans le formulaire de démarrage la procédure suivante :


    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
    Private Sub Form_Load()
      Me.TxtInfoRefTabAttache.Caption = ""
      ConnectX
        ' Essaie de voir si la base de données Accueil est disponible.
        If VérifierAttaches() = False Then
            ' Essaie de relier les tables; si cela rate,
            ' Solutions du développeur se termine.
            If RattacherTables() = False Then
               DoCmd.Close acForm, "Démarrage"
               Exit Sub
            End If
        End If
      Me.TxtInfoRefTabAttache.Caption = InfoTabAttache
     
    End Sub
    Tu n'aura plus qu'à l'adapter en demandant à l'utilisateur de choisir sur quelle base il souhaite se connecter.
    Fichiers attachés Fichiers attachés

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut
    Bonjour Dumas.blr,

    Merci d'avoir répondu à mon post et de livrer ton projet.
    Comme précisé, je ne suis pas habitué à coder et j'avoue avoir du mal à comprendre ton code malgré le fait qu'il est commenté.

    Sans vouloir abuser, pourrais-je avoir un code VBA qui permet déjà l'affichage d'une requête basée sur un fichier DBF comme celui-ci c:\données\client1\table.dbf (avec CHAMP1, CHAMP2, CHAMP3) ou tout au moins un endroit où trouver mon bonheur.

    Je cherche de tout côté et je n'arrive pas à trouver ce préalable.

    Merci

  4. #4
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Peux-tu nous communiquer le code VBA que tu avais écrit en Excel ?
    Je pense qu'il y a beaucoup d'éléments de code qui pourraient être réutilisés.

    L'avantage de la solution que j'avais implémenté est que je ne travaillais que sur une seule table liée. Je changeais juste la source de connexion par rapport au fichier .DBF, puisque la structure du fichier restait identique.

  5. #5
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Sans vouloir abuser, pourrais-je avoir un code VBA qui permet déjà l'affichage d'une requête basée sur un fichier DBF comme celui-ci c:\données\client1\table.dbf (avec CHAMP1, CHAMP2, CHAMP3) ou tout au moins un endroit où trouver mon bonheur.
    Attention, si tu ouvre une requête via le VBA, tu sera obligé de gérer toutes les opérations d'accès en VBA par la suite, ce qui me parait une solution compliquée, surtout si tu n'est pas familiarisé avec la programmation.

    La solution la plus sage (pour moi), serait d'ajouter la nouvelle connexion (donc, dans le catalogue Access) sur ta table .DBF, et de travailler ensuite sur la table liée. La seule contrainte étant que les différentes tables .dbf auxquelles tu accèdent aient toutes une structure identique

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut
    Encore merci pour ton attention et ton aide dumas.blr.

    Voici des réponses à tes questions :
    La solution la plus sage (pour moi), serait d'ajouter la nouvelle connexion (donc, dans le catalogue Access) sur ta table .DBF, et de travailler ensuite sur la table liée.
    Y-a-t-il une procédure pour y parvenir ?

    La seule contrainte étant que les différentes tables .dbf auxquelles tu accèdent aient toutes une structure identique
    Là je confirme, car ces tables sont créées en externe par un logiciel comptable.

    Je te livre ci-après le code VBA d'excel :

    Un userform qui permettait de choisir le client et alimenté par une table dbf qui contient le sous-répertoire du client :

    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 Userform_Initialize()
    'Private Sub CommandButton1_Click()
    'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Lib rary
    Dim Cn As ADODB.Connection
    Dim Rs As ADODB.Recordset
    Dim Chemin As String, Cible As String, laBase As String
     
    'Chemin = ThisWorkbook.Path
    Chemin = Sheets("Calcul").Range("REPEVOL")
    laBase = "societes.dbf"
     
    With ComboBox1
    .Clear 'suppression anciennes données dans combobox
    .ColumnCount = 4 'nombre de colonnes
    'Il y aura 4 colonnes dans ComboBox
    .ColumnWidths = "130;0;0;0" 'largeur colonnes
    End With
     
    Set Cn = New ADODB.Connection
    Cn.Open _
    "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
    Chemin & ";"
     
    'pour la recuperation des champs RAIS ,PATH ,DATEDEB,DATEFIN
    Cible = "SELECT RAIS,PATH,DATEDEB,DATEFIN FROM " & laBase & " ORDER BY RAIS ;"
     
    Set Rs = New Recordset
    Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic
     
    Do While Not Rs.EOF
    ComboBox1.AddItem Rs.Fields(0).Value 'champ RAIS
    ComboBox1.List(ComboBox1.ListCount - 1, 1) = Rs.Fields(1).Value 'champ PATH
    If Not Rs.Fields(2).Value = "" Then _
    ComboBox1.List(ComboBox1.ListCount - 1, 2) = Rs.Fields(2).Value 'DATEDEB
    If Not Rs.Fields(3).Value = "" Then _
    ComboBox1.List(ComboBox1.ListCount - 1, 3) = Rs.Fields(3).Value 'DATEFIN
    Rs.MoveNext
    Loop
     
    Rs.Close
    Cn.Close
    End Sub
    Et voici la procédure d'importation des données du client choisi dans le userform ci-avant :

    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
    Private Sub ImportBalance()
    'Procédure d'importation du fichier balance.dbf
    Dim Cn As ADODB.Connection
    Dim Rs As ADODB.Recordset
    Dim Chemin As String, Cible As String, laBase As String
    Dim Fld As ADODB.Field
    Dim i As Integer
     
    If ComboBox1.ListIndex = -1 Then Exit Sub
     
    Chemin = "C:\evolution\" & ComboBox1.List(ComboBox1.ListIndex, 1)
    laBase = "Balance.dbf"
     
    'efface la feuille Balance
    Sheets("Balance").Select
    Range("A1").Select
    Selection.CurrentRegion.Select
    Selection.ClearContents
    Range("A1").Select
     
     
    Set Cn = New ADODB.Connection
    Cn.Open _
    "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
    Chemin & ";"
     
     
    Cible = "SELECT COMPTES, INTITULE, SOLDE FROM " & laBase & ""
     
    Set Rs = New Recordset
    Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic
     
    For Each Fld In Rs.Fields
    i = i + 1
    Sheets("Balance").Cells(1, i) = Fld.Name
    Next Fld
     
     
    Do While Not Rs.EOF
    Sheets("Balance").Range("A2").CopyFromRecordset Rs
    Loop
     
    End Sub
    Le shema thérorique détaillé en début de post adapté à mon exemple est le suivant :

    Les tables DBF :

    Répertoire principal de stockage: c:\evolution

    La table signalétique clients qui alimente le combobox dans le userform :
    c:\evolution\societes.dbf > champ "PATH" qui contient (client1, client2, client3,...)


    Sous-répertoires de stockage des tables DBF :

    c:\evolution\client1\balance.dbf
    c:\evolution\client2\balance.dbf
    c:\evolution\client3\balance.dbf

    Tous les fichiers balance.dbf ont donc la même structure.

    L'idée était comme dans un excel, d'avoir un formulaire alimenté par le fichier societes.dbf (signalétique client) pour faire le choix du client puis dès le choix opéré, afficher les données du fichier balance.dbf du client choisi avec requête éventuelle.

    Est-ce clair ?

  7. #7
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour rcan7412,

    Ayant des impératif, je ne pourrai pas te répondre complètement tout de suite.

    Je voulais juste savoir si le fichier societes.dbf était toujours utilisé dans ton projet ? Dans ce cas, on peut lier la table de manière permanente et l'utiliser pour alimenter la listbox/combobox.

    Il resterait juste à effectuer un rafraichissement dynamique sur la table cible (chose qui est déjà présente dans mon code).

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut
    Re,

    Ayant des impératif, je ne pourrai pas te répondre complètement tout de suite.
    Bien sûr, je ne veux surtout pas abuser.

    Je voulais juste savoir si le fichier societes.dbf était toujours utilisé dans ton projet ? Dans ce cas, on peut lier la table de manière permanente et l'utiliser pour alimenter la listbox/combobox.
    Je confirme, le fichier societes.dbf est toujours utilisé et peut être lié de façon permanente.

    A te lire

  9. #9
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Très bien,

    Peux-tu commencer à :
    - lier ta table societes.dbf dans ta BDD (en utilisant le ruban "données externes")
    - créer ton formulaire de choix de la BDD cible avec la listbox ou combobox ?

    Après, on pourra passer à la deuxième partie.

    A bientôt sur le forum

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    Voilà, j'ai donc lié la table societes.dbf (elle l'était déjà) et j'ai crée un formulaire qui reprend une combobox qui permet de choisir le client.

    J'alimente la combobox avec cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SOCIETES.NUM, SOCIETES.RAIS
    FROM SOCIETES
    ORDER BY SOCIETES.RAIS;
    J'utilise la champ SOCIETES.NUM (valeur numérique) comme identifiant de société car bien qu'elle ne soit pas une clé primaire au sens d'access, je sais qu'elle est unique car créée par l'application externe sans intervention de l'utilisateur.

    J'ai également une textbox qui affiche le nom du sous répertoire.

    Je joins en annexe une image écran du formulaire.



    Voilà est-ce en ordre ?

    Merci

  11. #11
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour rcan7412,

    J'espère avoir un peu de temps à te consacrer aujourd'hui, mais ce n'est pas garanti.

    Le chemin est renseigné. C'est bien. il serait encore mieux d'y faire figurer le chemin complet (ex : c:\documents\essai), car nous en avons besoin pour actualiser la connexion. si la racine de base reste identique, ce n'est pas grave, mais c'est moins maintenable.

    Les opérations suivantes seront à réaliser :
    1. Déconnecter la base éventuellement précédemment attachée, en supprimant la table attachée
    2. Définir une nouvelle table liée en fonction des informations de connexion
    3. connecter la nouvelle base


    ces opérations seront codées dans la procédure du validerbouton_click (ou équivalent)

    Voici un squelette de code sur lequel travailler
    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
     
    sub bouton_valider_click
    'procédure événementielle à attacher au bouton
    dim rc as boolean
        Rc = SupprimerAttaches()
        attacherTable
    end sub
     
    ' Les procédures et fonctions suivantes sont à placer dans un module externe, afin d'être visible par l'ensemble du projet
    Public Function SupprimerAttaches() As Boolean
    ' Supprime les liens à la base de données spécifiée.
    ' Retourne Vrai si tout s'est bien passé.
     
        Dim bds As Database
        Dim Cnn As ADODB.Connection
     
        Set bds = CurrentDb()
       'rajouter ici une gestion d'erreur s'il n'y a pas de table attaché pour forcer à vrai
       bds.TableDefs.Delete ("Accueil")  'suppression du lien
    Cnn.Close
    SupprimerAttaches = True     ' Liens supprimés
     
    ' rajouter ici la gestion d'erreur éventuelle pour forcer la fonction à retourner vrai
    End Function
     
     
    Sub attacherTable()
     
        Dim dbsTemp As Database
        Dim Cnn As ADODB.Connection
        Dim rstTemp As ADODB.Recordset
        Dim strMenu, strCurrentDbName As String
        Dim RetCherchAccueil As MSA_OUVRIRNOMFICHIER
        Dim dirTab As String
        Dim NomTab As String
        Dim RcCherchAccueil As Boolean
     
        Set dbsTemp = CurrentDb
            dirTab = <formulaire.chemin> 'ATTENTION A METTRE LE CHEMIN COMPLET
           NomTab = "Balance"
     
    ' Appelle la procédure ConnectOutput. Le troisième
        ' argument sera utilisé comme chaîne Connect,
        ' et le quatrième comme SourceTableName.
        If Len(Dir$(dirTab & "\" & NomTab & ".dbf")) > 0 Then
            rc_connect = ConnectOutput(dbsTemp, _
                        "dBASEtable", _
                        "dBASE 5.0;DATABASE=" & dirTab, _
                        NomTab)
            If rc_connect = False Then
               GoTo ano_connnexion
            Else
    		msgbox "connexion réussie"
                 GoTo fin
            End If
        Else
            GoTo erreur_chemin_connnexion
        End If
     
    '-----------------------------------------------------------
    ' Base liée introuvable, on la recherche dans le répertoire
    '-----------------------------------------------------------
    erreur_chemin_connnexion:
    	msgbox "le chemin de connexion est incorrect"
    ano_connnexion:
        rc_connect = False
     
    fin:
        dbsTemp.Close
     End Sub
     
    Function ConnectOutput(dbsTemp As Database, _
        strTable As String, strConnect As String, _
        strSourceTable As String) As Boolean
     
        Dim tdfLinked As TableDef
        Dim rstLinked As Recordset
        Dim intTemp As Integer
     
        ' Crée un objet TableDef, définit ses propriétés
        ' Connect et SourceTableName en fonction des
        ' arguments passéset ajoute l'objet à la
        ' collection TableDefs.
        Set tdfLinked = dbsTemp.CreateTableDef(strTable)
     
        On Error Resume Next
     
        tdfLinked.connect = strConnect
        tdfLinked.SourceTableName = strSourceTable
        dbsTemp.TableDefs.Append tdfLinked
     
        If Err = 0 Then
            tdfLinked.Name = "Accueil"
            ConnectOutput = True
        Else
            ConnectOutput = False
        End If
     End Function
    Avec ça, tu devrais pouvoir travailler correctement

    N'hésite pas à demander plus de précisions si besoin est

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut
    Bonjour Dumas.blr,

    Pas évident de tout bien comprendre !

    Je confirme que la racine de base est identique pour tous les clients. Je ne vois autrement comment faire figurer le nom complet. Dans le fichier dossier.dbf le champ path n'indique que le nom du sous-dossier du client. Je ne peut pas modifier le contenu de ce champ car il sert à l'application externe. Peut-être ta remarque vaut seulement pour le code vba ci-après.

    J'ai donc créé un bouton dans mon formulaire à laquelle j'ai attaché la procédure événementielle . Petite question : "sub" ou "private sub", la nuance est importante ?

    J'ai glissé le reste du code dans un module.
    Si j'ai bien compris on va rendre dynamique l'attache de la table "balance.dbf" du client choisi. Le nom d'attache de cette table sera "Accueil" ?

    Je sèche un peu sur ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Set dbsTemp = CurrentDb
            dirTab = <formulaire.chemin> 'ATTENTION A METTRE LE CHEMIN COMPLET
           NomTab = "Balance"
    J'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dirTab = "c:\evolution\<F_clients.CHEMIN>"
    Le dossier racine de base : c:\evolution
    Le nom du formulaire : F_clients
    Le nom du champ du formulaire à récupérer : CHEMIN

    Dois-je adapter autre chose ?

    En cliquant sur le bouton, il y a une erreur 3265 "élément non trouvé dans cette collection"
    Sur débogage, il m'arrête sur la ligne suivante :
    bds.TableDefs.Delete ("Accueil") 'suppression du lien

    Merci pour tes lumières.

  13. #13
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Ouppsss !!

    Je suis allé un peu vite dans le nettoyage de mon code !

    En préambule, une petite question : est-tu familiarisé avec la programmation VBA ? La nature de tes question me fait penser le contraire. Dans ce cas, je te conseille de lire les FAQ et tutoriels associés sur le forum. Ils sont très bien fait. Regarde par exemple ici.

    Tout d'abords pour la procédure événementielle :

    Ne touche pas au sub. Il vaut mieux qu'il reste Private. Cela signifie que la portée de ta procédure sera limitée à ton formulaire. Si tu veux qu'un procédure/fonction soit visible sur l'ensemble d'un projet, il vaut mieux la mettre en PUBLIC, mais aussi, il faut la mettre dans un module externe.

    Ensuite, sur les procédures et fonctions au niveau module :
    1. Quand j'écris <formulaire.chemin>, cela signifie que tu doit remplacer cet chaine de caractère par la variable issue de ton formulaire
    Par exemple, si ton formulaire possède un controle nommé "chemin", utilise la variable me.chemin (ou me!chemin. N'hésite pas à utiliser les listes de choix proposées.
    Dans ce cas j'écrirais alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dirTab = "c:\evolution\" & me.CHEMIN
    2. pour la suppression du lien :
    Il fallait lire bien sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bds.TableDefs.Delete ("balance")  'suppression du lien
    puisque tu rafraichiras la table Balance, alors ton erreur
    En cliquant sur le bouton, il y a une erreur 3265 "élément non trouvé dans cette collection"
    Sur débogage, il m'arrête sur la ligne suivante :
    bds.TableDefs.Delete ("Accueil") 'suppression du lien
    devrait disparaitre, puisque dans le cas présent, tu demandais de supprimer une table qui n'existe pas.

    NB : C'est pour cela que je t'ai conseillé d'écrire une routine de gestion d'erreur : en effet, il se peut très bien (en tout cas, pour la première fois) que tu n'aie pas encore lié ta table BALANCE à ta base de donnée. Cette erreur est donc "normale", et ne devrait pas interrompre l'exécution de ton traitement. Il faut donc intégrer une routine de gestion d'erreur de type ON ERROR (regarde l'aide Access si tu ne connais pas la syntaxe, ainsi que les FAQ et tutos du forum)

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut
    Re-

    Oui, me voilà démasqué. Effectivement je ne suis pas familié avec la programmation et de surplus avec le VBA. J'ai suivi quelques formations rudimentaires en VBA pour EXCEL mais c'est tout. Tu pourras le constater, mon métier s'éloigne du tien.

    Je voudrais consacrer toute mon énergie à établir des requêtes et états sur base des données produites par la fameuse application externe qui est un progiciel de comptabilité. Mais pour faciliter l'automatisation quelques procédures en VBA devraient me suffire. Excel offre l'avantage d'être plus accessible au profane mais dès qu'on souhaite aller plus loin avec une base de données relationnelle, access semble incontournable. J'ai pu obtenir en excel vba le résultat escompté (obtenir de manière dynamique des données stockées dans fichiers dbf et gérés par un logiciel externe) que je n'arrive pas à concrétiser en access.

    Je tâcherai de prendre un peu de temps sur les tutoriels du site pour me familiariser avec cette programmation.

    Pour revenir à mon projet, j'ai suivi tes instructions mais le résultat est le même (erreur 3265).


  15. #15
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Dammned, Sherlock Homes a encore frappé ...

    Concernant ton erreur 3265, te rappelles-tu ce que j'avais noté ?

    NB : C'est pour cela que je t'ai conseillé d'écrire une routine de gestion d'erreur : en effet, il se peut très bien (en tout cas, pour la première fois) que tu n'aie pas encore lié ta table BALANCE à ta base de donnée. Cette erreur est donc "normale", et ne devrait pas interrompre l'exécution de ton traitement. Il faut donc intégrer une routine de gestion d'erreur de type ON ERROR (regarde l'aide Access si tu ne connais pas la syntaxe, ainsi que les FAQ et tutos du forum)
    Avant de tester ta procédure, je te conseille tout d'abords de faire la liaison de ta table balance à la main, afin que la connexion existe déjà. Par la suite, essaye de faire la gestion d'erreur.

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    J'ai attaché la table manuellement et j'ai un autre code d'erreur :

    erreur d'exécution 91 - variable objet ou variable de bloc With non définie

    il s'arrête sur cette expresse : Cnn.Close, juste aprsè celle-ci : bds.TableDefs.Delete ("BALANCE") 'suppression du lien

    Or j'ai attaché la table au préalable ?

  17. #17
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Et oui ... le ménage du code n'a pas été bien fait ...

    Tu peux supprimer cette instruction que j'ai oublié d'enlever.

    N'oublie pas de ré-attacher ta table (parce ça, cç s'est bien passé !!!)

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    Sorry, je n'ai pas pu répondre plus tôt.

    Faut-il supprimer uniquement l'expression : Cnn.Close ?

    En le faisant, j'ai encore un message d'erreur :
    Erreur de compilation : type défini par l'utilisateur non défini et il s'arrête sur :

    Dim RetCherchAccueil As MSA_OUVRIRNOMFICHIER

    Dans la procédure : Sub attacherTable()

    Pas facile pour moi tout ça

  19. #19
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour,

    si RetCherchAccueil n'est pas utilisé dans le reste du code, tu peux supprimer cette déclaration.
    A l'origine, cette variable était déclarée (ainsi que le type MSA_OUVRIRNOMFICHIER) pour récupérer la sélection d'un répertoire à partir de la fenêtre explorateur de windows. Comme ton répertoire est diectement renseigné dans ta table .DBF, tu ne devrais pas en avoir besoin

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 26
    Points
    26
    Par défaut
    J'ai la poisse !

    Arrêt sur me.

    Erreur de compilation : utilisation incorrecte du mot clé Me


Discussions similaires

  1. Comment faire une requête sur un intervalle
    Par niamo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/05/2010, 10h49
  2. Réponses: 4
    Dernier message: 29/12/2008, 09h04
  3. Comment faire une requête "AJOUT" multi-tables ?
    Par jinnk dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/01/2008, 09h26
  4. [BDE] Comment faire une requête sur 2 Ttables ?
    Par dim07 dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/12/2006, 12h15
  5. faire une requête sur plusieurs tables
    Par julien.63 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 16/08/2006, 22h58

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