XL 2016 compléter tableau

Elevenul

XLDnaute Nouveau
Bonjour le Forum,

je viens vers vous pour un coup de pouce sur une feuille excel.

En colonne BC la valeur de la cellule est soit "Oui" soit "Non".
Si la valeur est "Oui" alors si colonne S (Etat) est = à "Couple" lire en I (Conjoint) et aller sur la ligne du Conjoint et en BC du Conjoint à la place de "Non" mettre "Oui"
Ainsi sur toute la feuille

Merci de votre aide

Ci joint le fichier suivi allégé
 

Pièces jointes

  • suivi.xlsm
    36 KB · Affichages: 9
Solution
Bonsoir,

Puisque j'ai commencé, je publie la macro.

nota : vous avez sans doute des incohérences dans votre fichier. On trouve un conjoint AGU Bernard mais dans les colonnes Nom & Prénom, on ne trouve qu'un AGU Bernard Romain.

Or AGU Bernard est différent de AGU Bernard Romain. Il se peut d'ailleurs qu'une autre personne puisse s'appeler AGU Bernard tout simplement ou AGU Bernard Roland. Vous avez là des sources d'erreur indétectable si on n'est pas précis.

JHA

XLDnaute Barbatruc
Bonjour à tous,

Par formule tu ne pourras pas changer ce qui est mis en "BC dans "BC", il faut passer par le VBA.
Par contre en "BD2" à essayer.
VB:
=SI(ET(BC2="non";OU(S2="Couple";S2="Conjoint"));"oui";BC2)

JHA
 

Pièces jointes

  • suivi.xlsm
    27.6 KB · Affichages: 3

Elevenul

XLDnaute Nouveau
Bonsoir JHA,
La condition première est en colonne BC Si la valeur est "Oui" alors si colonne S (Etat) est = à "Couple" lire en I (Conjoint) et aller sur la ligne du Conjoint et en BC du Conjoint à la place de "Non" mettre "Oui"

mais si BC est "Non" on ne traite pas

merci de ton regard
 

job75

XLDnaute Barbatruc
Bonsoir Elevenul, JHA,

Bien sûr puisqu'il y a des entrées manuelles en colonne BC on ne peut pas y mettre des formules.

Mais on peut mettre en colonne BD les corrections à apporter avec cette formule en BD2 :
Code:
=REPT("OUI";(S2="Conjoint")*(BC2<>"Oui")*SIERREUR(INDEX(BC:BC;EQUIV(G2&" "&GAUCHE(H2)&"*";I:I;0))="Oui";0))
A tirer vers le bas, voyez le fichier joint.

A+
 

Pièces jointes

  • suivi(1).xlsm
    27.2 KB · Affichages: 4

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir,

Puisque j'ai commencé, je publie la macro.

nota : vous avez sans doute des incohérences dans votre fichier. On trouve un conjoint AGU Bernard mais dans les colonnes Nom & Prénom, on ne trouve qu'un AGU Bernard Romain.

Or AGU Bernard est différent de AGU Bernard Romain. Il se peut d'ailleurs qu'une autre personne puisse s'appeler AGU Bernard tout simplement ou AGU Bernard Roland. Vous avez là des sources d'erreur indétectable si on n'est pas précis.
 

Pièces jointes

  • Elevenul- suivi- v1.xlsm
    31.7 KB · Affichages: 3
Dernière édition:

job75

XLDnaute Barbatruc
Hello mapomme,

Oui pourquoi pas, du VBA avec cette macro du fichier (2) :
VB:
Option Compare Text 'la casse est ignorée

Sub Correction()
Dim tablo, i&, cherche$, lig As Variant
With Sheets("suivi").[A1].CurrentRegion
    tablo = .Resize(, 55) 'matrice, plus rapide
    For i = 2 To UBound(tablo)
        If tablo(i, 19) = "Conjoint" And tablo(i, 55) <> "Oui" Then
            cherche = tablo(i, 7) & " " & Left(tablo(i, 8), InStr(tablo(i, 8) & " ", " ") - 1) 'nom + 1er prénom
            lig = Application.Match(cherche & "*", .Columns(9), 0)
            If IsNumeric(lig) Then If tablo(lig, 55) = "Oui" Then tablo(i, 55) = "Oui"
        End If
    Next
    .Columns(55) = Application.Index(tablo, , 55) 'restitution
End With
End Sub
A+
 

Pièces jointes

  • suivi(2).xlsm
    32.8 KB · Affichages: 3

job75

XLDnaute Barbatruc
Bonjour Elevenul, le forum,

S'il y a un très grand nombre de lignes Application.Match prendra pas mal de temps.

Pour aller vite il faut utiliser le Dictionary :
VB:
Option Compare Text 'la casse est ignorée

Sub Correction()
Dim tablo, d As Object, i&, s, cherche$
With Sheets("suivi").[A1].CurrentRegion
    tablo = .Resize(, 55) 'matrice, plus rapide
    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = vbTextCompare 'la casse est ignorée
    '---liste des noms + 1ers prénoms de la colonne I---
    For i = 2 To UBound(tablo)
        If tablo(i, 9) <> "" Then
            s = Split(tablo(i, 9) & " ")
            d(s(0) & " " & s(1)) = tablo(i, 55) = "Oui" 'mémorise True/False
        End If
    Next
    '---correction en colonne BC---
    For i = 2 To UBound(tablo)
        If tablo(i, 19) = "Conjoint" And tablo(i, 55) <> "Oui" Then
            cherche = tablo(i, 7) & " " & Left(tablo(i, 8), InStr(tablo(i, 8) & " ", " ") - 1) 'nom + 1er prénom
            If d(cherche) Then tablo(i, 55) = "Oui"
        End If
    Next
    .Columns(55) = Application.Index(tablo, , 55) 'restitution
End With
End Sub
Fichier (3) testé sur 81 000 lignes, l'exécution se fait en 0,9 seconde.

A+
 

Pièces jointes

  • suivi(3).xlsm
    33.7 KB · Affichages: 1

Membres actuellement en ligne

Statistiques des forums

Discussions
312 196
Messages
2 086 099
Membres
103 116
dernier inscrit
kutobi87