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>
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
3 Réponses :
Essayez cette fonction après que je l'ai amélioré un peu:
Set Rng = SetDifference(Rng, highlightedColumns)
^ 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 P>
Par conséquent: P>
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 espérons que cela aide p> p> xlcelltypeconstants code>). Je l'ai adapté pour le faire fonctionner pour des gammes avec des zones:
Il n'y a rien de tel que ce pseudocode
plage.difefence (plage (a), plage (b)) code>, malheureusement. Nous devons faire face à
Union code>,
intersect code> 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 code>. Comme dans votre situation, vous voulez avoir un)
rouge moins bleu code>, l'autre pourrait avoir b)
bleu moins rouge code> et la troisième option finale est 3)
Les gammes non intersectées code> ... 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 CODE> devant, comme:
SET RNG = SETDIFFERFERATION (RNG, En surbrillanceColumns) Code>
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 ...