Remplacer la valeur d'une colonne en testant le texte dune autre
Résolu
bassmart
Messages postés
281
Date d'inscription
Statut
Membre
Dernière intervention
-
bassmart Messages postés 281 Date d'inscription Statut Membre Dernière intervention -
bassmart Messages postés 281 Date d'inscription Statut Membre Dernière intervention -
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:
http://www.cjoint.com/c/FDbprGa7qfo
Merci beaucoup pour votre aide!
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!
A voir également:
- Vba remplacer une valeur par une autre dans une colonne
- Déplacer une colonne excel - Guide
- Trier une colonne excel - Guide
- Remplacer disque dur par ssd - Guide
- Excel additionner une colonne - Guide
- Comment remplacer un mot par un autre dans word - Guide
2 réponses
Bonsoir,
1- déclarer :
2- remplacer :
Par :
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 :
par :
A+
Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
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
J'ai effectué les modifications mais j'ai une erreur d'exécution 424 à la ligne . 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 SubMerci!
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 SubMé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 SubJ'ai essayé les deux versions, la première version fonctionne bien, par contre, il y a une erreur dans la deuxième à la ligne .
Je ne comprend pas vraiment la distinction entre les 2 options, collections d'objets?
Merci!
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 SubObjets, 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.