Icône de la ressource

VBA - Fonctions faciles de manipulation de Ranges V7

Le fichier à télécharger contient:
  1. Le Module_RangeFunctions à importer dans le projet VBA.
  2. Le Module_Test comme exemple de mise en œuvre.
Note: Voir toutes mes ressources -> https://excel-downloads.com/resources/?creator_id=268468

Les principales caractéristiques:
  • Ces fonctions permettent de manipuler 2 Ranges pour les fonctions:
    - Intersection((Range1 As Range, Range2 As Range, Optional NoAreaOverlaps As Boolean = True) As Range
    - Fusion(Range1 As Range, Range2 As Range, Optional NoAreaOverlaps As Boolean = True) As Range
    - Exclusion(ReservoirRange As Range, ExclusionRange As Range, Optional NoAreaOverlaps As Boolean = True) As Range
    - IsSameRange(Range1 As Range, Range2 As Range) As Boolean

    ou 1 Range pour les fonctions:
    - CellsCountAreaOverlaps(Range As Range) As Double
    - RemoveAreaOverlaps(Range As Range) As Range
Aucune de ces fonctions ne parcourt les cellules du Range pour fournir sa valeur de retour.
  • Les fonctions Intersection() et Fusion() couvrent respectivement les fonctions natives VBA Intersect() et Union() en gérant les cas où l'un et/ou l'autre des Ranges passés en argument est Nothing qui plante les fonctions natives pour lesquelles une vérification laborieusement est à chaque fois nécessaire.
    De plus, si l'option est activée, les Ranges retournés sont par défaut épurés des chevauchements d'Areas (voir remarque).

  • La fonction Exclusion() construit l'exclusion sans parcourir les cellules.
    De plus, si l'option est activée, le Range retourné est par défaut épuré des chevauchements d'Areas (voir remarque).

  • La fonction RemoveAreaOverlaps() épure un Range des chevauchements d'Areas.

  • La fonction CellsCountAreaOverlaps() permet de compter les cellules des chevauchements d'Areas d'un Range.

  • La fonction IsSameRange() détermine si 2 Ranges sont identiques.
Remarque:
  • Les fonctions Intersection(), Fusion(), Exclusion() retournent sur option un Range épuré des chevauchements d'Areas.

    Les Areas en chevauchement dans un Range, c'est à dire des Areas qui comportent des cellules communes, n'ont guère d'utilité dans les Ranges à part peut-être dans un Range de Selection si on veut exploiter les cellules sélectionnées plusieurs fois.

    Par contre elles ont une influence directe sur le Range.Cells.CountLarge qui compte les cellules des Areas et non pas celles du Range global. C'est donc une source d'erreur potentielle quand on ne connait pas ce détail.

    Les éliminer présente l'intérêt d'avoir un Range défini par une adresse qui ne fait référence qu'une seule fois aux cellules qui le composent.
Mise en œuvre très simple:
  • Placer le Module_RangeFunctions dans la projet VBA.

  • Dans le code VBA, utiliser les fonctions avec les paramètres ad hoc
    VB:
    .../...
    Set Range3 = Fusion(Range1, Range2)
    .../...
    Set Range3 = Intersection(Range1, Range2)
    .../...
    Set Range3 = Exclusion(Range1, Range2)
    .../...
    If IsSameRange(Range1, Range2) Then ...
    .../...
    Set Range1 = RemoveAreaOverlaps(Selection)
Versions:
  • V1 - Initiale
  • V2 - Correction Intersection() et Fusion() pour les cas ou Not Range1.Parent Is Range2.Parent
  • V3 - Correction d'un bug introduit en V2 en Intersection() et Fusion() lorsque l'un des Ranges est Nothing.
  • V3b - Correction d'un bug en Exclusion() lorsque l'un des Ranges est Nothing.
  • V4 - Unions temporaires de travail par adresses pour limiter le nombre d'appels à la fonction Union() qui sont très pénalisants.
  • V5 - Changement de méthode pour Exclusion() et RemoveAreaOverlaps() en utilisant un tableau.
  • V6 - Améliore sensiblement la performance.
  • V7 - Correction bug (typo) dans le fonction IsSameRange().

Ranges.gif