• Initiateur de la discussion Initiateur de la discussion patsyl60
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patsyl60

XLDnaute Occasionnel
Bonjour le forum,

Je dois réaliser une étude de plusieurs portefeuilles clients.

Pour être précis, chaque vendeur a des secteurs autorisés ( colonne I de mon fichier( concatenation du code profession et du code département))
et je dois faire ressortir tout ce qui ne correspond pas aux secteurs autorisés.

J'ai commencé mon fichier mais j'ai plusieurs problèmes :

1/ Dans ma macro, je souhaite selectionner uniquement la plage A à F et non la ligne complète.

2/ Le nombre de secteurs autorisés est variable ( 2 dans mon exemple mais peut être de 1 ou 15 selon les vendeurs et je souhaite que le macro compare tous les codes secteurs autorisés, plutôt que de les mettre manuellement dans la macro.

3/ Ma macro fonctionne bien avec le signe = mais ne fonctionne pas avec le signe <>

J'espère avoir été le plus précis possible dans mes explications.

D'avance, merci de votre aide.

Patsyl60 😕
 

Pièces jointes

Re : 3 questions VBA...

Bonjour,

pour ta 1ère question, modifie peut être ainsi :

Code:
Sub Macro1()
Dim i As Integer

'Remise à zéro des couleurs
Cells.Interior.ColorIndex = xlNone
    
' colorier selon secteurs
For i = Range("A65536").End(xlUp).Row To 2 Step -1
If Cells(i, 6).Value = Range("I2").Value Or Cells(i, 6).Value = Range("I3").Value Then
Cells(i, 1).Resize(, 6).Interior.ColorIndex = 2
Else
Cells(i, 1).Resize(, 6).Interior.ColorIndex = 22
End If
Next i
Range("A1").Select
End Sub

bonne journée
@+
 
Re : 3 questions VBA...

Salut vous 2,

Pour la question 2 peut etre comme cela :
Code:
Sub Macro1()
Dim i As Integer

'Remise à zéro des couleurs
Cells.Interior.ColorIndex = xlNone

' colorier selon secteurs
For i = Range("A65536").End(xlUp).Row To 2 Step -1
colorier = False
    For y = 2 To Range("I65536").End(xlUp).Row
        If Cells(i, 6).Value = Cells(y, 9) Then
            Cells(i, 1).Resize(, 6).Interior.ColorIndex = 2
            colorier = True
            Exit For
        End If
    Next y
    If colorier = False Then Cells(i, 1).Resize(, 6).Interior.ColorIndex = 22
Next i
Range("A1").Select
End Sub
 
Re : 3 questions VBA...

Salut suistrop,

Merci pour ton aide. Ta macro répond tout à fait à ce que je souhaite.

De plus cela contourne ma 3ème question bien que je ne comprenne pas pourquoi elle ne marche pas...

Je vais maintenant essayer de comprendre ton code...

Encore merci à toi et Pierrot93 pour votre aide.

Patsyl60 😉
 
Re : 3 questions VBA...

Salut ,

J'ai un peu commenté ma démarche :

Code:
Sub Macro1()
Dim i As Integer

'Remise à zéro des couleurs
Cells.Interior.ColorIndex = xlNone
' colorier selon secteurs
For i = Range("A65536").End(xlUp).Row To 2 Step -1

colorier = False 'Ici on creer une variable pour que si la ligne a pas été colorier avec "2" on la colorie avec "22"
    For y = 2 To Range("I65536").End(xlUp).Row 'ici on va parcourir tous les code valide
        If Cells(i, 6).Value = Cells(y, 9) Then 'si on tombe sur un code valide, alors on va le colorier avec "2"
            Cells(i, 1).Resize(, 6).Interior.ColorIndex = 2
            colorier = True 'On a colorier avec 2 donc on met colorier a VRAI
            Exit For 'On a colorier ca sert a rien de parcourir les autres codes de la colonne I
        End If
    Next y
    If colorier = False Then Cells(i, 1).Resize(, 6).Interior.ColorIndex = 22 'Si on a pas colorier avec 2 on colorie avec 22
Next i
Range("A1").Select
End Sub
 
Re : 3 questions VBA...

Bonjour Patsyl, Suistrop

une autre solution pour éviter une 2ème boucle :

Code:
Sub test()
Dim i As Integer, x As Range
Application.ScreenUpdating = False
Cells.Interior.ColorIndex = xlNone
For i = 2 To Range("A65536").End(xlUp).Row
    Set x = Range("I:I").Find(Cells(i, 6).Value, , xlValues, xlWhole, , , False)
    Cells(i, 1).Resize(, 6).Interior.ColorIndex = IIf(x Is Nothing, 22, 2)
Next i
Application.ScreenUpdating = True
End Sub

bonne journée
@+
 
Re : 3 questions VBA...

Merci Pierrot93.

Peux tu me commenter ton "set x =" car je ne comprend pas tout.

Code:
Set x = Range("I:I").Find(Cells(i, 6).Value, , xlValues, xlWhole, , , False)
    Cells(i, 1).Resize(, 6).Interior.ColorIndex = IIf(x Is Nothing, 22, 2)

Encore merci.

Patsyl60
 
Re : 3 questions VBA...

Re,

la méthode "find" renvoie un objet range si la valeur est trouvée. J'utilise une variable pour stocker cet objet, par contre si la recherche n'a pas aboutie la variable ne sera pas initialisée et restera affectée du mot clé "nothing" ce qui permet de faire ensuite le test...
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
40
Affichages
4 K
  • Question Question
Microsoft 365 Excel vba
Réponses
5
Affichages
626
  • Question Question
Microsoft 365 Fonction SI
Réponses
2
Affichages
556
Retour