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

Résolu/Fermé
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 - 1 avril 2016 à 17:18
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 - 4 avril 2016 à 17:13
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

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 1/04/2016 à 20:54
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
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1
Modifié par bassmart le 4/04/2016 à 15:38
Bonjour pijaku,

J'ai effectué les modifications mais j'ai une erreur d'exécution 424 à la ligne
For each r in plage
. La valeur renvoyé de "r" en "nothing" avec un espion sur la valeur de "r".

Voici le nouveau code:
Sub replace()

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

DerLig = Range("E" & Rows.Count).End(xlUp).Row
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
                MsgBox "non"
            Else
                ActiveCell.Value = "0"
            End If
        MsgBox "Valeur X trouvé!"
    End If
Next r

End Sub




Merci!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023
Modifié par pijaku le 4/04/2016 à 15:52
Bonjour,

Une fois n'est pas coutume, l'erreur vient d'ailleurs...

Ce n'est plus r le souci, mais plage.
En déclarant plage As Variant et en lui affectant un Range (plage = Range("E2" & ":E" & DerLig)) tu en fais, en réalité, une variable tableau encapsulée dans un Variant.
Tu as donc deux choix :
- soit tu travailles avec des variables tableaux et donc là tu oublies ta boucle For Each pour te satisfaire d'une boucle For Next ou Do Loop,
- soit tu travailles avec des Range, mais il faut affecter le Range à plage pour pouvoir utiliser ta boucle For Each.
A noter : For Each permet de boucler sur une collection d'objets, pas sur un tableau...

Voici pour toi :
Méthode avec For Each sur un Range
Sub replace()
Dim DerLig As Long, plage As Range, cible As String, r As Range

DerLig = Range("E" & Rows.Count).End(xlUp).Row
Set plage = Range("E2" & ":E" & DerLig) 'AFFECTER ICI grâce au mot clé Set (attribue à un Objet)
cible = "plein d'eau"

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


Méthode avec For Next sur un tableau
Vérifier les colonnes E et O, ne suis pas sur de moi...

Sub replace()
Dim DerLig As Long, plage As Variant, cible As String, r As Long

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

For r = LBound(plage, 1) To UBound(plage, 1)
    If UCase(plage(r, 1).Value) = "X" Then
            If Range("O" & r + 1).Value = cible Then
                MsgBox "non"
            Else
                Range("E" & r + 1).Value = "0"
            End If
        MsgBox "Valeur X trouvé!"
    End If
Next r
End Sub
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
4 avril 2016 à 16:26
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!
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1
4 avril 2016 à 16:27
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023
Modifié par pijaku le 4/04/2016 à 16:30
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
4 avril 2016 à 17:01
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

--
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1
4 avril 2016 à 17:13
Merci beaucoup, le problème est résolu!
0