VBA - Range Exclusion - Exclure un Range d'un autre Range [Supprimé]

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

Statut
La discussion n'est pas ouverte à d'autres réponses
re
je viens de faire mes tests
le resultat est bien plus propre
le concat des address et opéré tandis qu'avec ta version il n'y a pas de concat c'est cel par cel
regarde ce que je me suis amusé à tester c'est bien tordu quand même hein
et bien quand il faut cacatainer ca concat 🤣
ce qui est bleu et jaune c'est la rng1
ce qui est jaune c'est la rng 2
1701543336040.png
 
Alors ce test est révélateur et on peut en tirer quelques enseignements.
D'une part la méthode traditionnelle améliorée (par les Unions par adresses) est la plus efficace.
Et même plus efficace que la méthode par Map Range sur Table.
Mais je sais pourquoi. C'est parce que le Map Range sur Table n'essaie pas de trouver dans la table des Ranges complets et travaille cellule par cellule. Je vais tenter d'améliorer ça mais c'est difficile à coder.
 

Pièces jointes

re moi je fait simple
1° je boucle sur toute les cells de rng1
2° je boucle sur tout les areas de la rng2
si intersect ben non sinon oui

en sortie de boucle area si non alors
si rgnfinale n'existe pas set rngfinale=cell
si elle existe set rngfinale=union(rngfinale,cel)
terminé c'est pas compliqué
et pour info j' ai recopié tes address de ton userform dans le mien
et je suis largement plus rapide et le résultat et beaucoup plus propre en terme d'area concatainée

Pour afficher ce contenu, nous aurons besoin de votre consentement pour définir des cookies tiers.
Pour plus d'informations, consultez notre page sur les cookies.
 

Pièces jointes

re moi je fait simple
1° je boucle sur toute les cells de rng1
2° je boucle sur tout les areas de la rng2
si intersect ben non sinon oui
Tu testes avec des petits Ranges faits à la mano, alors toutes le méthodes fonctionnent.

Ça ne fonctionne pas pour de gros Ranges. C'est pour ça que je me suis penché sur la question à la suite de problème de lenteur que j'ai eu.

Dans le test d'exclusion (voir fichier Post #17), pour la construction des Ranges si tu passes de For i = 1 To 1200 où cette méthode prends chez moi plus de 8 secondes à For i = 1 To 2000, cet méthode va prendre 38 secondes.
Si tu passes à For i = 1 To 5000, tu peux aller te coucher t'auras le résultat demain matin.
 
J'ai finalement codé la reconnaissance des Areas dans la fonction MapTableToRange() pour éviter d'avoir à unir par adresse cellule par cellule. Le résultat est assez positif car pour exclure 1000 Ranges de 2000 Ranges:
1 - La méthode traditionnelle améliorée (la plus performante avant) = 17 secondes.
2
- La méthode par Map Range To Table (avec la modif) = 3 secondes.
Je n'ai même pas testé la méthode traditionnelle car pour ce nombre de Ranges, on y passe la journée ou la nuit.

Je pense que plus les Ranges sont nombreux plus la différence de temps s'agrandit.
Évidemment si tous les Ranges sont de 1 cellule, la 2ème méthode n'apportera rien par rapport à la 1ère.
 

Pièces jointes

Pour exclure 1250 Ranges de 2500 Ranges:
1 - La méthode traditionnelle améliorée (la plus performante avant) = 34 secondes.
2 - La méthode par Map Range To Table (avec la modif) = 4 secondes.
 
Dernière édition:
Pour exclure 1500 Ranges de 3000 Ranges:
1 - La méthode traditionnelle améliorée (la plus performante avant) = 54 secondes.
2 - La méthode par Map Range To Table (avec la modif) = 5 secondes.
 
avec la méthode que j'avais proposé, la macro est encore2 fois plus vite. (plusieurs areas en même temps dans une feuille auxiliaire)
Schermafbeelding 2023-12-03 052418.png
 
Bonjour,
Peux-tu mettre ta méthode dans le classeur ci-joint STP ?

Révision à la hausse des performance de la méthode Map Range To Table à cause d'un Bug grossier !
Ne pas écrire For Each Area in Range -> Car chaque Area sera une cellule !
Mais écrire For Each Area in Range.Areas.

Pour exclure 1000 Ranges de 2000 Ranges:
1 - La méthode traditionnelle améliorée (la plus performante avant) = 17 secondes.
2 - La méthode par Map Range To Table (avec la modif) = 0.7 secondes.
 

Pièces jointes

Le problème de la méthode Map Range To Table c'est que la table ne peut pas représenter un Range dont les Areas sont très espacées, par exemple aux 4 coins de la feuille, car ça fait plus de 16 milliards de cellules à représenter et ça part en vrille.
Donc dans ce cas, il faut faire fallback sur la méthode traditionnelle améliorée.
 
@Dudu2
je vais te demander de tester cette sub
de bien observer le msgbox
et de me dire ce qui ne va pas
mais surtout prends ton temps
VB:
Sub test()
    Dim r As Range
    Dim r1 As Range
    Dim r2 As Range
    Dim t As Single
    Dim texte As String
    Cells.Interior.Color = xlNone
    
    Set r1 = [D3:J9]
    Set r2 = [E1:E15]
    
    r1.Interior.Color = RGB(0, 200, 255)
    r2.Interior.Color = RGB(0, 255, 200)
    
    texte = "Range 1 = " & r1.Address(0, 0) & vbCrLf & "Range 2 = " & r2.Address(0, 0) & vbCrLf

    t = Timer
    Set r = ExclusionTraditionnelleAméliorée(r1, r2)
    texte = texte & "Exclusion traditionnelle améliorée : " & Format(Timer - t, "#0.00 sec") & vbCrLf & _
            GetAddressFromRange(r) & vbCrLf & "********************************************" & vbCrLf

    t = Timer
    Set r = ExclusionTraditionnelleAméliorée(r1, r2)
    texte = texte & "Exclusion traditionnelle améliorée : " & Format(Timer - t, "#0.00 sec") & vbCrLf & _
            GetAddressFromRange(r) & vbCrLf & "********************************************" & vbCrLf


    'Exclusion par la méthode Map Range to Table du Module_RangeFunctions
    t = Timer
    Set r = Exclusion(r1, r2)
    texte = texte & "Exclusion Map Range to Table : " & Format(Timer - t, "#0.00 sec") & vbCrLf & _
            GetAddressFromRange(r) & vbCrLf & "********************************************"

    MsgBox texte

End Sub
😉
 
vous testez avec 2 plages assez petit, si on prend des plages plus grand ou complexe, vous perdez votre temps en buvant du café en attendant ...
union commence à ralentir après 100 fois/cellules

donc avec de plages modifiées !!!

Schermafbeelding 2023-12-03 123134.png

Schermafbeelding 2023-12-03 124442.png
 
Dernière édition:
Statut
La discussion n'est pas ouverte à d'autres réponses
- 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

Retour