Automatiser une mise en forme

Résolu
thibaut1313 Messages postés 21 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 24 août 2011 - 19 août 2011 à 23:55
thibaut1313 Messages postés 21 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 24 août 2011 - 23 août 2011 à 08:46
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

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 août 2011 à 19:32
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
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 août 2011 à 07:35
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
0
cs_GG72 Messages postés 94 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 30 octobre 2011
20 août 2011 à 10:45
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.
0
thibaut1313 Messages postés 21 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 24 août 2011
21 août 2011 à 13:44
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 août 2011 à 13:49
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
0
thibaut1313 Messages postés 21 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 24 août 2011
22 août 2011 à 16:26
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 août 2011 à 17:02
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
0
thibaut1313 Messages postés 21 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 24 août 2011
22 août 2011 à 17:36
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.
0
thibaut1313 Messages postés 21 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 24 août 2011
22 août 2011 à 17:46
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 août 2011 à 17:49
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
0
thibaut1313 Messages postés 21 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 24 août 2011
22 août 2011 à 18:19
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 août 2011 à 18:29
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 août 2011 à 18:32
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 août 2011 à 19:11
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
0
thibaut1313 Messages postés 21 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 24 août 2011
23 août 2011 à 08:24
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 août 2011 à 08:36
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
0
thibaut1313 Messages postés 21 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 24 août 2011
23 août 2011 à 08:46
Voilà c'est fais merci encore
0
Rejoignez-nous