Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
J'ai, dans ma feuille, une plage nommée "BigPlage".
Dans cette plage il y a des cellules jaunes.
Je voudrais, à partir de la plage "BigPlage", créer la plage "PlageCelJaunes" qui ne contiendrait que les cellules jaunes de la plage précédente (plage "mère").
Je te propose une solution par macro (sans fichier exemple, dur de dire, si c'est c'que tu veux) :
Code:
Sub mlkj()
k = 0
For i = 0 To 8
If Range("a1").Offset(i, 0).Interior.Color = 65535 Then
Range("d1").Offset(k, 0) = Range("a1").Offset(i, 0)
k = k + 1
End If
Next i
End Sub
A adapter, suivant la couleur, et la taille de ta "big plage"
Merci pour ta proposition, mais je voudrais récupérer les cellules concernées, non pas sur la feuille mais dans la macro même. Constituer un Range et n'avoir plus qu'à écrire Range.select pour sélectionner en bloc toutes les cellules concernées.
Dim PlageCelJaunes As Range, c As Range
For Each c In [BigPlage]
If c.Interior.Color = 65535 Then
If PlageCelJaunes Is Nothing Then
Set PlageCelJaunes = c
Else
Set PlageCelJaunes = Union(PlageCelJaunes, c)
End If
End If
Next c
Bravo, ça marche !
Pour des raisons techniques, je dois supprimer de la sélection 2 cellules. J'ai essayé avec une cellule, ça marche, mais avec 2, il y en a toujours une qui reste. Supposons que ces cellules soient [L4] et [F6] (elles appartiennent à "BigPlage" et sont jaunes), comment s'y prendre ?
Je me demande bien si ça vaut la peine de te donner cette solution qui coule de source :
Code:
Sub SelectionnerCouleurJaune()
Dim t, pas, tablo, c As Range, n, P As Range
t = Timer
pas = 100 'modifiable
Application.ScreenUpdating = False
With ActiveSheet.UsedRange
tablo = .Formula
For Each c In .Cells
If c.Interior.ColorIndex = 6 Then _
Set P = Union(IIf(n, P, c), c): n = n + 1
If n = pas Then n = 0: P = "#N/A"
Next
If n Then P = "#N/A"
On Error Resume Next
Set P = .SpecialCells(xlCellTypeConstants, 16)
P.Select
.Formula = tablo
End With
MsgBox "Durée " & Format(Timer - t, "0.00 \s")
End Sub
Fichier joint.
Edit : bien sûr si tu veux utiliser ta plage nommée tu écriras :
Code:
With [BigPlage] 'With ActiveSheet.UsedRange
'-----
On Error Resume Next
Set P = .SpecialCells(xlCellTypeConstants, 16)
Application.Goto P
Et pour exclure des cellules de la sélection ce n'est pas bien sorcier :
Code:
Sub SelectionnerCouleurJaune()
Dim t, exclu As Range, pas, tablo, c As Range, n, P As Range
t = Timer
Set exclu = [B3,C4] 'à adapter
pas = 100 'modifiable
Application.ScreenUpdating = False
With ActiveSheet.UsedRange
tablo = .Formula
For Each c In .Cells
If Intersect(c, exclu) Is Nothing And c.Interior.ColorIndex = 6 _
Then Set P = Union(IIf(n, P, c), c): n = n + 1
If n = pas Then n = 0: P = "#N/A"
Next
If n Then P = "#N/A"
On Error Resume Next
Set P = .SpecialCells(xlCellTypeConstants, 16)
P.Select
.Formula = tablo
End With
MsgBox "Durée " & Format(Timer - t, "0.00 \s")
End Sub
Fichier (2).
Edit : avec ta plage nommée "BigPlage" :
Code:
Sub SelectionnerCouleurJaune()
'[BigPlage] doit être une plage rectangulaire
Dim t, exclu As Range, pas, tablo, c As Range, n, P As Range
t = Timer
pas = 100 'modifiable
Application.ScreenUpdating = False
With [BigPlage] 'ActiveSheet.UsedRange
Set exclu = .Parent.[L4,F6] 'à adapter
tablo = .Formula
For Each c In .Cells
If Intersect(c, exclu) Is Nothing And c.Interior.ColorIndex = 6 _
Then Set P = Union(IIf(n, P, c), c): n = n + 1
If n = pas Then n = 0: P = "#N/A"
Next
If n Then P = "#N/A"
On Error Resume Next
Set P = .SpecialCells(xlCellTypeConstants, 16)
Application.Goto P
.Formula = tablo
End With
MsgBox "Durée " & Format(Timer - t, "0.00 \s")
End Sub
On a une idée en tête, on ne peut la résoudre et on l'expose sur le forum.
J'ai une feuille de calculs sur des dilutions de produits pharmacologiques exprimés en unités (il y en a beaucoup).
Dans ma feuille j'ai tout au plus une trentaine de cellules où apparaissent des résultats. Autrement dit, ce n'est pas une base de données aux dimensions qui peuvent donner le vertige.
Si je rentre une erreur dans une cellule de saisie de données --> "? ? ?" dans certaines cellules de résultats.
Tous les résultats dans les cellules de résultats sont alignés à droite (ce sont des valeurs numériques).
Quand apparaissent des "? ? ?", je veux qu'ils soient centrés dans leur cellule (plus voyant et esthétique à mon sens).
Je rectifie l'erreur d'origine --> les "? ? ?" disparaissent et sont substitués par des résultats alignés à droite dans leur cellule.
Pour repérer tous les "? ? ?", j'avais au départ pensé à la solution de mapomme :
VB:
Sub ListeEnBleu()
'mapomme
Dim xcell As Range, tablo(), n&, plage
For Each xcell In [bigplage]
If xcell.Interior.Color = 13434879 Then
n = n + 1
ReDim Preserve tablo(1 To 1, 1 To n)
tablo(1, n) = xcell.Address(0, 0)
End If
Next xcell
Range("p:p").Clear
Range("p45") = "En bleu"
If n > 0 Then Range("p46").Resize(n) = Application.Transpose(tablo)
End Sub
Problème d'exploitation des données par la suite.
Eriiiic me propose la solution suivante :
VB:
Dim PlageCelJaunes As Range, c As Range
For Each c In [BigPlage]
If c.Interior.Color = 65535 Then
If PlageCelJaunes Is Nothing Then
Set PlageCelJaunes = c
Else
Set PlageCelJaunes = Union(PlageCelJaunes, c)
End If
End If
Next c
Ça marche très bien, le seul problème est que je n'arrive pas à exclure certaines cellules jaunes dans la confection de "PlageCelJaune".
job75 et pierrejean me proposent leurs solutions. Je n'arrive pas à exploiter celles de pierrejean. Celles de job75 permettent, en un temps record, de traiter le problème sur une plage gigantesque. Le problème est que je ne parviens pas à adapter ses macros à mon projet.
Je reprends la solution d'Eriiiic en la modifiant :
VB:
Sub GestapoCel()
'Vérifie drastiquement, pour TOUS les calculs (qui se font TOUS dans des macros), s'il apparaît des "? ? ?" dans les cellules, et réalise une mise en forme en conséquence
'Eriiiic / Magic_Doctor
Dim PlageCelJaunes As Range, c As Range, x As Byte
Sheets("BTX").Unprotect MotDePasse
'vérifie s'il y a ou pas des "? ? ?" dans l'aire de travail
For Each c In [bigplage]
If c = "? ? ?" Then x = x + 1
Next
If x > 0 Then 'il y a un ou des "? ? ?"
For Each c In [bigplage]
If c = "? ? ?" Then 'cellules où il y a "? ? ?"
If PlageCelJaunes Is Nothing Then
Set PlageCelJaunes = c
Else
Set PlageCelJaunes = Union(PlageCelJaunes, c) 'toutes les cellules où il y a "? ? ?"
End If
End If
Next c
PlageCelJaunes.HorizontalAlignment = xlCenter 'tous les "? ? ?" sont centrés dans leur cellule respective
Else 'il n'y a pas ou plus de "? ? ?"
For Each c In [bigplage]
If c.Interior.Color = 13434879 Then 'cellules jaunes
If PlageCelJaunes Is Nothing Then
Set PlageCelJaunes = c
Else
Set PlageCelJaunes = Union(PlageCelJaunes, c) 'toutes les cellules jaunes
End If
End If
Next c
PlageCelJaunes.HorizontalAlignment = xlRight 'le contenu de toutes les cellules jaunes, sans exception, est justifié à droite
[F6].HorizontalAlignment = xlCenter 'cellule jaune dont le contenu est toujours centré
End If
Sheets("BTX").Protect MotDePasse, True, True, True
End Sub
Maintenant ça marche.
Mais je ne doute pas que l'on puisse encore simplifier cette macro.
Si les cellules avec "? ? ?" ou de couleur jaune ne sont pas trop nombreuses (une ou 2 centaines de zones disjointes) on peut utiliser Union sans précautions particulières.
Autant parcourir la plage une seule fois, c'est plus rapide :
Code:
Sub GestapoCel()
Dim P As Range, PJaune As Range, c As Range
With [BigPlage]
.Parent.Protect MotDePasse, UserInterfaceOnly:=True
For Each c In .Cells
If c = "? ? ?" Then
Set P = Union(IIf(P Is Nothing, c, P), c)
ElseIf c.Interior.Color = 13434879 Then 'couleur jaune
Set PJaune = Union(IIf(PJaune Is Nothing, c, PJaune), c)
End If
Next
If Not P Is Nothing Then P.HorizontalAlignment = xlCenter
If Not PJaune Is Nothing Then PJaune.HorizontalAlignment = xlRight
.Parent.[F6].HorizontalAlignment = xlCenter 'cellule jaune toujours centrée
End With
End Sub
Je viens d'essayer ta macro. Super ! Et en une seule lecture des cellules.
¡Bravo!
Il y a un terme que je vois de plus en plus dans des macros, c'est "Parent".
Qu'est-ce que ça signifie au juste ?
En tout cas merci et une très bonne soirée.
PS : puisque tu es en Normandie, peux-tu demander à quelque Normand, si la confiture de lait (bien qu'elle est quasiment disparue en France) était autrefois faite à la maison par les grands-mères ? Il me semble que oui, du moins dans certaines régions françaises.
Ils prétendent ici (surtout les Argentins qui sont, pour le moins spéciaux à tous points de vue...) qu'ils l'ont inventé ("dulce de leche"). J'en doute. Comme pour le "faina" (une espèce de pizza sans rien, à base de farine de pois chiches), alors que c'est originaire du nord de l'Italie. À Nice (ancienne ville italienne) ça s'appelle "socca". Quoi qu'il en soit, le dulce de leche ici, même s'il est obsessionnel (il y en a de PARTOUT !!!), est le meilleur qui soit (je parle de l'industriel). Pour en avoir goûté ailleurs dont en France, fabriqué par des artisans.
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.