Le "contraire" de la méthode intersect existe-t-il ?

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 27 janv. 2010 à 17:57
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 29 janv. 2010 à 12:09
Bonjour,

J'ai aujourd'hui une curieuse question ...
Nous connaissons tous la méthode Application.Intersect qui permet d'extraire une plage d'intersection de deux plages ...
Ainsi, donc :
 MsgBox Application.Intersect(Range("A1:D20"), Range("B2:D50")).Address

nous retournera fort gentiment l'adresse : $B$2:$D$20

Quid, maintenant, si l'on souhaite extraire l'autre plage ? Celle qui, pour être précis, n'est pas partagée ?

Cette détermination-là (et sans boucle) me permettrait, si elle est réalisable par un tour de passe-passe, d'agiliser considérablement un traitement particulier

je pose cette question avec, hélàs, un "optimisme" assez restreint, mais on se sait jamais
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est

13 réponses

cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
27 janv. 2010 à 19:55
Salut
Ce devrait être:
resultat = Application.Union - Application.Intersect


CNTJC
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
27 janv. 2010 à 20:05
Bonjour, cnt,


Ce devrait être:
resultat = Application.Union - Application.Intersect


Ce serait beau, mais .... je ne vois pas quelle union, là dedans (de quoi avec quoi ?) et je vois encore plus mal la "soustraction" en cause..
Tu as un exemple ?

A vrai dire : j'ai résolu mon problème ponctuel (et uniquement lui) par une petite acrobatie de l'esprit, mais je préfèrerais une solution plus générale, s'adaptant à tous les cas !
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
27 janv. 2010 à 21:41
Bonne question... tordue...

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
27 janv. 2010 à 21:53
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
28 janv. 2010 à 08:36
Merci Us_30

Un des deux liens montre un truc similaire à celui que j'ai utilisé pour faire face à un problème spécifique et ponctuel, mais qui ne répond pas de manière générale. il sert (ce que j'ai fait pour mon problème ponctuel) lorsque l'une des deux plages répond à un critère unique (des specialcells) qui permet de "jouer en bascule". Le problème demeure entier lorsqu'aucune des deux plages ne répond à un tel critère.

L'autre finit par utiliser, d'une manière ou de l'autre, une boucle ralentissante (et c'est ce que je veux éviter)

Il est vraiment dommage que la chose n'ait pas été prévue nativement car je vois déjà les nombreux profits que l'on pourrait en tirer.

Il n'empêche :
1) je te remercie d'avoir fait des recherches
2) j'ai été content de constater que je n'étais pas le seul à m'intéresser à cet aspect.

NB : Question "tordue" ? ===>> sans aucun doute . Mais que veux-tu .... je m'exerce à VBA/Excel et "décortique" à qui mieux mieux .... (approche non dénuée de bon sens)

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
28 janv. 2010 à 09:02
J'ai également pensé à :
1) conférer une "qualité spéciale" à l'une des deux plages (de sorte à pouvoir ensuite recenser en bloc)
2) jouer "en bascule" avec cette qualité spéciale

L'idée est bonne, mais non acceptable car l'une des deux plages pourrait contenir d'origine une ou plusieurs cellules possédant cette "qualité spéciale" et le jeu serait alors totalement faussé.
Et aller vérifier, jusqu'à trouver la bonne (celle qui n'est pas utilisée ni dans une plage, ni dans l'autre) qualité spéciale et s'en servir comme "tremplin de traitement en bascule" est déjà fastidieux (voire impossible si l'une seule des deux plages contient comme par hasard des cellules (telle cellule ici, telle autre là) qui, font que l'ensemble de la plage "épuise" finalement toutes les "qualités spéciales" qui permettraient un recensement en bloc. Je sais bien que le cas serait peu probable, mais développer sagement passe par la prise en compte de tous les cas, mêmes ceux qui sont peu probables).
Dur dur ...
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
28 janv. 2010 à 10:13
possible de faire :
Sub test()
    Exclude([B3:D12], [A10:C19]).Select
End Sub

Function Exclude(ByRef voA As Range, ByRef voB As Range) As Range
Dim oI As Range
Dim oU As Range
    If Not (Nothing Is voA Or Nothing Is voB) Then
        Set oI = Intersect(voA, voB)
        Set oU = Union(voA, voB)
        If Nothing Is oI Then
            Set Exclude = oU
        Else
            With oU
                .Validation.Delete
                .Validation.Add xlValidateInputOnly, xlValidAlertStop
                oI.Validation.Delete
                Set Exclude = .SpecialCells(xlCellTypeAllValidation)
            End With
        End If
    End If
End Function



Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
28 janv. 2010 à 11:18
Bonjour, Renfield,

Marci. tTon mécanisme marche, mais ....
Tu utilises précisément là le mécanisme "de bascule" dont je parlais plus haut
Il fait abstraction du fait que le range oU pouvait contenir d'origine des cellules déjà dotées de cette propriété. D'autre part : les voilà maintenant toutes dans ce cas .


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
28 janv. 2010 à 19:47
Le vrai problème est double :
1) ne pas "toucher" à l'état des lieux
2) pouvoir se servir de ce que permet de recenser d'un seul coup ce vilain VBA/Excel

Et me vient tout-à-coup à l'esprit une solution tellement bête que (si elle n'a pas de vices cachés) je m'en veux considérablement de ne pas avoir su la trouver plus tôt.
On va là ne pas travailler exactement "en bascule", mais plutôt en "déguisements distinctifs" :

Private Sub CommandButton3_Click()
  exclus([B3:D12], [A10:C19]).Select
End Sub

Private Function exclus(r1 As Range, r2 As Range) As Range
  Dim letout As Range, partage As Range, tremplin As Variant
  Set letout = Application.Union(r1, r2)
  Set partage = Application.Intersect(r1, r2)
  r1t = r1.Value
  r2t = r2.Value
  letout.Value = ""
  partage.Value = "on s'en fout"
  Set exclus = letout.SpecialCells(xlCellTypeBlanks)
  r1.Value = r1t
  r2.Value = r2t
  Set letout Nothing: Set partage Nothing
End Function


Simple et apparemment efficace ! Mais je me méfie et attends vos tests...
Si concluants ===>> un "snippet" intéressant (et peu cher) à déposer
Car ce serait là une réponse simple et peu chère à une question tordue (en effet)
Mais je me méfie ! je me dis que ce ne peut être si simple et que quelque détail a dû m'échapper ...
Vous en voyez un ? Lequel ? (qu'on essaye de le corriger).
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
28 janv. 2010 à 19:58
Ah Ah !....
J'ai trouvé la faille (elle existe), mais sais la réparer ...(parade trouvée)
Mais je vous laisse d'abord "l'immense" plaisir de la trouver .... (y'en a une )
Qui répond présent ?

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
28 janv. 2010 à 21:23
Snippet déposé à l'instant (rubrique trucs et astuces / VBA), mais il faudra attendre (je suppose) qu'il soit validé pour apparaître.
Sujet terminé en ce qui me concerne.


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
28 janv. 2010 à 22:51
Activé


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
29 janv. 2010 à 12:09
Je rouvre ce sujet pour poser une question :
Il s'agit d'un problème similaire (mécanisme ressemblant) quoique non identique :
Celui qui consiste à extraire d'une grande plage une plage constituée des lignes cachées
Avec une fonction que je viens de faire : 3 fois moins de temps d'exécution qu'avec la boucle traditionnelle.
Dois-je déposer un snippet pour cette fonction (apparentée à la 1ère en ce qui concerne le mécanisme, mais fort différente en ce sens qu'on ne modifie tout au long que les états et non les valeurs) ?
Je déposerai ou non selon vos réponses.


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0