A voir également:
- [VBA : Sous plage d'un Range
- Mkdir vba ✓ - Forum VB / VBA
- Excel compter cellule couleur sans vba - Guide
- Vba range avec variable ✓ - Forum VB / VBA
- Autofill vba ✓ - Forum Excel
- L'indice n'appartient pas à la sélection vba ✓ - Forum Programmation
7 réponses
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 249
Modifié par eriiic le 18/06/2010 à 23:14
Modifié par eriiic le 18/06/2010 à 23:14
Bonsoir,
Une autre proposition avec une autre approche.
Excuse-moi michel, mais des questions comme j'aime il n'y en a pas beaucoup ;-)
La fonction accepte des sélections multiples sur range1 et range2, et accepte que range2 ne soit pas totalement inclus dans range1.
eric
Une autre proposition avec une autre approche.
Excuse-moi michel, mais des questions comme j'aime il n'y en a pas beaucoup ;-)
La fonction accepte des sélections multiples sur range1 et range2, et accepte que range2 ne soit pas totalement inclus dans range1.
Sub test() Dim range3 As Range Set range3 = RangeDiff(Range("A:H,K:Z"), Range("B:B,D:E,H:M")) MsgBox (range3.Address) End Sub Function RangeDiff(range1, range2) As Range 'crée un nouveau range avec les colonnes de range1 - les colonnes de range2 ' Ex: RangeDiff(Range("A:H,K:Z"), Range("B:B,D:E,H:M")) ' retourne : range("A:A,C:C,F:G,N:Z") ' (il doit rester au moins 1 colonne sinon erreur vba) Dim cols() As Long Dim a As Range Dim c As Long, i As Long ReDim cols(0) 'ajout colonnes range 1 For Each a In range1.Areas ReDim Preserve cols(UBound(cols) + a.Columns.Count) For c = 1 To a.Columns.Count i = i + 1 cols(i) = a.Columns(c).Column Next c Next a 'retrait colonnes range2 For Each a In range2.Areas For c = 1 To a.Columns.Count For i = 1 To UBound(cols) If cols(i) = a.Columns(c).Column Then cols(i) = 0 Next i Next c Next a 'creation range3 Set RangeDiff = Worksheets(range1.Parent.Name).Columns(cols(1)) For i = 2 To UBound(cols) If cols(i) <> 0 Then Set RangeDiff = Union(RangeDiff, Worksheets(range1.Parent.Name).Columns(cols(i))) Next i End Function
eric
Mytå
Messages postés
2973
Date d'inscription
mardi 20 janvier 2009
Statut
Contributeur
Dernière intervention
20 décembre 2016
950
15 juin 2010 à 13:22
15 juin 2010 à 13:22
Salut le forum
En gros tu veux le contraire de la fonction UNION
Pas évident comme problématique, mais on trouvera surement quelque chose...
Mytå
En gros tu veux le contraire de la fonction UNION
Pas évident comme problématique, mais on trouvera surement quelque chose...
Mytå
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
18 juin 2010 à 15:08
18 juin 2010 à 15:08
Pas évident du tout, réaliser une fonction qui soustrait une plage continue d'une autre plage continue est assez simple mais créer un fonction EXCLUSION à plusieurs arguments me paraît bien plus ardu, mais je ne suis pas un pro du VBA.
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 311
Modifié par michel_m le 18/06/2010 à 16:34
Modifié par michel_m le 18/06/2010 à 16:34
Bonjour à tous
ci dessous 1° jet brut de fonderie et sans garde-fou seulement pour les 26 premières colonnes (A-Z)et 1 seule exclue
je regarde (+tard) pour 256 colonnes
on sélectionne les colonnes A:F en excluant la colonne D
ci dessous 1° jet brut de fonderie et sans garde-fou seulement pour les 26 premières colonnes (A-Z)et 1 seule exclue
je regarde (+tard) pour 256 colonnes
on sélectionne les colonnes A:F en excluant la colonne D
Sub test() scinder "a", "F", "D" End Sub Sub scinder(col_deb, col_fin, col_exc) Dim deb As Byte, fin As Byte, exc As Byte Dim tablo Dim espace As Range deb = Asc(UCase(col_deb)) fin = Asc(UCase(col_fin)) exc = Asc(UCase(col_exc)) ReDim tablo(0) For cptr = deb To fin If cptr <> exc Then tablo(cptr_t) = Chr(cptr) & ":" & Chr(cptr) cptr_t = cptr_t + 1 ReDim Preserve tablo(cptr_t) End If Next ReDim Preserve tablo(cptr_t - 1) Range(Join(tablo, ",")).Select End Sub
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 311
19 juin 2010 à 09:43
19 juin 2010 à 09:43
bonjour,
Eriic, j'étais un peu étonné que tu ne sois pas déjà intervenu sur cet intéressant problème! et c'est vrai que ces casse-t^tes amusants sont rares...
bonne journée
amicalement
Michel
Eriic, j'étais un peu étonné que tu ne sois pas déjà intervenu sur cet intéressant problème! et c'est vrai que ces casse-t^tes amusants sont rares...
bonne journée
amicalement
Michel
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci à vous deux et heureux de savoir que ce genre de problème vous intéressent^^
Petit soucis avec la fonction d'eriic, par exemple le code suivant renvoie une erreur vba alors qu'aucun range n'est vide :
Petit soucis avec la fonction d'eriic, par exemple le code suivant renvoie une erreur vba alors qu'aucun range n'est vide :
Sub test() Dim range3 As Range Set range3 = RangeDiff(Range("B:C"), Range("B:B")) MsgBox (range3.Address) End Sub
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 249
Modifié par eriiic le 21/06/2010 à 14:03
Modifié par eriiic le 21/06/2010 à 14:03
Bonjour,
C'est vrai, je n'avais pas pensé qu'on pouvait aussi supprimer la 1ère colonne...
Au passage dans le sub test je montre comment traiter l'anomalie 'range vide'
eric
C'est vrai, je n'avais pas pensé qu'on pouvait aussi supprimer la 1ère colonne...
Sub test() Dim range3 As Range Set range3 = RangeDiff(Range("B:C"), Range("B:D")) If Not range3 Is Nothing Then MsgBox (range3.Address) Else MsgBox ("Range résultant = Nothing") End If End Sub
Function RangeDiff(range1, range2) As Range 'crée un nouveau range avec les colonnes de range1 - les colonnes de range2 ' Ex: RangeDiff(Range("A:H,K:Z"), Range("B:B,D:E,H:M")) ' retourne : range("A:A,C:C,F:G,N:Z") ' (il doit rester au moins 1 colonne sinon erreur vba) Dim cols() As Long Dim a As Range Dim c As Long, i As Long, initOk As Boolean ReDim cols(0) 'ajout colonnes range 1 For Each a In range1.Areas ReDim Preserve cols(UBound(cols) + a.Columns.Count) For c = 1 To a.Columns.Count i = i + 1 cols(i) = a.Columns(c).Column Next c Next a 'retrait colonnes range2 For Each a In range2.Areas For c = 1 To a.Columns.Count For i = 1 To UBound(cols) If cols(i) = a.Columns(c).Column Then cols(i) = 0 Next i Next c Next a 'creation range3 For i = 2 To UBound(cols) If cols(i) <> 0 Then If Not initOk Then Set RangeDiff = Worksheets(range1.Parent.Name).Columns(cols(i)) initOk = True Else Set RangeDiff = Union(RangeDiff, Worksheets(range1.Parent.Name).Columns(cols(i))) End If End If Next i End Function
Au passage dans le sub test je montre comment traiter l'anomalie 'range vide'
eric