IF suivi de plusieurs choix.

bertgrav

XLDnaute Occasionnel
bonjour,

dans une macro, j'éffectue un contrôle sur une colonne, si la cellule est égale à DP ou à FC ou à MG, je supprime la ligne.
comment faire pour traiter ces 3 information en même temps. et non pas l'une aprés l'autre ?

Total = Range('a65535').End(xlUp).Row
For X = Total To 2 Step -1

If Range('H' & X) = 'DP' Then
Rows(X & ':' & X).Select
Selection.Delete
End If
If Range('H' & X) = 'FC' Then
Rows(X & ':' & X).Select
Selection.Delete
End If

Donc, je voudrais avoir le code pour avoir quelque chose du genre:
If Range('H' & X) = 'DP' or 'FC' or 'MG' Then
etc...

merci pour vos réponses

chantal
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir C Tou Bon, Chantal, le Forum

Voici en complément de C Tout Bon, avec quelques optimisations du code.


Option Compare Text 'Pour prendre MAJ ou min (mg ou MG)


Sub TheEliminator()
Dim Total As Long

Application.ScreenUpdating =
False

Total = Range('a65535').End(xlUp).Row
For X = Total To 2 Step -1

       
If Range('H' & X) = 'DP' Or Range('H' & X) = 'FC' Or Range('H' & X) = 'MG' Then
            Rows(X).Delete
       
End If

Next X

Application.ScreenUpdating =
True

End Sub

Bonne Soirée
[ol]@+Thierry[/ol]
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re

J'avais oublié de déclarer X, voici une version complétée, du coup j'en profite pour te présenter une autre méthode : 'Select Case'

Option Explicit 'Pour obliger à déclarer les Variables
Option Compare Text 'Pour prendre MAJ ou min (mg ou MG)


Sub TheEliminator()
Dim Total As Long, X As Long

Application.ScreenUpdating =
False

Total = Range('a65535').End(xlUp).Row
For X = Total To 2 Step -1

   
Select Case Range('H' & X).Value
       
Case 'DP', 'FC', 'MG'
                Rows(X).Delete
       
Case Else
           
'On pourrait faire autre chose si besoin...
   
End Select

Next X

Application.ScreenUpdating =
True

End Sub

Bonne Soirée
[ol]@+Thierry[/ol]
 

bertgrav

XLDnaute Occasionnel
rebonsoir

n'y a t'il pas plus court, il me semble qu'un jour j'ai vu quelquechose du style

if Range('H' & X) = dans la liste, et là on énumére la liste 'DP', 'FC' etc etc...
car le pb est que ma liste ne se limite pas à 3 ou 4 termes, mais à une bonne vingtaine, et répéter à chaque fois OR Range('H' & X) = c'est fastidieux.

merci

chantal
 

bertgrav

XLDnaute Occasionnel
rebonsoir

n'y a t'il pas plus court, il me semble qu'un jour j'ai vu quelquechose du style

if Range('H' & X) = dans la liste, et là on énumére la liste 'DP', 'FC' etc etc...
car le pb est que ma liste ne se limite pas à 3 ou 4 termes, mais à une bonne vingtaine, et répéter à chaque fois OR Range('H' & X) = c'est fastidieux.

merci

chantal
 

_Thierry

XLDnaute Barbatruc
Repose en paix
re Bonsoir Chantal,

Voici encore une autre alternative si tu préfères, quoique le Select Case était simple aussi et non fastidieux...

Option Explicit 'Pour obliger à déclarer les Variables
Option Compare Text 'Pour prendre MAJ ou min (mg ou MG)


Sub TheEliminator()
Dim Total As Long, X As Long
Dim Tag As Variant

Application.ScreenUpdating =
False

Total = Range('a65535').End(xlUp).Row
For X = Total To 2 Step -1
   
   
For Each Tag In Array('DP', 'FC', 'MG', 'AZ', 'BZ', 'CZ', 'DZ', 'EZ', 'FZ', 'GZ', 'HZ')
   
If Range('H' & X) = Tag Then
        Rows(X).Delete
   
End If
   
Next

Next X

Application.ScreenUpdating =
True

End Sub

Bonne Soirée
[ol]@+Thierry[/ol]
 
A

AV

Guest
Ave,

Tu pourrais aussi adopter cette syntaxe insensible à la casse (à toi d'allonger le tableau ''zz'') :

zz = Array('dp', 'fc', 'mg')
If IsNumeric(Application.Match(Range('A' & x), zz, 0)) Then ....etc.....

AV [aaa]
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Alain, re Chantal

Ah tiens on avait la même idée sur une Array, mais moi je ne savais l'utiliser qu'uniquement en appliquant une boucle sur celle-ci. Merci Alain.

Donc il est clair que la proposition d'AV est sûrement plus optimisée dans la mesure où il n'y a pas besoin de boucler grace à ce 'Application.Match', par contre la touche [F1] chez moi sur 'Match', (sur une Config Excel 2003 Pro/FR), me renvoie sur une page 'Microsoft Visual Basic : Aide' Impossible d'afficher la page

Si tu as quelques complément d'info...

Je remets le code complet, en application du conseil d'AV :

Option Explicit 'Pour obliger à déclarer les Variables


Sub TheEliminator()
Dim Total As Long, X As Long
Dim Tag As Variant

Application.ScreenUpdating =
False

Total = Range('a65535').End(xlUp).Row
Tag = Array('DP', 'FC', 'MG', 'AZ', 'BZ', 'CZ', 'DZ', 'EZ', 'FZ', 'GZ', 'HZ')

For X = Total To 2 Step -1
 
     
If IsNumeric(Application.Match(Range('H' & X), Tag, 0)) Then
        Rows(X).Delete
     
End If
Next X

Application.ScreenUpdating =
True

End Sub


Bonne Soirée
[ol]@+Thierry[/ol]

Message édité par: _Thierry, à: 14/04/2006 19:45
 

bertgrav

XLDnaute Occasionnel
merci pour toutes vos réponses, je suis comblée

j'ai essayé celle à Thierry car je crois que c'est le code que j'avais remarqué, elle marche trés trés bien, j'essaierais plus tard les autres, ça peut toujours servir

encore merci

chantal
 

Luki

XLDnaute Accro
Bonsoir le fil, Bertgrav,Av _Thierry..

Très intéressant ce fil:

Je n'avais jamais pensé à utiliser match avec un test 'Isnumeric', je passe toujours par la récupération d'erreur si la valeur est absente!

_Thierry, Pas d'aide chez moi non plus, mais ce n'est rien d'autre que la fonction 'EQUIV' sauf erreur de ma part. (valeur cherchée, tableau, type).

Je l'utilise(ait) plûtot que lookUp car j'ai eu des soucis sous 97 avec lookup alors que match passait bien.

Bonne soirée à tous
 
A

AV

Guest
Re,


''...me renvoie sur une page 'Microsoft Visual Basic : Aide' Impossible d'afficher la page..''
Exact ! J'avais pas remarqué cette anomalie car dans les versions jusqu'à 2000, F1 te renvoie sur l'utilisation des fonctions de feuille dans vba.

Sur un plan général, 'Application.' suivi du nom de fonction, permet d'utiliser toutes les fonctions de feuille de calcul.
D'autres syntaxes : ''Application.WorksheetFunction.'' ou ''WorksheetFunction.'' permettent d'avoir une aide à la saisie en proposant la liste des arguments afférents à la fonction.
Perso je n'utilise que la syntaxe Application.Nom de la fonction(arguments)
Cette syntaxe permet une meilleure compatibilité entre les versions. De mémoire (défaillante) il y a notamment un problème (je ne sais plus lequel) avec notamment WorksheetFunction et Match (pour XL 97 ce me semble...).
De façon générale, préférer les fonctions de feuille de calcul aux fonctions vba même si elles portent le même nom, elles sont beaucoup plus fiables.
On aurait pu, dans l'exemple présent, tout faire avec des fonctions de feuille :
If IsNumeric(Application.Match(Range('H' & x), zz, 0))
peut s'écrire :
If Application.IsNumber(Application.Match(Range('H' & x), zz, 0))

AV [aaa]


L'emploi de la syntaxe


Si tu as quelques complément d'info...

Je remets le code complet, en application du conseil d'AV :

Option Explicit 'Pour obliger à déclarer les Variables


Sub TheEliminator()
Dim Total As Long, X As Long
Dim Tag As Variant

Application.ScreenUpdating =
False

Total = Range('a65535').End(xlUp).Row
Tag = Array('DP', 'FC', 'MG', 'AZ', 'BZ', 'CZ', 'DZ', 'EZ', 'FZ', 'GZ', 'HZ')

For X = Total To 2 Step -1
 
     
If IsNumeric(Application.Match(Range('H' & X), Tag, 0)) Then
        Rows(X).Delete
     
End If
Next X

Application.ScreenUpdating =
True

End Sub


Bonne Soirée
[ol]@+Thierry[/ol]Message édité par: _Thierry, à: 14/04/2006 19:45[/quote]
 

Discussions similaires

Statistiques des forums

Discussions
312 347
Messages
2 087 504
Membres
103 565
dernier inscrit
Fabien78