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

Contribuez Discussion :

Modélisation des liaisons entre userform et table de données Excel (tableau structuré)


Sujet :

Contribuez

  1. #1
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut Modélisation des liaisons entre userform et table de données Excel (tableau structuré)
    Salut.

    Pour répondre à la question fréquente sur nos forums "Comment lier un userform à un tableau structuré?" et pour faire écho à la contribution de Qwazerty, je propose ici une modélisation des interactions entre un userform et une table de données (appelée aussi Tableau structuré Excel).

    Pour celles et ceux qui ne voient pas bien ce qu'est un tableau structuré, je propose la lecture de mon tuto sur le sujet. Je précise qu'en 2019, il me semble aberrant de continuer à travailler avec Excel sans tableaux structurés. Je vois encore passer trop souvent des codes qui utilisent des lignes telles que TblBD = f.Range("D8:H" & f.[D65000].End(xlUp).Row) alors que cela fait 12 ans que les tableaux structurés existent et permettent de s'affranchir d'un code lourd, d'une liaison des données à une feuille et d'un bornage des données sur une colonne bien précise. C'est du passé, tout cela, et il est temps d'utiliser les outils actuels d'Excel qui allègent l'écriture du code et facilitent la maintenance et l'évolution de l'application.

    Cette contribution découle du fait que l'on réinvente souvent la roue lorsqu'il s'agit de lier userform et tableau structuré, alors qu'en fait, le processus est toujours le même:
    • Dans le sens Table vers Userform, il faut alimenter les contrôles du userform avec les données d'une ligne précise de la table;
    • Dans le sens Userform vers Table, il faut alimenter les cellules d'une ligne précise de la table avec les données du userform.


    Vous trouverez le fichier joint qui contient la classe personnalisée DataUsfManager ainsi que le module de classe. C'est elle qui va piloter les actions entre userform et table. Il vous suffira d'ajouter ce module de classe à votre projet Excel pour pouvoir lier facilement et de manière générique vos userforms et vos tables de données, en vous appuyant sur les explications ci-dessous pour "faire prendre la mayonnaise".

    Le principe est de lier le userform à la table de données grâce à un array qui mappe les contrôles du userform et les colonnes de la table. Lors des transferts de données Usf=>table ou table=>Usf, cet array est parcouru pour transvaser les valeurs. Il faudra donc, pour chaque paire Usf/Table, créer l'array de mappage. Dans un premier temps, je créerai l'array "en dur", mais je développerai plus loin une technique pour créer l'array sur base d'un tableau structuré Excel.

    Pour expliquer le fonctionnement de cette classe, je vais m'appuyer dans un premier temps sur le tableau suivant, qui reprend des données de contact. il est illustré ici avec le userform qui lui est lié et qui permettra d'ajouter, de modifier ou de supprimer des données de contact dans la table de données. Nous verrons par la suite comment utiliser la classe avec un autre tableau.
    Nom : 2019-12-28_075640.png
Affichages : 3452
Taille : 13,1 Ko

    Dans ce userform, nous voyons une liste déroulante qui s'appuie sur une table de données monocolonne contenant les fonctions qu'il est possible d'attribuer à un contact.

    Nous devons pouvoir, à l'aide du userform:
    1. créer un nouvel enregistrement;
    2. supprimer un enregistrement;
    3. aller à l'enregistrement suivant;
    4. aller à l'enregistrement précédent;
    5. aller à l'enregistrement qui se trouve à la position x;
    6. enregistrer les modifications du contact ou les données du nouveau contact;
    7. quitter le userform.



    Ces 7 actions correspondent aux 7 contrôles du bas du userform, et, sauf l'action de quitter le userform, nous allons les retrouver au niveau de notre classe perso, dont je donne le code ci-dessous. Cette classe contiendra également la fonction qui transfère les données entre la table et le userform.
    1. GotoNew;
    2. Delete;
    3. GotoNext;
    4. GotoPrevious;
    5. GotoRecord;
    6. UpdateTable;
    7. UpdateUsf.


    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
    Option Explicit
     
    Public Map
     
    Private mIndex As Long
    Private mTable As ListObject
    Private mUsf As UserForm
     
    Property Get Index() As Long
      Index = mIndex
    End Property
     
    Property Let Table(Value As ListObject)
      Set mTable = Value
    End Property
     
    Property Let Usf(Value As UserForm)
      Set mUsf = Value
    End Property
     
    Function GoToPrevious() As Long
      If mIndex > 1 Then
        mIndex = mIndex - 1
        updateUserform
      Else
        GoToPrevious = 1
      End If
    End Function
     
    Function GoToNext() As Long
      If mIndex < mTable.ListRows.Count Then
        mIndex = mIndex + 1
        updateUserform
      Else
        GoToNext = 1
      End If
    End Function
     
    Function GotoRecord(Index As Long) As Long
      If mTable.ListRows.Count >= Index And mTable.ListRows.Count > 0 And Index >= 1 Then
        mIndex = Index
        updateUserform
      Else
        GotoRecord = 1
      End If
    End Function
     
    Sub GotoNew()
      mIndex = 0
    End Sub
     
    Function Delete() As Long
      mTable.ListRows(mIndex).Delete
      If mTable.ListRows.Count > 0 Then
        If mIndex > mTable.ListRows.Count Then mIndex = mTable.ListRows.Count
        updateUserform
      Else
        Delete = 1
      End If
    End Function
     
    Sub updateUserform()
      Dim r As ListRow
      Dim Counter As Long
      Dim ControlName As String
      Dim ColumnName As String
     
      Set r = mTable.ListRows(mIndex)
      For Counter = 1 To UBound(Map, 2)
        mUsf.Controls(Map(1, Counter)).Value = r.Range(mTable.ListColumns(Map(2, Counter)).Index).Value
      Next
    End Sub
     
    Sub UpdateTable()
      Dim r As ListRow
      Dim Counter As Long
      Dim ControlName As String
      Dim ColumnName As String
     
      If mIndex = 0 Then
        mTable.ListRows.Add
        mIndex = mTable.ListRows.Count
      End If
      Set r = mTable.ListRows(mIndex)
      For Counter = 1 To UBound(Map, 2)
        r.Range(mTable.ListColumns(Map(2, Counter)).Index).Value = mUsf.Controls(Map(1, Counter)).Value
      Next
    End Sub
    Dans le cadre d'une contribution, je n'explique pas en détails chaque procédure. Normalement, la lecture du code suffit à le comprendre. On remarquera que les actions sont réalisées par des fonctions, car le userform pourra se servir des valeurs renvoyées par les fonctions du DataUsfManager pour informer l'utilisateur, notamment. Je précise toutefois que l'array de mappage est créé "transposé". cela veut dire qu'il contient deux lignes (une pour le nom du contrôle du usf, une pour le nom de la colonne de la table) et autant de colonnes qu'il y a de paires contrôle/colonne. Je vous expliquerai plus loin pourquoi j'ai procédé ainsi. Vous pouvez vous rendre compte de cela dans les deux procédures UpdateTable et UpdateUsf. Vous remarquez aussi qu'il n'y a qu'une fois la procédure de transfert usf=>table.

    Le userform va embarquer un objet de type DataUsfManager et ce dernier sera appelé et manipulé lors des clics sur les différents boutons ou lors de la modification du numéro de l'enregistrement que l'on souhaite atteindre. Ici aussi, le code est à mon avis assez parlant. J'utilise ici l'évènement Initialize ud userform pour créer l'objet de type DataUsfManager. On remarque que les codes évènementiels des boutons pour les actions liées à la table se servent des valeurs renvoyées par le DataUsfManager pour afficher des messages à l'utilisateur.
    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
    Option Explicit
     
    Private mDataManager As DataUSFManager
     
    Property Get DataManager() As DataUSFManager
      Set DataManager = mDataManager
    End Property
     
    Private Sub btnDelete_Click()
      If mDataManager.Delete() = 1 Then
        ClearForm
        MsgBox "La table est vide"
      End If
    End Sub
     
    Private Sub btnNew_Click()
      ClearForm
      mDataManager.GotoNew
    End Sub
     
    Private Sub btnNext_Click()
      Dim Result As Long
     
      With mDataManager
        Result = .GoToNext()
        tboIndex = .Index
      End With
      If Result = 1 Then MsgBox "Vous êtes au dernier enregistrement"
    End Sub
     
    Private Sub btnPrevious_Click()
      Dim Result As Long
     
      With mDataManager
        Result = .GoToPrevious()
        tboIndex = .Index
      End With
      If Result = 1 Then MsgBox "Vous êtes au premier enregistrement"
    End Sub
     
    Private Sub btnQuit_Click()
      Me.Hide
    End Sub
     
    Private Sub btnSave_Click()
      With mDataManager
        .UpdateTable
        tboIndex = .Index
      End With
    End Sub
     
    Private Sub tboIndex_AfterUpdate()
      Dim Result As Long
     
      With mDataManager
        Result = .GotoRecord(tboIndex.Value)
        If Result = 1 Then
          MsgBox "Vous êtes hors limites de la table"
          If .Index <> 0 Then
            tboIndex = .Index
          Else
            tboIndex = ""
          End If
        End If
      End With
    End Sub
     
     
    Private Sub UserForm_Initialize()
      Set mDataManager = New DataUSFManager
      mDataManager.Usf = Me
    End Sub
     
    Sub ClearForm()
      tboFirstName.Value = ""
      tboLastName.Value = ""
      tboIndex = ""
      cboFunction.ListIndex = -1
    End Sub
    Je pense que, d'une manière générale, le code se passe de commentaires. Il faut toutefois bien observer ce qui suit: Le DataUsfManager n'utilise pas en hard coding la structure du formulaire. Il ne fait qu'utiliser les contrôles qui lui ont été passés dans l'array de mappage. Cela signifie, et c'est important de le signaler, que mis à part le fait d'embarquer un objet DataUsfManager, le userform ne doit respecter aucune contrainte de structure. Par exemple, ce n'est pas le DataUsfManager qui doit mettre à jour le textbox tboIndex, car il "ne sait pas" que ce contrôle existe dans le userform et ce contrôle pourrait très bien ne pas être présent sans que cela nuise au fonctionnement du DataUsfManager. Ce n'est pas le DataUsfManager qui affiche les messages à l'utilisateur, car ce n'est pas son rôle. Par contre, il envoie des infos au userform sous forme de résultat de fonctions pour que le userform puisse éventuellement afficher un message.

    On remarque également le code minimaliste des procédures évènementielles des boutons. Un code évènementiel ne peut normalement rien faire d'autre que d'appeler du code applicatif. C'est une règle à respecter sans aucune exception pour créer du code maintenable, évolutif, non redondant et facilement maintenable. Les codes évènementiels des boutons passent simplement la main au DataUsfManager, affichent des éventuellement des messages selon les réponses du DataUsfManager et ajustent le contenu de certains contrôles. C'est tout. Ce n'est pas le userform qui gère les interactions avec la table, mais bien le DataUsfManager.

    Le userform est piloté par une procédure d'un module standard, qui utilise une fonction pour créer le mappage. Nous verrons plus loin pourquoi.
    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
    Sub ShowUserform()
     
      With UserForm1
        .DataManager.Map = getMap()
        .cboFunction.List = Range("t_Fonctions").Value
        .DataManager.Table = Range("t_Contacts").ListObject
        If .DataManager.GotoRecord(1) = 0 Then
          .tboIndex = 1
          .DataManager.updateUserform
        End If
        .Show
      End With
      Unload UserForm1
    End Sub
     
    Function getMap()
      Dim Map(1 To 2, 1 To 3)
     
      Map(1, 1) = "tboFirstname"
      Map(2, 1) = "Prénom"
      Map(1, 2) = "tboLastName"
      Map(2, 2) = "Nom"
      Map(1, 3) = "cboFunction"
      Map(2, 3) = "Fonction"
      getMap = Map
    End Function
    A nouveau, le code se passe de commentaires et est normalement compréhensible à la seule lecture. On charge le userform, on passe au DataUsfManager intégré au userform l'array de mappage et le tableau structuré (listobject) qu'il devra piloter; on décide sur quel enregistrement on se positionne au départ; on met à jour les données dans le userform sur base de l'enregistrement choisi et on affiche le userform. Le reste est piloté par les boutons du userform qui vont appeler les fonctions correspondante du DataUsfManager.


    Dans le cadre d'une application qui utiliserait plusieurs userforms liés à des données, on pourrait vouloir créer la table de mappage en Excel, qui contiendrait alors les paires contrôle/colonne pour chaque paire Usf/Tableau structuré.
    Nom : 2019-12-28_082254.png
Affichages : 3028
Taille : 5,3 Ko

    On pourra alors modifier la fonction GetMap pour charger les paires contrôle/Colonne en fonction du nom du userform passé en paramètres. On comprend ici que le ReDim ne pouvant s'effectuer que sur la dernière dimension de l'array, il était nécessaire de le prévoir sur base de la structure 2 lignes et x colonnes (x étant le nombre de paires contrôle/colonne pour le userform considéré).
    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
    Function getMap1(UsfName As String)
      Dim t
      ReDim Map(1 To 2, 1 To 1)
      Dim Counter As Long
      Dim Index As Long
     
      t = Range("t_MapUsf").Value
      For Counter = 1 To UBound(t)
        If t(Counter, 1) = UsfName Then
          If IsEmpty(Map(1, 1)) Then
            Index = 1
          Else
            Index = UBound(Map, 2) + 1
            ReDim Preserve Map(1 To 2, 1 To Index)
          End If
          Map(1, Index) = t(Counter, 2)
          Map(2, Index) = t(Counter, 3)
        End If
      Next
      getMap1 = Map
    End Function
    Si vous souhaitez piloter un userform "Localités", il vous suffit de:
    • Créer le tableau structuré pour les localités;
    • Créer le userform correspondant;
    • Ajouter les paires dans la table de mappage;
    • Créer la fonction d'appel de ce userform.


    Nom : 2019-12-28_134858.png
Affichages : 3070
Taille : 10,5 Ko

    Voici le code du module standard qui appelle le userform de gestion d'une localité. A part les noms du mappage et du tableau qui ont changé et la ligne d'alimentation de la combo qui a disparu, c'est le même code que celui qui prépare et affiche usfContact. Le code du userform est quasi identique à celui de usfContact.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub ShowCityForm()
      With usfCity
        .DataManager.Map = getMap1("usfCity")
        .DataManager.Table = Range("t_Localités").ListObject
        If .DataManager.GotoRecord(1) = 0 Then
          .tboIndex = 1
          .DataManager.updateUserform
        End If
        .Show
      End With
      Unload usfCity
    End Sub
    Comme on le voit, l'écriture d'un code générique permet un gain de temps considérable dans la gestion des échanges Usf-Table, puisque l'on ne réinvente pas la roue à chaque fois. Une approche systématique permet également des tests plus simples, une maintenance aisée et une évolution de l'application en s'appuyant sur du code solide, pérenne et unique. Si vous aviez 30 userforms liés à 30 tables de données, vous auriez évidemment les 30 fonctions de préparation et d'appel et les 30 codes dans les userforms (que l'on pourrait également rendre +/- génériques, bien que le gain soit minime), mais tous utiliseraient le même code, contenu dans la classe DataUsfManager. Bien entendu, vous pouvez enrichir cette classe et tous les userforms profiteraient alors de ces ajouts.

    Vos remarques sont bienvenues, dans l'esprit DVP


    Bon travail avec Excel et VBA...

    Attention: Il faut supprimer l'extension .txt du fichier DataUsfManager...
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  2. #2
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 20
    Points
    20
    Par défaut
    Bonjour Pierre.
    Je tenais à vous remercier pour toutes vos contributions, vos différentes réponses, vos billets sur votre blog. Je suis un grand fan dorénavant.

    En plus c’est toujours écrit de façon claire, consiste et dans un bon français. Et avec de l’humour de plus.

    J’apprécie énormément votre contribution sur les liaisons entre userform et tableaux structurés. Je tenais à vous remercier.

    J’étais convaincu par ces tableaux structurés depuis plusieurs années et donc un grand utilisateur de ces listobjects. Je le suis encore plus avec vos billets sur le sujet. Couplé avec VBA, cela devient un ensemble redoutablement efficace et extrêmement productif. A quand un livre dans le commerce ?
    Un grand merci.
    Ne changez rien SVP 👍
    Cordialement

  3. #3
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Merci pour ton appréciation Ca fait toujours plaisir à recevoir!
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 20
    Points
    20
    Par défaut
    Bonjour. De rien, c’est en toute sincérité 😀.
    Je m’en suis servi encore hier soir en ajoutant 2 formulaires à ma petite application. Cela m’a pris 15 minutes à tout casser. C’est donc extrêmement efficace.
    On peut même appeler le formulaire depuis une ligne du tableau structuré et afficher la ligne concernée. Il suffit d’utiliser l’évènement beforedoubleclic du worksheet, de récupérer l’index de la ligne du listobject et le tour est joué.
    J’adore votre vision de la structuration d’une application Excel. Cela change des trucs gadgets souvent chouettes mais très peu utile au final.
    Ne changez rien Pierre SVP ! C’est parfait comme cela !
    Bonne journée

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2020
    Messages : 4
    Points : 4
    Points
    4
    Par défaut problème de dates ..
    Bonjour pierre,
    Etant novice en VBA, j’ais quand même réussi à adapter mon fichier et mes userforms selon vos préconisations. Malheureusement je bloque sur un certain point qui, à mon niveau, m’empêche de continuer mon projet. Je veux parler de la gestion des dates. Je sais qu’un textbox ne ‘ manipule ‘ que du texte mais je n’arrive pas à appliquer le format date avant écriture dans mon tableau (inversion du jour et mois selon certaine date) Merci de bien vouloir me mettre sur une piste. Bonne journée

  6. #6
    Membre à l'essai
    Homme Profil pro
    INGENIEUR MECANIQUE
    Inscrit en
    Novembre 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : INGENIEUR MECANIQUE
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2020
    Messages : 8
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par gillou1961 Voir le message
    Bonjour pierre,
    Etant novice en VBA, j’ais quand même réussi à adapter mon fichier et mes userforms selon vos préconisations. Malheureusement je bloque sur un certain point qui, à mon niveau, m’empêche de continuer mon projet. Je veux parler de la gestion des dates. Je sais qu’un textbox ne ‘ manipule ‘ que du texte mais je n’arrive pas à appliquer le format date avant écriture dans mon tableau (inversion du jour et mois selon certaine date) Merci de bien vouloir me mettre sur une piste. Bonne journée
    Bonjour gillou1961,

    J'avais le même problème, j'ai utilisé le code ci-dessous et mon problème a été réglé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CDate(TextBox_Daate.Value)
    TextBox_Daate est le nom de ma textbox

  7. #7
    Membre chevronné Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Points : 1 971
    Points
    1 971
    Par défaut
    Bonjour Guillou, akim,

    Pour des questions spécifiques, hors scope, il vaut mieux créer son propre sujet.

    Sinon pour la gestion de date dans des textbox, un simple CDate(textedate) n' est pas suffisant, car si la valeur saisie n'est pas une date, vous allez vous retrouver avec une jolie erreur.

    Mais heureusement, l'ami Pierre auteur de cette contribution, a aussi dans son blog la fonction générique qui résoudra le souci : vba convertir texte en date/

    Bav,
    Michaël

    Si mon aide/avis vous a été profitable , n'hésitez pas à cliquer sur , ça fait toujours plaisir...
    _________________________________________________________________________________________________________________

    "Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu'il est stupide..."
    Albert Einstein

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,
    je suis enseignant et pour automatiser les tonnes de fichiers que l'on doit faire et fournir à l'institution pour la notation examen de nos élèves, j'ai automatisé la chose et en tombant sur le code magique de Pierre que je tiens à remercié pour ce partage...j'ai gagné beaucoup de temps...
    bon étant débutant, je me suis pris un livre sur la programmation VBA car j'ai pas tout compris...mais quand j'aurais un peu de temps faudra que je creuse pour comprendre la totalité de ce code.

    Par contre, j'ai une question, j'ai trouvé sur le net des gens qui parlaient d'userform en modal (ou si j'ai bien compris on ne peut pas jouer avec un autre fichier Excel en //) ou non modal (la on peu avoir l'userform et avoir une feuille excel pour faire des copier/coller par exemple...soit ce que je voudrais)

    J'ai donc recherché comment passer votre code modal en non modal...ils disent rajouter un 0 à .Show, j'ai donc mis dans votre procédure de lancement : ".Show 0"
    et la votre userform...et donc le mien aussi...apparait (du moins le cadre) pour disparaitre aussitôt

    Y a t'il donc une solution pour pouvoir avec la possibilité d'utiliser en // du Userform un autre fichier Excel

    Merci d'avance si vous aviez un retour positif à ma demande

    Bonne soirée

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Pour commencer, je tiens à remercier l'auteur de ce tuto. Je n'ai pas le niveau, j'étais pessimiste au départ, mais j'ai réussi à adapter ce code à mon tableau. J'avais au départ une erreur sur le fichier d'exemple car je ne passais pas par la fonction d'ouverture du userform, ce qui fait que le datamanager n'était pas initialisé. Sinon, bravo, une fois qu'on a compris, c'est pas sorcier pour faire le mappage.

    Bref, j'aurai voulu savoir 3 choses :
    Est-il possible de rajouter un msgbox d'avertissement au moment de changer d'enregistrement quand on a effectué des modifications sur des combobox / textbox mais qu'on n'a pas cliqué sur le bouton "sauvegarder" ?

    Est-il possible de de faire une navigation selon un filtre? Par exemple si j'ai une colonne "Service", et que je souhaite consulter uniquement les enregistrements du "Service B" ?

    Je rencontre également le problème de l'enregistrement de date. Je ne vois pas comment adapter la fonction UpdaeTable() pour l'insertion d'une date. Pouvez vous m'aiguiller à ce sujet?

  10. #10
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 360
    Points : 641
    Points
    641
    Par défaut Gestion de deux tableaux structurés
    Bonjour,
    D'abords merci pour toutes vos contributions qui me servent tous les jours, moi petit autodidacte à la retraite.
    J'utilise la modélisation de données dans un petit programme que j'expérimente et que je veux mettre à disposition de ceux qui veulent faire du Access avec du Excel.
    C'est un petit programme de devis clients, Jusque-là avec la modélisation j'arrive à gérer quatre pages Clients, Articles, Fournisseurs, et Devis.
    Là ou je voudrais faire une évolution c'est au niveau de la page devis, celle-ci comporte les champs texte IdDevis, DateDevis, RefDevis, EtatDevis issus de la table t_Devis, et IdNomDevis qui lui contient l'index client issu de la table t_Clients. C'est avec ce dernier que je voudrais faire évoluer la classe.
    A l'heure actuelle je mets à jour les champs de la table t_Devis avec le Datamanager, et ensuite je mets à jour les champs client (Nom, Prénom, adresse...) en les importants de la table t_Clients grasse à son index.

    d'où ma question avez-vous une idée, ou un fil à suivre pour pouvoir gérer cette sous table par la classe DataManager ? Autant j'arrive avec mes maigres moyens à suivre le déroulement de la classe autant pour la modifier, et l'adapter c'est une autre histoire.

    Merci d'avance du temps que vous prendrez, pour me répondre.
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    A vrai dire, je n'ai pas bien compris la question. Le DataManager assure la liaison entre un userform (en tout ou en partie) et un tableau structuré (en tout ou en partie). Il faudrait un peu détailler la structure du classeur pour que nous puissions mieux comprendre le problème.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    A vrai dire, je n'ai pas bien compris la question. Le DataManager assure la liaison entre un userform (en tout ou en partie) et un tableau structuré (en tout ou en partie). Il faudrait un peu détailler la structure du classeur pour que nous puissions mieux comprendre le problème.
    Bonjour,

    J'espère ne pas être trop insistant, mais je me permets de vous solliciter pour mes problèmes dans le message un peu plus au dessus :
    Comment gérer l'enregistrement des dates qui est capricieuse au niveau du format via les textbox?

    Et comment serait-il possible d'ajouter un message d'alerte lorsque des modifications ont été apportées dans les textbox/combobox et que le bouton save n'a pas été cliqué avant un bouton next/prévious/quitter etc ?

  13. #13
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 360
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    A vrai dire, je n'ai pas bien compris la question. Le DataManager assure la liaison entre un userform (en tout ou en partie) et un tableau structuré (en tout ou en partie). Il faudrait un peu détailler la structure du classeur pour que nous puissions mieux comprendre le problème.
    Bonjour,
    Ne sachant pas à qui était destiné la réponse , je me permet de répondre aussi.
    Donc les structures des tables son comme ci-dessous :
    Table Clients : Qui regroupe toutes les informations client avec une colonne ID (Numéro auto), Nom, Prénom, etc.
    Table Lignes devis : qui reprends les lignes du devis avec les colonnes ID (numéro auto); ID Article pour l'article concerné; Quantité, etc...
    Table Articles : où son stockées les infos de l'article : Désignation, prix, etc.
    Table Devis : qui regroupe les infos des devis avec :
    • Colonne ID numéros auto du devis
    • Colonne Référence qui ne sert qu'a l'impression c'est la référence de la facture (date + numéro)
    • Colonne ID Client colonne qui reprends l'ID du client cette colonne me sert à récupérer les infos clients dans le table Client par rapport à l'ID client
    • Colonne ID Lignes qui reprends l'ID des lignes du devis ici pareil je stocke les lignes devis dans une table à part
    • Colonne état pour gérer l'état du devis en cours, validé, etc...

    Comme il vaut mieux une image que moultes explications.
    Pièce jointe 613337

    Donc si l'on part du haut du formulaire création de devis J'ai :
    • En premier les informations du devis (en bleu) qui sont gérés par le DataManager ID, Référence, Date,...
    • Ensuite viennent les infos clients (en vert) qui ne sont pas gérés par le DataManager puisque provenant d'une autre table
    • Ensuite viennent les lignes du devis (en Jaune) dans une listbox qui elles n'ont plus ne sont pas gérées par le DataManager


    Donc voilà le problème c'est de gérer plusieurs tableaux avec le DataManager, Je suis allé regarder de plus près le fil de Qwazerty mais je ne pense pas que cela soit adapté.
    Actuellement, je gère les infos devis en bleu avec le DataManager, ensuite j'importe les infos client en utilisant son ID, puis la liste des lignes avec l'ID Ligne devis ID (un seul ID pour toutes les lignes)
    D'où ma question est-il judicieux de gérer les trois tables avec le DataManager ? et si oui, de qu'elle manière verriez-vous cela, dans les grosses ligne bien sûr, étant là pour apprendre et expérimenter.
    Merci d'avance, Jean-Paul.

    Ps: Sur les autres pages, Clients, Articles, Fournisseurs, les données sont gérées sans problème grâce au DataManager, car il n'y a qu'un tableau par page.
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Je relance une dernière fois :
    Comment est-il possible d'intégrer proprement un message d'alerte si une modification a été faite dans le formulaire, que l'utilisateur clique sur un bouton "suivant", "précédent" etc et qu'il n'a pas sauvegarder les modifications?

  15. #15
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    C'est au userform de contrôler cela. Ce n'est pas en lien, direct en tout cas, avec le transfert vers le tableau de données.

    Une technique simple serait de mettre un flag comme variable privée du userform et de le mettre à True lorsque l'on modifie la donnée d'un contrôle. On peut alors proposer à l'utilisateur d'enregistrer avant de voyager sur précédent, suivant, ou de quitter.

    Voilà un code qui met cela en place

    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
    Option Explicit
     
    Private IsModified As Boolean
     
    Private Sub btnNext_Click()
      If IsModified Then SaveQuitCancel
    End Sub
     
    Private Sub btnPrevious_Click()
      If IsModified Then SaveQuitCancel
    End Sub
     
    Private Sub optActive_Click()
      IsModified = True
    End Sub
     
    Private Sub tboName_Change()
      IsModified = True
    End Sub
     
    Private Sub SaveQuitCancel()
      Dim Result As VbMsgBoxResult
     
      Result = MsgBox("Voulez-vous enregistrer les données?", vbYesNoCancel, "Mon application")
      Select Case Result
        Case vbYes
          Save
        Case vbNo
          Me.Hide
      End Select
      IsModified = (Result = vbCancel)
    End Sub
     
    Sub Save()
      MsgBox "Sauvé"
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    ...
    Merci pour cette réponse.
    Mais je crois qu'il y a un problème avec cette méthode que je viens de mettre en place :
    J'ai l'impression qu'a chaque chargement d'un enregistrement, il considère qu'il y a modification dans les textbox, cb_box et compagnie comme les données ne sont pas vides et qu'il charge les données du tableau.

    Je pourrais éventuellement le mettre sur l’événement click, ça résoudrait une partie du problème...

    EDIT : je viens de tenter sur l'événement Click(). Ca marche pour le premier bouton suivant, mais ensuite, ça me demande à chaque fois si je veux enregistrer... Etrange, je ne clique pourtant nulle part à part le bouton next.

    C'est dans cette partie de code là que ça appelle mes procédures Click() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Counter = 1 To UBound(mMap)
        mUsf.Controls(mMap(Counter, 1)).Value = r.Range(mTable.ListColumns(mMap(Counter, 2)).Index).Value
      Next
    Bon après parcours pas à pas, ça ne le fais pas à chaque cb_box, et j'ai l'impression que ce n'est pas forcément en lien avec les cb_box rempli ou vide... Etrange...

  17. #17
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Je viens de reprendre le fichier.

    Je regarde pour une solution pratique et simple.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Ok, merci bien.

  19. #19
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Il faut mettre le IsModified en Public.

    Dès lors, après le chargement, on peut le basculer à False

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub ShowCityForm()
      With usfCity
        .DataManager.Map = getMap1("usfCity")
        .DataManager.Table = Range("t_Localités").ListObject
        If .DataManager.GotoRecord(1) = 0 Then
          .tboIndex = 1
          .DataManager.updateUserform
          .IsModified = False
        End If
        .Show
      End With
      Unload usfCity
    End Sub

    Attention, il faut aussi le basculer à False à la fin de la procédure btnSave

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub btnSave_Click()
      With mDataManager
        .UpdateTable
        tboIndex = .Index
      End With
      IsModified = False
    End Sub
    Ca devrait être ok
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  20. #20
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Pour le problème de la date, je regarde ce soir.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. SELECT depuis une table de liaison entre 2 mêmes tables
    Par Pedro dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/04/2013, 17h16
  2. [XL-2007] Problème Méthode de Liaison entre Userform
    Par Garruth dans le forum Excel
    Réponses: 4
    Dernier message: 05/03/2012, 14h22
  3. Réponses: 13
    Dernier message: 22/08/2009, 15h53
  4. Réponses: 1
    Dernier message: 03/03/2009, 12h41
  5. Liaison entre Access et tables Oracle
    Par lerico dans le forum Modélisation
    Réponses: 1
    Dernier message: 05/09/2008, 15h35

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