Automatiser une mise en forme

Résolu
Signaler
Messages postés
21
Date d'inscription
mercredi 9 juin 2010
Statut
Membre
Dernière intervention
24 août 2011
-
Messages postés
21
Date d'inscription
mercredi 9 juin 2010
Statut
Membre
Dernière intervention
24 août 2011
-
Bonsoir a tous,

Je travail beaucoup avec des tableaux excel (je suis sur excel 2010). Pour gagner du temps j'aimerais automatiser de mise en forme. Par exemple quand il y a le symbole & dans une certaine colonne j'aimerais que les 5 cellules directement a droite de la cellule contenant le symbole & ce mette automatiquement avec un fond jaune ou vert et que ces 5 cellules et un contour noir sans les traits de séparation. C'est une exemple mais si je peux faire cela après jadapterai en fonction de mes besoins.

Merci d'avance de prendre le temps de m'aider
Dans l'attente.

17 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
et tu peux même conjuguer (plus lisible) les deux méthodes, ainsi :
Private Sub CommandButton1_Click()
  Dim laplage As Range, cel As Range
  For Each cel In Range("D:D").SpecialCells(xlCellTypeConstants)
   If cel.Value = "&" Then
     If laplage Is Nothing Then
       Set laplage = cel
     Else
       Set laplage = Union(laplage, cel)
     End If
   End If
  Next
  mise_en_forme laplage
End Sub

Sub mise_en_forme(p As Range)
 Dim r As Range
 For Each r In p
   For i = 0 To 5
     r.Offset(0, i).Interior.ColorIndex = 8
  Next
 Next
End Sub


Dans tous mes exemples : la mise en forme concerne l'ensemble (cellule + les 5 à droite)
Si tu ne veux mettre en forme que les >5 à droite, il suffit de commencer les offset (en boucle ou non) à 1 et non 0, bien évidemment.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour,

Je pense en effet que, comme tu le dis toi-même, il ne s'agit là que d'un exemple de mise en forme, exemple pour nous faire comprendre ce que tu cherches à mettre en place.
Mécanisme à mettre en oeuvre, donc :
- dans la colonne considérée, rechercher toutes les cellules contenant ton caractère spécial (utilisation de la fonction Find)
- pour chaque cellule ainsi trouvée : utilisation de Offset pour pointer vers tes 5 cellules "directement à droite" et déterminer la plage à mettre en forme
- application de la mise en forme de ton choix à cette plage

Attention : dès terminée cette mise en forme, il peut être sage de supprimer de la première cellule le caractère "spécial" qu'elle contenait (utilisation de Replace) pour ne pas risquer de recommencer plus tard une opération déjà effectuée.
Voilà (et c'est facile... sans que j'applaudisse pour autant à cette idée, qui ne fera qu'alourdir ton appli )


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
94
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
30 octobre 2011

Bonjour à tous,

Si on veut conserver ce caractère spécial, on peut:
- utiliser la procédure décrite par ucfoutu pour les cellules déjà existantes.
- remplacer l'utilisation de Find par Instr à placer dans la procédure
Worksheet_Change pour les cellules qui seront ajoutées (ou modifiées).

ps: pour ma part j'utilise Excel 2000. Je pense que ceci est également possible avec 2010.

Gérard.
Messages postés
21
Date d'inscription
mercredi 9 juin 2010
Statut
Membre
Dernière intervention
24 août 2011

Un grand merci pour vos réponse rapide mais je suis un véritable débutant en vb pourriez vous m écrire un bout de code ....
Merci d'avance!

Bonne journée
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
pourriez vous m écrire un bout de code ....

Ben (et surtout si tu es débutant) :
Commence donc cette écriture sur les bases indiquées. Nous nous ferons un plaisir de compléter, corriger au besoin ...
Mais comlmence, s'il te plait.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
21
Date d'inscription
mercredi 9 juin 2010
Statut
Membre
Dernière intervention
24 août 2011

Bonjour,

Voila j'ai essayé de taper un bout de code....

Donc sur mon excel j'ai créé un bouton "mettre en forme" afin que lorsque je clic dessus le code s'exécute et mon tableau se mette en forme. J'ai enregistré une macro que j'ai appelé : Macro2_mise_en_forme

Voici le code :

Sub Bouton1_mise_en_forme()

Dim i As Long 'déclaration de variable
Dim j As Long

'petite boucle sur toute la feuille en supposant que les symbole tu les rentres que sur la premiere colonne (sinon faut que tu rajoute une simple boucle for j = 1 to 256)
For i = 1 To 65536
For j = 1 To 256
'et la tu met tous tes if
If Me.Sheet(1).Cells(i).Value = "&" Then
Call Macro2_mise_en_forme
' elseif workbook.sheet(1).cells(i).value = 'autresymbole' then
'Call macro_autresymbole
End If
Next i

End Sub

Le débogueur me dit que l'utilisation du mot clé Me est incorrecte.

Dans l'attente Cordialement.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Déjà,
Me signifie un userform (celui en cours) !
Une cellule a DEUX coordonnées

If Me.Sheet(1).Cells(i,j).Value = "&" Then

Et pourquoi parcourir toutes les cellules de ta feuille de calcul ?
ton symbole peut-t-il se trouver n'importe où ou dans une seule colonne bien déterminée ?
Si n'importe où, tu vas probablement avoir des problèmes de "chevauchements" possibles !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
21
Date d'inscription
mercredi 9 juin 2010
Statut
Membre
Dernière intervention
24 août 2011

En effet le symbole se trouve dans un colonne bien déterminé mais je ne savais pas comment la définir c'est la colonne D de ma feuille.
Messages postés
21
Date d'inscription
mercredi 9 juin 2010
Statut
Membre
Dernière intervention
24 août 2011

J'ai essayé n apportant ta modification et maintenant je n'ai plus l’erreur en revanche maintenant il me dit
erreur de compil sub ou function non défini en parlant de mon sheet
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bon,
il y a mieux à faire que ton mécanisme, mais je vais le respecter pour que tu avances pas à pas et en comprenant :
Supposons que la colonne considérée soit la colonne A et que certaines de ses cellules contiennent UNIQUEMENT "&" (je dis uniquement car je ne sais pas si tu recherches celles avec uniquement "&" ou celles contenant une chaîne contenant elle-même "&" en son sein)
regarde ce que fait ce petit bout de code :
Dim derligne As Long, i As Long
derligne Range("A" & Rows.Count).End(xlUp).Row '>> pour déterminer la dernière ligne remplie de ta colonne A
For i = 1 To derligne
 If Range("A" & i).Value = "&" Then
   Range("A" & i).Select
   MsgBox "en voilà une"
 End If
Next


Bien entendu : dans ton code :
remplace
Range("A" & i).Select
MsgBox "en voilà une"
par l'appel de ta macro de mise en forme, hein.

Quand tout sera bien fini et bien compris de ce mécanisme-là (et pas avant), je te parlerai d'une autre méthode.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
21
Date d'inscription
mercredi 9 juin 2010
Statut
Membre
Dernière intervention
24 août 2011

Bo ben j'ai essayé et aucune erreur de compil n’apparaît y compris pour mon code sur la mise en forme en elle même.
Cependant quand je clic sur l bouton mettre e forme rien ne se passe...

Voici les codes:

Sub Macro2_mise_en_forme()
'
' Macro2_mise_en_forme Macro
'

'
Range("D9:O9").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("K20").Select
End Sub


et le second:
Sub mettre_en_forme()
Dim j As Long

Dim derligne As Long, i As Long
derligne Range("A" & Rows.Count).End(xlUp).Row '>> pour déterminer la dernière ligne remplie de ta colonne A
For i = 1 To derligne
If Range("D" & i).Value = "&" Then
Range("D" & i).Select
Call Macro2_mise_en_forme
End If
Next i

End Sub



Vraiment désolé de vous déranger mais merci de votre aide.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Non.
Ne mélangeons pas tout.
Séparons si tu le veux bien une procédure de l'autre, de sorte à déterminer les erreurs (distinctes) de l'une et de l'autre.
Relance Sub mettre_en_forme() uniquement
remets-y le select et la msgbox ===>> regarde
si tu as une erreur, dis sur quelle ligne (je ne la vois personnellement pas)
Et autre chose :
puisque tu cherches sur la colonne D : pourquoi écrire :
derligne = Range("A" & Rows.Count).End(xlUp).Row
?
C'est "D" et non "A" !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Pour ton information, je viens de lancer un test sur ma machine ===>> aucun problème avec la première sub !
La seconde est une autre affaire et nous ne la regarderons qu'ensuite !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bon... Je dois aller au resto.
Voici les deux réunis (exemples tous deux testés chez moi) :

Sur une feuille de classeur vierge :
mets des & là où tu veux en colonne D
mets sur ta feuille un bouton de commande CommandButton1
mets ce premier code (TON mécanisme) :
Private Sub CommandButton1_Click()
  Dim derligne As Long, i As Long
  derligne Range("D" & Rows.Count).End(xlUp).Row '>> pour déterminer la dernière ligne remplie de ta colonne A
  For i = 1 To derligne
   If Range("D" & i).Value = "&" Then
    mise_en_forme_lourde Range("D" & i)
   End If
  Next
End Sub
Sub mise_en_forme_lourde(p As Range)
  Dim i As Range
  For i = 0 To 5
    p.Offset(0, i).Interior.ColorIndex = 5
  Next
End Sub


clique sur le bouton et constate.

Je te fais maintenant connaître du "plus mieux"

efface tout (remets des & en colonne D) et le bouton de commande, mais cette fois-ci avec ce code :
Private Sub CommandButton1_Click()
  Dim laplage As Range, cel As Range
  For Each cel In Range("D:D").SpecialCells(xlCellTypeConstants)
   If cel.Value = "&" Then
     If laplage Is Nothing Then
       Set laplage = Union(cel, cel.Offset(0, 1), cel.Offset(0, 2), cel.Offset(0, 3), cel.Offset(0, 4), cel.Offset(0, 5))
     Else
       Set laplage = Union(laplage, cel, cel.Offset(0, 1), cel.Offset(0, 2), cel.Offset(0, 3), cel.Offset(0, 4), cel.Offset(0, 5))
     End If
   End If
  Next
  mise_en_forme laplage
End Sub

Sub mise_en_forme(p As Range)
 p.Interior.ColorIndex = 6
End Sub

C'est un exemple et je n'ai ici traité qu'un bout de la mise en forme (dans chacun des deux exemples)
Le second code est nettement meilleur en ce sens qu'il traite toute une plage d'un seul coup et non ligne par ligne
Enfin (car toujours non précisé) : si la cellule ne contient pas uniquement & mais un & inséré dans la chaîne contenue :
kif-kif mais en remplaçant (dans un code comme dans l'autre) = "&" par Like "*&*"
Bon app

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
21
Date d'inscription
mercredi 9 juin 2010
Statut
Membre
Dernière intervention
24 août 2011

Bonjour,

J'arrive ce matin et je vois toutes tes réponses !!
Déjà merci d'avoir tapé tous cela et ensuite un grand merci car ça fonctionne très bien!

Je vais essayer de me débrouiller maintenant.
Encore merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bon.
Il convient alors d'affubler chaque réponse aboutissant à ton but du tag "Réponse Acceptée", si tu souhaites rendre service à d'autres forumeurs confrontés un jour à un problème similaire.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
21
Date d'inscription
mercredi 9 juin 2010
Statut
Membre
Dernière intervention
24 août 2011

Voilà c'est fais merci encore