Remplacer contenu d'une celule à partir de deux informations

Bonjour à tous Experts d'Excel,

J'ai une première macro qui me permet d'obtenir les données de cette manière dans le document suivant.

Mais il y a un problème que je n'arrive pas à solutionner, du fait en parti de mon manque de connaissance sur ce logiciel.

J'aimerais, si possible, remplacer le texte présent dans la colonne I (FRS) à chaque fois que 2 conditions sont remplis :

1- Le code doit être C070 (colonne B)

2- Le TRS doit être GNE (colonne D)

Dans cet exemple, j'aimerais remplacer la valeur "CC" par "BB" si les deux conditions ci-dessus sont remplis.

En vous remerciant par avance du temps que vous prenez pour me lire,

Bonne journée !

14fichiertest.xlsx (9.97 Ko)

Bonjour

Je te laisse essayer le fichier que je te retourne:

Bonjour

Je te laisse essayer le fichier que je te retourne:

Copie de FichierTEST.xlsm

Bonjour Ausecour,

C'est tout simplement parfait j'ai pu l'adapter facilement à l'ensemble de mon document.

Merci beaucoup pour la rapidité et la qualité de ta réponse.

Bonne journée à toi !

Re

Super alors, merci d'avoir passé le sujet en résolu

Bonjour Log-Alex, Ausecour,

je propose ce code VBA :

Option Explicit

Sub Essai()
  Dim Tbl, n&, i&
  n = Cells(Rows.Count, 9).End(3).Row: If n = 1 Then Exit Sub
  Tbl = [B1].Resize(n, 8): Application.ScreenUpdating = 0
  For i = 2 To n
    If Tbl(i, 8) = "CC" Then
      If Tbl(i, 1) = "C070" And Tbl(i, 3) = "GNE" Then Tbl(i, 8) = "BB"
    End If
  Next i
  [I1].Resize(n) = Application.Index(Tbl, Evaluate("Row(" & "1:" & n & ")"), 8)
End Sub
4fichiertest.xlsm (14.54 Ko)

@Ausecour

je ne comprends pas ton Range("a2", "i" & der_lig) (qui apparaît 2×)

je crois que ça devrait être : Range("a2:i" & der_lig) (les 2×)

de plus, tu n'as pas mis de test pour vérifier s'il y a "CC" !

dhany

Bonjour,

Une autre proposition.

Ctrl + m pour exécuter la procédure.

Cdlt.

3fichiertest.xlsm (14.91 Ko)
Sub Essai()
Dim tbl, arr(), n As Long, i As Long
    n = Cells(Rows.Count, 9).End(xlUp).Row
    If n > 1 Then
        tbl = Cells(1).Resize(n, 9).Value
        ReDim arr(1 To UBound(tbl))
        For i = 1 To UBound(tbl)
            arr(i) = tbl(i, 9)
            If tbl(i, 2) = "C070" And tbl(i, 4) = "GNE" Then arr(i) = "BB"
        Next i
        Cells(9).Resize(UBound(tbl)).Value = Application.Transpose(arr)
    End If
End Sub

Bonjour Log-Alex, Ausecour,

@Ausecour

je ne comprends pas ton Range("a2", "i" & der_lig) (qui apparaît 2×)

je crois que ça devrait être : Range("a2:i" & der_lig) (les 2×)

de plus, tu n'as pas mis de test pour vérifier s'il y a "CC" !

dhany

Salut dhany!

Les deux codes font la même chose, pour un Range, tu peux écrire range("a1:e3"), tout comme tu peux écrire range("a1","e3"), ça fera la même chose

En effet je ne contrôle pas si la cellule contient CC, je ne pensais pas qu'il fallait faire ça

à la limite ça demande juste un petit changement:

Sub test()
der_lig = Range("a" & Rows.Count).End(xlUp).Row

tableau = Range("a2", "i" & der_lig)

For i = LBound(tableau, 1) To UBound(tableau, 1)
    If tableau(i, 2) = "C070" And tableau(i, 4) = "GNE" And tableau(i, 9) = "CC" Then
        tableau(i, 9) = "BB"
    End If
Next i

Range("a2", "i" & der_lig) = tableau
End Sub

pour le "CC", c'est car le demandeur Log-Alex avait écrit :

« Dans cet exemple, j'aimerais remplacer la valeur "CC" par "BB" si les deux conditions ci-dessus sont remplies. »

mais peut-être que le test de "C070" et "GNE" suffit ?

dhany

pour la syntaxe spéciale du Range() qui est « de la 1ère cellule à la 2ème cellule » :

c'est « d'habitude » : Range(Cells(lig1, col1), Cells(lig2, col2))


aussi, au lieu de Range("a2", "i" & der_lig) je crois qu'il faudrait :

Range(Range("a2"), Range("i" & der_lig))

OU

Range([a2], Cells(der_lig, "i"))

car il me semble que le texte "a2" seul ne suffit pas pour indiquer la 1ère cellule,

mais peut-être que je me trompe ?

dhany

@Ausecour

j'ai compris : j'ai confondu Range("B2, D5") et Range("B2", "D5")

et ça marche sans devoir mettre Range(Range("B2"), Range("D5"))

ou Range([B2], [D5]) ni Range(Cells(2, 2), Cells(5, 4))

toutes mes excuses, c'est moi qui me suis « mélangé les pinceaux » !


de toute façon, c'est plus simple en utilisant .Resize()

pour cet exemple : [B2].Resize(4, 3)

dhany

Bonjour dhany,

Oui en effet tu as raison le contenu de la cellule ("CC") n'a pas besoin d'être vérifié c'est pour ça que le code fonctionne bien.

En tout cas, merci pour ta proposition ça pourrait m'être utile pour un jour si j'ai besoin de contrôler ce fameux contenu.

Encore une fois merci pour votre réactivité et votre aide à tous les deux.

Bonjour Jean-Eric,

Merci à toi aussi pour ta proposition. Elle fonctionne parfaitement sur mon fichier test.

Tout comme pour la matrice de dhany un peu plus difficile à adapter que celle d'Ausecour, mais ça vient en partie de mes explications incomplètes.

Dans mon fichier réel, j'ai un nombre de lignes qui varie et je pense que ça perturbe votre code. Seul celui d'Ausecour s'adapte parfaitement au document.

Bonne journée !

Rechercher des sujets similaires à "remplacer contenu celule partir deux informations"