If tous les éléments de rng1 et rng2 sont trouvés then je sors

  • Initiateur de la discussion Initiateur de la discussion cibleo
  • 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 !

cibleo

XLDnaute Impliqué
Bonjour le forum,

Dans la Function Mavar, j'aimerais revoir la boucle For n pour l'optimiser et intégrer un Exit for.
Les boucles For p et For o qui la composent ont la même structure.
L'une renvoie : Mavar = Mavar & rng1(p) & ", "
L'autre renvoie : Mavar = Mavar & rng2(o) & ", "

Est-il possible de ne créer qu'une seule boucle voire 2 boucles imbriquées qui ne renverraient qu'une seule instruction ?

D'autre part, j'aimerais quitter la boucle For n lorsque tous les éléments de rng1 et rng2 sont touvés.
J'ai placé cette instruction :
If NbreHommes = 2 And NbreFemmes = 2 Then Exit For
Je ne trouve pas cela très explicite.

Cette fonction est appelée dans la macro Appel_fonction (Voir module 1)
Code:
Function Mavar(feuille, prenom) As String
Dim NbreHommes As Byte, NbreFemmes As Byte, n As Integer, rng1(), rng2(), c As Range
Dim p As Byte, o As Byte, X As Byte, Msg As String
Mavar = ""
rng1 = Array("Mr Cerri", "Mr Drujon")
rng2 = Array("Mme Legrand", "Mlle Muller")
Set c = feuille.Columns(1).Find(Trim(prenom), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
 [B]For n[/B] = 2 To feuille.Cells(c.Row, 256).End(xlToLeft).Column
 [COLOR=blue]If NbreHommes = 2 And NbreFemmes = 2 Then Exit For[/COLOR]
  If feuille.Cells(c.Row, n) <> "" Then
    For p = LBound(rng1) To UBound(rng1)
    'If NbreHommes = 2 Then Exit For
      If InStr(feuille.Cells(c.Row, n), rng1(p)) <> 0 Then
        If InStr(Mavar, rng1(p)) = 0 Then
          [COLOR=red]Mavar = Mavar & rng1(p) & ", "[/COLOR]
          NbreHommes = NbreHommes + 1
        End If
      End If
    Next p
    For o = LBound(rng2) To UBound(rng2)
    'If NbreFemmes = 2 Then Exit For
      If InStr(feuille.Cells(c.Row, n), rng2(o)) <> 0 Then
        If InStr(Mavar, rng2(o)) = 0 Then
          [COLOR=red]Mavar = Mavar & rng2(o) & ", "[/COLOR]
          NbreFemmes = NbreFemmes + 1
        End If
      End If
    Next o
  End If
 [B]Next n[/B]
[COLOR=green]'à partir de là, je termine la mise en forme de Mavar[/COLOR]
 If Mavar <> "" Then
   Mavar = Trim(Mavar)
   Mavar = Left(Mavar, Len(Mavar) - 1)
    If InStrRev(Mavar, ",") <> 0 Then
      X = InStrRev(Mavar, ",")
      Mavar = Left(Mavar, X - 1) & " et " & Right(Mavar, Len(Mavar) - X - 1)
    End If
 End If
End If
If NbreFemmes > 1 Then Msg = " sont heureuses, "
If NbreFemmes = 1 Then Msg = " est heureuse, "
If NbreHommes = 1 Then Msg = " est heureux, "
If NbreHommes > 1 Then Msg = " sont heureux, "
If NbreHommes = 1 And NbreFemmes >= 1 Then Msg = " sont heureux, "
Mavar = Mavar & Msg
MsgBox "Pour l'exemple, j'ai traité la ligne2 (B2 à L2)" & vbCrLf & "Ce que renvoie la function Mavar ci-dessous :" & vbCrLf & vbCrLf & Mavar
End Function

Pouvez-vous m'aider à optimiser le code ?
Merci de votre aide Cibleo

PS : dans l'exemple, j'ai traité la ligne 2 où figurent tous les éléments de rng1 et rng2.
 

Pièces jointes

Re : If tous les éléments de rng1 et rng2 sont trouvés then je sors

Bonjour

Dans la mesure ou les deux tableaux (hommes et femmes) n'ont pas forcement la même taille, je ne conseillerai pas de ne faire qu'une seule instruction.

Pour la suite, je propose :
If NbreHommes = UBound(rng1)-LBound(rng1)+1 And NbreFemmes = UBound(rng2)-UBound(rng2)+1 Then Exit For

Cdt
Olivier
 
Re : If tous les éléments de rng1 et rng2 sont trouvés then je sors

Bonjour à tous,
Bonjour Odesta,

Je crois que ce n'est pas bon, il manque une itération quand je remplace ceci :
Code:
If NbreHommes = 2 And NbreFemmes = 2 Then Exit For
par cela
Code:
If NbreHommes = UBound(rng1) - LBound(rng1) + 1 And NbreFemmes = UBound(rng2) - UBound(rng2) + 1 Then Exit For

Avec ton instruction, en arrivant sur n = 7 je sors, alors que je ne devrais sortir qu'à n = 8

Ainsi, en sortant de la boucle For n, les 4 éléments de rng1 et rng2 ne figurent pas dans Mavar, il en manque 1 alors qu'ils sont bien présents dans la plage traitée soit (B2:L2)
A moins qu'elle soit mal placée 🙄

Cibleo

Ps : effectivement, les 2 tableaux n'auront pas forcément la même taille.
 
Re : If tous les éléments de rng1 et rng2 sont trouvés then je sors

Bonjour
Code:
If NbreHommes = UBound(rng1) - LBound(rng1) + 1 And NbreFemmes = UBound(rng2) - [COLOR="Red"]LBound(rng2)[/COLOR] + 1 Then Exit For

Une petite erreur s'est glissé dans ce que j'ai écris : c'et LBOUND (dimension Low)

Olivier
 
- 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
5
Affichages
490
  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
500
Réponses
3
Affichages
599
Retour