Remplacer la valeur d'une colonne en testant le texte dune autre

[Résolu/Fermé]
Signaler
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
-
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
-
Bonjour à tous!

J'ai une macro pour effectué un nettoyage automatique de ma feuille. Dans ma colonne E, se retrouve des lectures en mètre et parfois il s'y retrouve des valeurs non numériques comme la lettre x.

J'ai commencé un code mais je n'y arrive pas totalement!

Je détecte la valeur x dans ma colonne E, ce qui fonctionne très bien. Ensuite je veux tester le texte dans la colonne O sur la même ligne où la valeur x à été découverte. Si le texte correspond à "plein d'eau" la valeur de la cellule de la colonne E deviendras alors 0.

Voici mon code:
Sub replace()

Dim DerLig As Long
Dim plage As Variant
Dim cible As String

DerLig = Range("E" & Rows.Count).End(xlUp).Row
plage = Range("E2" & ":E" & DerLig)
cible = "plein d'eau"


For Each r In plage
    If r = "x" Or r = "X" Then
            If InStr(1, cible) = False Then
                MsgBox "non"
            Else
                ActiveCell.Value = "0"
            End If
        MsgBox "Valeur X trouvé!"
    End If
Next r

End Sub
Voici aussi mon fichier.
http://www.cjoint.com/c/FDbprGa7qfo

Merci beaucoup pour votre aide!

2 réponses

Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 654
Bonsoir,

1- déclarer :
Dim r As Range

2- remplacer :
 If InStr(1, cible) = False Then

Par :
If r.Offset(0, 10) = cible Then


Cel.Offset(ligne, Colonne) décale, à partir de la cellule Cel d'autant de ligne et/ou de colonne qu'indiqué dans l'Offset.

Attention aux types de données entre cible et r.Offset(0, 10).
Si toutes les 2 en String, pas de souci...

EDIT :
remplacer :
If r = "x" Or r = "X" Then

par :
If UCase(r.Value) = "X" Then


A+
Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
1 >
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021

Merci pijaku,

J'ai essayé les deux versions, la première version fonctionne bien, par contre, il y a une erreur dans la deuxième à la ligne
If Ucase(plage(r,1).Value = "X" then
.

Je ne comprend pas vraiment la distinction entre les 2 options, collections d'objets?

Merci!
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 654 >
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021

Oui, l'erreur est un oubli de parenthèse fermante. J'l'ai codée sur le forum ;-)
If Ucase(plage(r,1).Value) = "X" then


Objets, collections d'objets, sont les débuts de la programmation VBA sous Excel.
Une feuille est un objet, un range aussi...
Lis quelques tutos à ce sujet sur Internet, ça va vite à maitriser.
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
1 >
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021

Oups, c'est moi qui à fait une erreur en recopiant le code!
If UCase(plage(r, 1).Value) = "X" Then
Les parenthèses sont là et l'erreur aussi!
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
1 >
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021

Effectivement pikaju!

Je vais lire quelques tutos!
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
1
Voici le code pour la première option:
Sub replace()

Dim DerLig As Long
Dim plage As Range
Dim cible As String
Dim r As Range

DerLig = Range("E" & Rows.Count).End(xlUp).Row
Set plage = Range("E2" & ":E" & DerLig)
cible = "plein d'eau"


For Each r In plage
    If UCase(r.Value) = "X" Then
            If r.Offset(0, 10) = cible Then
                r.Value = "0"
            End If
        MsgBox "Valeur X trouvé!"
    End If
Next r

End Sub
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 654
Pour l'erreur, j'ai un peu mélangé les deux... Il n'y a pas de. value sur les tableaux. Enlève le .value

--
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
1
Merci beaucoup, le problème est résolu!