Conception VBA : Un intersect amélioré ?

Bonjour,

Soit une plage quelconque appelée "champ" (par exemple "E5:BD49"

Une autre plage appelée "vache" peut prendre des adresses variables par exemple "E7:AA7" ou "R24:AA24" (Les vaches sont toujours en ligne : C'est un planning)

Comment détecter qu'une vache ne sort pas du champ ? (P.e. "AA17:BE17"

Je sais bien sur résoudre ce problème en créant une fonction qui parse l'adresse et en créant une floppée de conditions pour analyser toutes les composantes. Seulement j'ai un grand troupeau de vache et cela pourrait devenir chronophage si j'utilise un algo poussif...

Comment feriez vous pour bien garder les vaches ? Heu... Créer une fonction qui vérifie qu'une vache ne sort pas du champ....

Merci.

A+

Bonjour

Il y a quoi dans une cellule vache et quoi dans les cellules champ ?

Edit : en partant du principe que la lignes des vaches n'est pas forcément remplie, sinon on peut simplifier

    Dim vachesauchamp As Range
    nbvaches = Application.WorksheetFunction.CountIf([Vaches], "<>")
    Set vachesauchamp = Intersect([Champ], [Vaches])
    Nbvachesauchamp = Application.WorksheetFunction.CountIf(vachesauchamp, "<>")
    Vacheshorschamp = nbvaches - Nbvachesauchamp

Bonjour Chris,

Pour la question peu importe : ce sont des Target.Address

Ne cherchez plus j'ai trouvé ce que je pense être assez performant :

Function YRngIn(vache$) As Boolean
Dim champ As Range, res As Range
Set champ = Range("E5:BD49")
Set res = Application.Union(champ, Range(vache))
YRngIn = res.Address = champ.Address
End Function

Merci quand même !

A+

Bonjour,

Un vache de problème que tu soumets !

Bon. Une proposition via ma fonction personnalisée Minus (similaire à la fonction de soustraction de 2 ensembles) valide sur des plages discontinues :

Sub vérif_vache()

    MsgBox sortie_champ(Range("E5:BD49"), Range("R24:AA24"))
    MsgBox sortie_champ(Range("E5:BD49"), Range("AA17:BE17"))

End Sub

Function sortie_champ(champ As Range, vache As Range) As Boolean

    If Minus(champ, vache).Count > champ.Count - vache.Count Then sortie_champ = True

End Function

Function Minus(ByVal A As Range, ByVal B As Range) As Range 'Plage A moins Plage B
    Dim plage As Range, cell As Range

    Set Minus = Nothing
    For Each plage In A.Areas
        For Each cell In plage
            If Intersect(cell, B) Is Nothing Then
                If Minus Is Nothing Then Set Minus = cell _
                Else Set Minus = Union(Minus, cell)
            End If
        Next cell
    Next plage

End Function

NB : Rien n'empêche de fusionner les 2 fonctions en 1 seule

Bonjour,

Désolé Chris ma question n'était peut-être pas suffisamment claire...

Thev : Vu la taille du troupeau toutes tes boucles... bêêêê ! ou plutôt Meeeuh...

Non je pense que ma solution est optimisée : Si toutes les vaches sont dans le champ, l'union est à l'adresse du champ...

Désolé, mais la solution m'est apparue comme évidente dès que j'ai validé la question !

A+

re,

optimisé ? on peut supprimer la ligne "Set Res ..." , mais une grande différence ?

Sub teste()
     MsgBox YRngIn("R24:AA24")
     MsgBox YRngIn("AA17:BE17")
End Sub

Function YRngIn(vache$) As Boolean
     Dim champ As Range: Set champ = Range("E5:BD49")
     YRngIn = (Union(champ, Range(vache)).Address = champ.Address)
End Function

Parfait !

A+

Rechercher des sujets similaires à "conception vba intersect ameliore"