Mise à jour de données (Fonction Find) dans un tableau

Bonjour le Forum,

Je me permets de vous contacter, car j'ai un souci avec mon tableau excel.

Le but de ce fichier est de pouvoir mettre à jour des données dans un tableau de l'onglet "Planning" à travers 2 formulaires : [s=co-9bbb59][/s]

--> "Formulaire - Planification" (Qui fonctionne bien)

--> "Formulaire - Modifier" (Où je rencontre ma problématique)

Voici le problème :

Lorsque je veux modifier une donnée dans le tableau "Planning" en passant par le 2ᵉ formulaire : Je modifie les données pour "Date de Réalisation" et "Commentaire", puis je clique sur le bouton "Modifier"

2022 02 07 09 43 30 planif audit test excel

Normalement, les données dans le tableau "Planning" sont censées se mettre à jour.

Or actuellement, une nouvelle ligne se créer en dessous du tableau :

2022 02 07 09 48 42 planif audit test excel

J'ai du mal à bien comprendre où se trouve l'erreur, car dans le code suivant :

Le tableau est bien déclaré : "Set TS = OD.ListObjects("Tableau4") 'définit le tableau structuré TS
Set PL = TS.DataBodyRange 'définit la plage PL"

La donnée à rechercher est bien déclaré : "R = PL.Find(OS.Range("B3").Value, , xlValues, xlWhole)"

Sub ModifR()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TS As ListObject 'déclare la variable TS (Tableau Strucruré)
Dim PL As Range 'déclare la variable PL (PLage)
Dim R As Range 'déclare la variable R (Recherche)
Dim LR As Integer 'déclare la variable LR (Ligne de Référence)

Set OS = Worksheets("Formulaire - Modifier") 'définit l'onglet source OS
Set OD = Worksheets("Planning") 'définit l'onglet destination OD
Set TS = OD.ListObjects("Tableau4") 'définit le tableau structuré TS
Set PL = TS.DataBodyRange 'définit la plage PL
Set R = PL.Find(OS.Range("B3").Value, , xlValues, xlWhole)
'si il existe au moins une occurrence trouvée, copie la plage G2:AF2 de l'onglet source et les copie dans la première occurrence trouvé
If Not R Is Nothing Then
    LR = R.Row
    PL(LR, 1).Resize(, 26).Value = OS.Range("G2:AF2").Value
End If

Pourriez-vous m'aider avec ce problème ? Je vous remercie par avance.

Btw : Un grand merci à @ThauTheme pour son aide la dernière fois avec ce code !

Obi.

Edit Dan :

Fichier replacé par Ardoudoux

Bonjour Ardoudou

Ce que j'ai pu voir c'est que A28 de planning doit être une concaténation faite avec une formule et là il n'y a plus de formule

Bonjour fcyspm30,

Merci de votre retour.

En effet "A28" n'étais pas en concaténation, petite erreur de ma part. Mais même en remettant la formule le problème persiste.

Ardoudou

Est-ce que la ligne 35 de planning a bien été effacée? Chez moi ça semble fonctionner.

Oui j'ai bien effacé toutes les données en dessous du tableau.

Bonjour,

J'avais supprimé votre fichier pour données confidentielles et vous le replacez malgré tout
Votre fichier semble toujours contenir des données confidentielles Agence, site dans la feuille Planning

Merci de les supprimer et de remplacer vos différents fichiers

Cordialement

Bonjour Dan,

Je comprends votre problématique concernant les données confidentielles, mais dans ce fichier j'ai retiré/anonymisé l'ensemble des DCP. (DUPOND / MICHEL / MICHELLE).

Les données restantes sont des données de Région / Ville / Commune qui sont des données "Public" et ne comporte rien de "Confidentiel".

Cdlt

Ok dans ce cas.

Pour votre souci, et si vous changez cette ligne --> PL(LR - 8, 1).Resize(, 26).Value = OS.Range("G2:AF2").Value

Cordialement

Dan,

Merci beaucoup, en effet cela semble bien fonctionné ! Je n'avais pas les connaissances techniques pour contourner ce souci.

Bonne journée à vous !

Ardoudoux

Bonjour

Si on utilise des tableaux structurés alors on code en utilisant l'objet Listobject pas les plages

Tu peux oublier la feuille cible pour te concentrer sur le tableau structuré et ne pas utiliser une valeur fixe mais sa position (qui suivra le tableau où qu'il aille)

pour la ligne

LR = R.Row - TS.Range.Row

Sub ModifR()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim TS As ListObject 'déclare la variable TS (Tableau Strucruré)
Dim PL As Range 'déclare la variable PL (PLage)
Dim R As Range 'déclare la variable R (Recherche)
Dim LR As Integer 'déclare la variable LR (Ligne de Référence)

Set OS = Worksheets("Formulaire - Modifier") 'définit l'onglet source OS
Set TS = Range("Tableau4").ListObject 'définit le tableau structuré TS
Set PL = TS.DataBodyRange 'définit la plage PL
Set R = PL.Find(OS.Range("B3").Value, , xlValues, xlWhole)
'si il existe au moins une occurrence trouvée, copie la plage G2:AF2 de l'onglet source et les copie dans la première occurrence trouvé
If Not R Is Nothing Then
    LR = R.Row - TS.Range.Row
    PL(LR, 1).Resize(, 26).Value = OS.Range("G2:AF2").Value
End If

    Call effacer_modif

End Sub

@Chris78 :

Si on utilise des tableaux structurés alors on code en utilisant l'objet Listobject pas les plages

Effectivement mais ici il s'agissait d'un test dans ma proposition afin de voir si c'était bien la bonne solution pour Ardoudoux.

@Ardoudoux :
Vu que cela est correct pour vous, vous pouvez adapter la ligne comme ceci.

PL(LR - TS.HeaderRowRange.Row, 1).Resize(, 26).Value = OS.Range("G2:AF2").Value

C'est une solution que je propose depuis quelques temps dans les codes et qui, comme précisé par Chris78, permet de suivre la position de la première ligne du tableau structuré pour le cas où vous le déplacez.

Cordialement

RE

Ma remarque s'adressait surtout à Ardoudoux

Il faut vraiment coder comme si le tableau pouvait changer d'onglet de ligne, de colonne... bref faire abstraction des plages classiques et se focaliser sur l'objet tableau

Chris78 : Bien entendu il n'y a pas de souci; C'est d'ailleurs ton intervention qui m'a fait rappeler que j'utilisais aussi cette manière de coder.

Rechercher des sujets similaires à "mise jour donnees fonction find tableau"