Problème de plage vide

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 !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonsoir,

J'ai 4 plages de cellules :
plage1, plage2, plage3 & plage4

L'une ou plusieurs de ces plages peuvent être, suivant les événements, vides.

Dans ma macro, à un moment donné, j'écris :
Set plages = Union (plage1, plage2, plage3, plage4)
[M4] = plages.Address

- Si aucune des plages est vide : ça marche
- Si une ou plusieurs de ces plages sont vides : ça plante

Comment s'y prend-on pour contourner ce problème ?

Merci d'avance.
 
Re : Problème de plage vide

Salut Magic_Doctor

Peut-être comme ça
Code:
Sub Test()
  Dim Plage As Range
  With Sheets("Feuil1")
    ' Plage 1
    If Application.WorksheetFunction.CountA(.Range("A1:A30")) > 0 Then
      Set Plage = .Range("A1:A30")
    End If
    ' Plage 2
    If Application.WorksheetFunction.CountA(.Range("B1:B30")) > 0 Then
      Set Plage = Union(Plage, .Range("B1:B30"))
    End If
    ' Plage 3
    If Application.WorksheetFunction.CountA(.Range("C1:C30")) > 0 Then
      Set Plage = Union(Plage, .Range("C1:C30"))
    End If
    ' Etc ....
  End With
End Sub

A+
 
Re : Problème de plage vide

Bonsoir Victor, Bonsoir Bruno,

Donc, si j'ai 30 plages (puisque je ne peux aller au-delà avec la fonction "Union"), je vais sentir la dépression venir !

En fait nous avons x plages distinctes que nous voulons réunir par le biais de la fonction "Union".
N'y aurait-il pas un moyen (boucle par exemple) de vérifier si les plages sont vides ou pas, éliminer les plages vides et introduire dans la fonction "Union" uniquement celles qui ne sont pas vides ?
 
Re : Problème de plage vide

Bonsoir Magic Doctor, salut Patrick et Bruno 🙂

Le fait qu'une ou plusieurs plages soient vides n'a aucune importance pour la fonction Union.

Par contre la fonction renvoie bien sûr une erreur si une plage Is Nothing (donc pas définie)...

Je vais voir comment éviter une plage quand elle n'est pas définie.

A+
 
Re : Problème de plage vide

Re,

Voici une méthode pour éliminer les plages non définies parmi les 4 plages :

Code:
If plage1 Is Nothing And plage2 Is Nothing And _
  plage3 Is Nothing And plage4 Is Nothing Then _
  MsgBox "Aucune des 4 plages n'est définie !!!": Exit Sub
If Not plage1 Is Nothing Then Set plages = plage1
If Not plage2 Is Nothing Then Set plages = plage2
If Not plage3 Is Nothing Then Set plages = plage3
If Not plage4 Is Nothing Then Set plages = plage4
Set plages = Union(IIf(plage1 Is Nothing, plages, plage1), _
  IIf(plage2 Is Nothing, plages, plage2), _
  IIf(plage3 Is Nothing, plages, plage3), _
  IIf(plage4 Is Nothing, plages, plage4))
Il y a peut-être plus simple, à voir...

Edit : s'il y a 30 plages ce sera la galère 😕

Il faudrait comme tu le suggères, Doctor, pouvoir faire des boucles sur les n° des plage.

Mais sur des variables ça parait difficile, peut-être avec un module de classe, ou des noms définis...

A+
 
Dernière édition:
Re : Problème de plage vide

Re, salut Bernard 🙂

Avec des noms définis pour les plages qui existent, le code se simplifie :

Code:
If plage1 Is Nothing And plage2 Is Nothing And _
  plage3 Is Nothing And plage4 Is Nothing Then _
  MsgBox "Aucune plage n'est définie !": Exit Sub
Dim nom As Name
If Not plage1 Is Nothing Then ThisWorkbook.Names.Add "plage1", plage1
If Not plage2 Is Nothing Then ThisWorkbook.Names.Add "plage2", plage2
If Not plage3 Is Nothing Then ThisWorkbook.Names.Add "plage3", plage3
If Not plage4 Is Nothing Then ThisWorkbook.Names.Add "plage4", plage4
For Each nom In ThisWorkbook.Names
  If nom.Name Like "plage#*" Then _
    Set plages = Union(Evaluate(nom.Name), IIf(plages Is Nothing, Evaluate(nom.Name), plages))
Next
MsgBox plages.Address
A+
 
Re : Problème de plage vide

Re,

Cette solution avec les adresses semble la plus simple, mais pas sûr que cela fonctionne avec 30 plages :

Code:
If plage1 Is Nothing And plage2 Is Nothing And _
  plage3 Is Nothing And plage4 Is Nothing Then _
  MsgBox "Aucune plage n'est définie !": Exit Sub
Dim ad$
If Not plage1 Is Nothing Then ad = ad & "," & plage1.Address
If Not plage2 Is Nothing Then ad = ad & "," & plage2.Address
If Not plage3 Is Nothing Then ad = ad & "," & plage3.Address
If Not plage4 Is Nothing Then ad = ad & "," & plage4.Address
ad = Mid(ad, 2, 9 ^ 9) 'élimine la 1ère virgule
Set plages = Range(ad)
MsgBox plages.Address
 
Re : Problème de plage vide

Bonsoir job,

J'ai tardé à répondre car ce problème me donne vraiment du fil à retordre.
D'abord si j'ai parlé de 30 plages, c'est que la fonction "Union", si j'ai bien compris, peut accepter jusqu'à 30 plages.
En fait, concernant ma macro, il ne s'agit que de 3 plages :
- une plage référenciant toutes les cellules contenant une constante
- une plage référenciant toutes les cellules contenant une formule
- une plage référenciant toutes les cellules encadrées VIDES se trouvant dans un tableau

En fait, et tu l'auras compris, je reprends le problème d'hier (que je croyais réglé, mais loin s'en faut) concernant le changement de couleur du fond d'une plage définie de la feuille.
J'ai revu la macro, l'ai un peu allégée et ai rajouté ce que tu viens de me transmettre.
Le problème résiduel c'est que dans certaines conditions expliquées sur la feuille, ça plante.
 

Pièces jointes

Re : Problème de plage vide

Bonsoir Magic Doctor,

Je rentre de soirée. Vu ton code.

Il faut ajouter une ligne supplémentaire comme suit :

Code:
'Identifie toutes les cellules encadrées vides :
'-----------
ad = Mid(ad, 2, 9 ^ 9) 'élimine la 1ère virgule
Set empty_rng = Nothing 'ça manquait (job75)
Set empty_rng = Range(ad): ad = ""
Et puis fais moi plaisir, remplace tout ça :

Code:
For Each cel In plage2
    cel.Interior.Color = [Couleur1].Interior.Color
Next

Set const_rng = Nothing
Set form_rng = Nothing
Set empty_rng = Nothing
Set const_form_empty_rng = Nothing
par uniquement :

Code:
plage2.Interior.Color = [Couleur1].Interior.Color
Et supprime aussi les Application.ScreenUpdating et Application.EnableEvents tout à fait inutiles ici.

Sur ce je vais faire dodo, bonne nuit à ceux qui veillent.

A+
 
Re : Problème de plage vide

Buenos días job75,

J'ai réalisé les modifications que tu m'as conseillées et ça devient nettement plus concis.
C'est presque bon. Voilà ce que j'ai constaté :
Si j'efface le contenu de toutes les colonnes, toute la zone prend la couleur de fond choisie, et les colonnes, ainsi que la cellule isolée encadrée, ont perdu, disons, leur spécificité esthétique.
Maintenant je teinte, par exemple en jaune, toutes les colonnes ainsi que la cellule encadrée isolée.
Je remplis uniquement la 1èrer ligne du 1er tableau (toutes les autres cellules encadrées sont vides).
Je conserve toujours la même couleur de fond et clique sur GO!
Tout prend la couleur de fond à l'exception de la 1ère ligne du 1er tableau.
Je réitère :
1ère & 2ème lignes du 1er tableau --> Tout prend la couleur de fond à l'exception de ces 2 lignes.
.
.
.
1ère jusqu'à 12ème ligne du 1er tableau --> Tout prend la couleur de fond à l'exception de ces 12 lignes.
1ère jusqu'à 13ème ligne du 1er tableau --> Ça plante...
1ère jusqu'à 14ème ligne du 1er tableau --> Ça marche !

Maintenant je remplis TOUTES les cellules ENCADRÉES ---> Ça marche !

Déconcertant...!

Mais merci encore pour la peine que tu te donnes.
 

Pièces jointes

Re : Problème de plage vide

Bonjour Magic Doctor,

Il faut te remercier car ta macro aura permis d'étudier des problèmes intéressants.

Mais elle est quelque peu lourde... Vois donc ceci :

Code:
Sub MiseEnFormeFeuille1()
'version allégée par job75
Dim cel As Range, plage As Range
For Each cel In [Zone]
  If IsEmpty(cel) And cel.Borders.Value = xlNone Then _
    Set plage = Union(cel, IIf(plage Is Nothing, cel, plage))
Next
If Not plage Is Nothing Then plage.Interior.Color = [Couleur1].Interior.Color
End Sub
Les solutions les plus simples sont rarement les plus évidentes 🙂

Fichier .xls joint.

A+
 

Pièces jointes

Re : Problème de plage vide

Bonjour job75,

Pardon, "ma macro" ? Non, "ta macro" !

Je me demandais si un jour on y arriverait...

J'ai seulement soulevé un problème qui peut être, ma foi, intéressant dans moult circonstances pour ceux qui apprécient les effets visuels.
D'une macro boiteuse poids lourd, tu as solutionné le problème en poids drosophile.
On ne peut pas faire plus concis et cette syntaxe est un paradigme (nos gusta acá esta palabra) de programmation, même si pour moi elle n'est pas toujours claire. Mais je progresse dans sa compréhension !

Chapeau y muchísimas gracias!
 
- 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

B
Réponses
4
Affichages
2 K
BobExcel
B
C
Réponses
4
Affichages
1 K
celaub54
C
D
Réponses
4
Affichages
1 K
D277
D
M
Réponses
2
Affichages
706
M
L
Réponses
28
Affichages
4 K
Ludovic56
L
Retour