8
votes

Différence entre deux gammes

Je peux trouver de nombreuses questions et exemple concernant les méthodes de VBA «Union» et «Intersect», mais je ne trouve rien de beaucoup en ce qui concerne une méthode de «différence définie»? Cela existe-t-il (autre que en utilisant des combinaisons d'union et d'intersect)? P>

Toute aide serait grandement appréciée. p>

éditer. p>

 Entrez la description de l'image ici p>

Tentative de solution où RNG1 est la section rouge et RNG2 est la section bleue (ont débogué pour vérifier que celles-ci sont correctes): P>

rng = SetDifference(rng, highlightedColumns)

Function SetDifference(Rng1 As Range, Rng2 As Range) As Range
On Error Resume Next
If Application.Intersect(Rng1, Rng2).Address <> Rng2.Address Then
    Exit Function
On Error GoTo 0
Dim aCell As Range
For Each aCell In Rng1
    Dim Result As Range
    If Application.Intersect(aCell, Rng2) Is Nothing Then
        Set Result = Union(Result, aCell)
        End If
    Next aCell
Set SetDifference = Result
End If
End Function


9 commentaires

Il n'y a rien de tel que ce pseudocode plage.difefence (plage (a), plage (b)) , malheureusement. Nous devons faire face à Union , intersect et d'autres propriétés et instructions. Montrez quelles sont vos gammes (image) ou ce que vous avez essayé (code) pour un support supplémentaire.


Donc, une façon de tout sélectionner dans la gamme rouge qui n'est pas aussi dans la plage bleue est fondamentalement ce que je suis après - j'espérais qu'il y aurait une simple façon concise de le faire comme le pseudocode que vous avez posté


Le problème est avec trois tentatives possibles pour définir plage.difefence . Comme dans votre situation, vous voulez avoir un) rouge moins bleu , l'autre pourrait avoir b) bleu moins rouge et la troisième option finale est 3) Les gammes non intersectées ... Avez-vous essayé quelque chose, je veux dire n'importe quel code?


J'ai trouvé la solution ci-dessus en ligne et j'ai essayé cela, mais cela me donne actuellement une erreur 1004 - Erreur définie sur l'application ou l'objet définie. Aucune suggestion?


Appelez cette fonction avec SET devant, comme: SET RNG = SETDIFFERFERATION (RNG, En surbrillanceColumns)


Cela me donne une erreur d'exécution 91: variable d'objet ou avec une variable de bloc non définie


J'ai la même chose ... je vais regarder dans la fonction que vous avez fournie. Comme je l'ai dit, il y a des problèmes et des attitudes différents ici :)


Merci apprécie l'aide (encore)!


Donc, j'ai un peu amélioré votre code et il fonctionne maintenant pour une plage de test similaire à la vôtre. Donnez-moi un retour s'il vous plaît ...


3 Réponses :


8
votes

Essayez cette fonction après que je l'ai amélioré un peu:

Set Rng = SetDifference(Rng, highlightedColumns)


0 commentaires

5
votes

^ itération par chaque cellule est très lent pour des appels tels que

setDifefence (ActiveHeet.cells, ActiveHeet.Range ("A1")) 'Toutes les cellules sauf A1

Par conséquent: xxx


0 commentaires

1
votes

Lorsque les gammes ont à la fois plusieurs zones, vous aurez besoin d'une approche différente. Je n'ai pas composé l'idée principale de cet exemple et je ne me souviens pas d'où j'ai trouvé cette idée (en utilisant xlcelltypeconstants ). Je l'ai adapté pour le faire fonctionner pour des gammes avec des zones: xxx

espérons que cela aide


0 commentaires