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

Macros et VBA Excel Discussion :

Complément info : Excel VBA: Enregistrer un formulaire dans un tableau structuré (Tableau vers feuille formula


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2012
    Messages : 76
    Par défaut Complément info : Excel VBA: Enregistrer un formulaire dans un tableau structuré (Tableau vers feuille formula
    Bonsoir,

    Je viens de lire l'intéressant billet de Pierre Fauconnier sur la modification d'un formulaire et je reste bloqué sur la façon de renseigner le numéro de ligne à afficher.
    https://www.developpez.net/forums/bl...-formulaire-2/

    Comment remplacer le 2 par le n° de la ligne que l'on veut modifier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadData "t_contacts", 2, VBA.Array("fc_Prénom", "Prénom", "fc_Nom", "Nom", "fc_DN", "Date naissance", "fc_Actif", "Actif")

    Merci pour vos lumières.

    Cordialement.
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    remplace ta function ReadData par celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function ReadData(Tablename As String, Index As Long, Map)
      Dim i As Long
      Dim t As ListObject
      Index = nl - 10
     
      Set t = Range(Tablename).ListObject
      For i = LBound(Map) To UBound(Map) Step 2
        Range(Map(i)).Value = t.ListColumns(Map(i + 1)).DataBodyRange(Index).Value
      Next i
      Set t = Nothing
    End Function

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    remplace ta function ReadData par celle-ci
    Certainement pas.
    La fonction ReadData est une fonction générique et est parfaite. C'est en amont qu'il faut définir le numéro d'index. 2 étant une constante pour l'exemple
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2012
    Messages : 76
    Par défaut
    Bonjour mimimathy, Philippe Tulliez,

    Merci pour vos réponse.
    Philippe, tu indiques qu'il faut définir le n° d'index en amont. Comment faire ? Pour que cela fonctionne.
    Merci, cordialement.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Re,
    De mon côté cela fonctionne
    https://mon-partage.fr/f/380XuLw8/

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2012
    Messages : 76
    Par défaut
    Re,

    Je viens de tester la méthode de mimimathy et cela fonctionne aussi chez moi.
    Merci mimimathy.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Philippe, tu indiques qu'il faut définir le n° d'index en amont. Comment faire ? Pour que cela fonctionne
    Voici un exemple parmi d'autres
    La table se nommée t_Membre
    J'ai opté pour une liste déroulante placée en cellule J2 et nommée pLookupValue et une cellule nommée CellLink qui contient la fonction =EQUIV(J2;t_Member[Id];0) qui calcule la position en ligne de la valeur cherchée dans la liste

    Toutes les cellules nommées sont de portée feuille. Voir liste ci-dessous
    CellLink =Feuil1!$K$2
    fm_City =Feuil1!$L$9
    fm_FirstName =Feuil1!$J$8
    fm_Name =Feuil1!$J$7
    pLookupValue =Feuil1!$J$2

    J'ai utilisé la procédure événementielle Worksheet_Change pour invoquer la fonction générique ReaData
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Address = Range("pLookupValue").Address Then
         ReadData "t_Member", Range("CellLink").Value, VBA.Array("fm_FirstName", "Prénom", "fm_Name", "Nom")
      End If
    End Sub
    Et pour anticiper la question comment remplacer les constantes VBA.Array("fm_FirstName", "Prénom", "fm_Name", "Nom") ?
    Tout simplement en utilisant une table de conversion (table Mapping) que certainement Pierre utilise mais comme c'est un exemple et pour le rendre facile à la lecture il a utilisé des constantes comme 2

    Nom : 210717 Read Data.png
Affichages : 237
Taille : 65,3 Ko
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour mimimathy,
    De mon côté cela fonctionne
    D'abord, la question posée par Goube porte sur la fonction ReadData et pas sur AddData et je ne vois toujours pas la raison de modifier une fonction générique qui, connaissant Pierre, a été bien testée et ne nécessite certainement pas de modification.

    [EDIT]
    Petite question à mimimathy dans la ligne 4, ajoutée dans la fonction ReadData soit Index = nl - 10 d'où vient la variable non déclarée nl, ce qui provoquera une erreur, et à quoi correspond t'elle et pourquoi l'utilisation de la constante 10 ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    La variable nl déclarée dans le SUB de lancement a été déplacé au-dessus des macros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Option Explicit
    Dim nl%
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        .../...
     
    End Sub

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La variable nl déclarée dans le SUB de lancement a été déplacé au-dessus des macros
    Alors outre le fait que la variable nl soit déclarée comme Integer ce qui limite le nombre de lignes possible à 32767. Le fait de déclarer celle-ci en dehors de la fonction ReadData lui enlève l'avantage d'être générique.

    Une fonction générique a pour but d'effectuer une opération ou un calcul précis et il est évident qu'aucune variable ne doit être extérieure à celle-ci. Les arguments sont les seuls a pouvoir transmettre les valeurs et les objets utiles à son utilisation
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Invité
    Invité(e)
    Par défaut
    Re,
    sauf que le demandeur n'a pas reproduit ta démonstration à la lettre et donc n'avait pas la recherche de la ligne
    et comme dans ce forum, c'est un peu comme le covid, il ne faut pas telecharger les fichiers en PJ sous peine de risques de virus

    Bref,
    affaire conclue

  12. #12
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2012
    Messages : 76
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,


    Voici un exemple parmi d'autres
    La table se nommée t_Membre
    J'ai opté pour une liste déroulante placée en cellule J2 et nommée pLookupValue et une cellule nommée CellLink qui contient la fonction =EQUIV(J2;t_Member[Id];0) qui calcule la position en ligne de la valeur cherchée dans la liste

    Toutes les cellules nommées sont de portée feuille. Voir liste ci-dessous
    CellLink =Feuil1!$K$2
    fm_City =Feuil1!$L$9
    fm_FirstName =Feuil1!$J$8
    fm_Name =Feuil1!$J$7
    pLookupValue =Feuil1!$J$2

    J'ai utilisé la procédure événementielle Worksheet_Change pour invoquer la fonction générique ReaData
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Address = Range("pLookupValue").Address Then
         ReadData "t_Member", Range("CellLink").Value, VBA.Array("fm_FirstName", "Prénom", "fm_Name", "Nom")
      End If
    End Sub
    Et pour anticiper la question comment remplacer les constantes VBA.Array("fm_FirstName", "Prénom", "fm_Name", "Nom") ?
    Tout simplement en utilisant une table de conversion (table Mapping) que certainement Pierre utilise mais comme c'est un exemple et pour le rendre facile à la lecture il a utilisé des constantes comme 2

    Nom : 210717 Read Data.png
Affichages : 237
Taille : 65,3 Ko

    re,
    Je viens de suivre tes indications, j'obtiens bien les données voulues mais comme tu l'évoques à juste titre, comment remplacer les données originelles ? Je bataille depuis un moment sans résultat. Voici le code que j'utilise.

    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
    Option Explicit
     
    Private Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean)
        If Not Intersect(target, Range("t_Contacts")) Is Nothing Then
        Range("j2") = Range("b" & target.Row).Value
        Application.SendKeys ("{ESC}")
        End If
    End Sub
     
    Function ReadData(Tablename As String, Index As Long, Map)
      Dim i As Long
      Dim t As ListObject
     
      Set t = Range(Tablename).ListObject
      For i = LBound(Map) To UBound(Map) Step 2
        Range(Map(i)).Value = t.ListColumns(Map(i + 1)).DataBodyRange(Index).Value
      Next i
      Set t = Nothing
    End Function
     
    Private Sub Worksheet_Change(ByVal target As Range)
    Dim CellLink As Integer
    Dim pLookupValue As String
     
    CellLink = Range("Feuil1!$K$2")
    pLookupValue = Range("Feuil1!$J$2")
     
      If target.Address = Range("pLookupValue").Address Then
         ReadData "t_Contacts", Range("CellLink").Value, VBA.Array("fm_Prénom", "Prénom", "fm_Nom", "Nom", "fm_DN", "Date naissance", "fm_Actif", "Actif")
      End If
    End Sub

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je pense avoir expliqué l'une des méthodes qui permet de renvoyer le numéro de la ligne dont la fonction ReadData publiée par Pierre Fauconnier à besoin comme argument.
    Celle-ci doit être placée dans un module standard et ne doit en aucun cas être modifiée.
    Elle fonctionne correctement si l'on renvoie les trois arguments dont elle a besoin pour fonctionner et Pierre a bien expliqué son fonctionnement dans le billet de son blog

    Qu'est-ce que vous ne comprenez pas ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  14. #14
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2012
    Messages : 76
    Par défaut
    Bonsoir,

    J'ai réussi à reproduire vos indications pour récupérer les données du tableau t_Contacts dans les cellules nommées fm_xxxxx.
    Mais je sèche sur la manière de réintégrer ces données dans le tableau t_Contacts une fois la ou les modifs faites.
    Désolé, mais mon niveau VBA n'est pas des plus élevé, mais je ne demande qu'à apprendre.
    Cordialement.

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une autre approche pour connaître le numéro de la ligne sélectionnée dans une table structurée

    Vous placez le code ci-dessous dans une module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function GetRecordNumber(Cell As Range) As Long
      Dim oList As ListObject
      Set oList = Cell.ListObject
      If Not oList Is Nothing Then
         GetRecordNumber = Cell.Row - oList.Range.Row
      End If
      Set oList = Nothing
    End Function
    et pour l'invoquer vous placez le code ci-dessous dans le module de la feuille où se trouve la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       MsgBox "Vous avez sélectionné la ligne " & GetRecordNumber(Target)
    End Sub
    Le problème avec cette procédure là, c'est que la table structurée ET la partie formulaire doivent être sur la même feuille or ce n'est pas toujours ce que l'on souhaite
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  16. #16
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2012
    Messages : 76
    Par défaut
    Re,

    Je n'ai pas de problème pour le n° de la ligne à modifier, j'utilise pour cela cette procédure qui me donne le prénom situé sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean)
        If Not Intersect(target, Range("t_Contacts")) Is Nothing Then
        Range("j2") = Range("b" & target.Row).Value
        Application.SendKeys ("{ESC}")
        End If
    End Sub
    et j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =EQUIV(J2;t_Contacts[Prénom];0)
    pour récupérer le n° le ligne

    Je récupère bien les données de la ligne que je veux modifier dans mes cellules nommées fm_Nom, fm_Prénom, fm_DN et fm_Actif mais je ne sais pas comment procéder, en gardant la logique utilisée dans l'exemple donné, pour modifier les données dans mon tableau t_Contacts.

    J’espère être clair dans mes explications.
    Cordialement.

  17. #17
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Là c'est moi qui ne comprends plus.
    Mon premier exemple proposait également et sans VBA la recherche de la ligne en fonction du nom sélectionné dans la liste Validation de données) à l'aide de la fonction EQUIV. la seule chose à faire en VBA était de récupérer ce numéro et l'utiliser comme argument.
    Mon deuxième exemple est une fonction générique qui vous renvoie le numéro de la ligne sélectionnée dans n'importe quel tableau structuré et ce quel que soit l'endroit où il se trouve dans la feuille
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  18. #18
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2012
    Messages : 76
    Par défaut
    Bonsoir,

    Je crois que l'on ne se comprend pas.

    Je cherche à modifier une donnée saisie dans le tableau t_Contact. Par exemple, passer de Actif Non à Oui pour un contact situé sur la ligne 3.

    Cette manip, je peux la faire avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(t_contact).Item(n, 1) = fm_Nom
    , par contre si je veux garder la même logique que celle déployée dans la procédure ReadData, dans la mesure du possible, comment procéder.

    Cordialement.

  19. #19
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je crois avoir compris ce que vous cherchez.

    En fait c'est le problème classique de gestion de fichier résumé dans l'acronyme CRUD (Create, Read, Update, Delete)
    Pour résoudre ce problème, il suffit d'utiliser la fonction AddData proposée par Pierre dans son billet en lui ajoutant un argument Index comme dans sa fonction ReadData et en modifiant la ligne r = t.ListRows.Add.Index par If Index Then r = Index Else r = t.ListRows.Add.Index
    Nous renommerons cette fonction WriteData qui avec les modification effectuées pourra à la fois faire un Update (modification) et un Create (ajout)

    Code de la procédure modifiée, nommée WriteData
    Si l'argument Index est à 0, on fera un ajout et s'il est supérieur à 0, on fera une modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function WriteData(Tablename As String, Index As Long, Map)
      Dim r As Long
      Dim i As Long
      Dim t As ListObject
      '
      Set t = Range(Tablename).ListObject
      If Index Then r = Index Else r = t.ListRows.Add.Index
      For i = LBound(Map) To UBound(Map) Step 2
        t.ListColumns(Map(i + 1)).DataBodyRange(r).Value = Range(Map(i)).Value
      Next i
      Set t = Nothing
    End Function
    Code pour invoquer cette procédure
    Comme vous me l'avez fait remarquer, vous savez comment définir le numéro de la ligne, je vous épargnerez donc la lecture de ma suggestion et pour ajouter un record, il suffit de donner la valeur 0 à la variable RecordNumber
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub ModifyRecord()
      Dim RecordNumber As Long
      RecordNumber = 2
      WriteData "t_Member", RecordNumber, VBA.Array("fm_FirstName", "Prénom", "fm_Name", "Nom", "fm_RegisteredOn", "Inscrit le", "fm_City", "Ville")
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  20. #20
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2012
    Messages : 76
    Par défaut
    Bonjour,

    Je viens de tester votre procédure, c'est tout à fait ce que j'attendais. Merci pour votre temps et vos explications.
    Bonne journée, cordialement.

Discussions similaires

  1. [XL-2016] EXCEL + VBA 2016 Générer référence dans un tableau via un UserForm
    Par EXCELFORME dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/10/2016, 22h29
  2. Réponses: 0
    Dernier message: 07/11/2009, 11h21
  3. Réponses: 7
    Dernier message: 14/11/2008, 09h50
  4. Réponses: 17
    Dernier message: 19/04/2007, 22h41
  5. Réponses: 4
    Dernier message: 28/11/2006, 00h20

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