OVH Cloud OVH Cloud

vba - 2 formats pour une même cellule

14 réponses
Avatar
j-pascal
Bonsoir,

Dans une plage de cellules, j'ai :

="("&TEXTE(NB.SI(C6:C38;"N inscr.");"0")&")"&"
"&TEXTE(NB.SI(C6:C38;"N ret.");"0")

Le résultat pour chaque cellule donne qqch comme : "(2) 8" (ie)

Je souhaite que le chiffre entre parenthèse reste en gris, (ce que
j'ajuste avec Format, etc.) mais que le 2nd chiffre soit en Gras +
couleur.

J'ai essayé ce qui suit, mais ça ne fonctionne pas dès lors qu'il y a
une formule dans les cellules ! Pourtant si j'évalue le contenu des
dites cellules avec "=NBCAR(MaCellule)", la formule me retourne bien le
nombre de caractères contenus !

Faut-il que je recrée la formule via vba et que je fasse un
"Copier/Valeur" ?? J'ai quand même un doute !!

'-----------
Sub MEFC()
Dim c

For Each c In Range("C1:K1")
With c.Characters(4, 7).Font
.Bold = True
.Size = 10
.ColorIndex = 10
End With
Next c

For Each c In Range("C2:K2")
With c.Characters(Start:=4, Length:=7).Font
.Bold = True
.Size = 10
.ColorIndex = 3
End With
Next c
End Sub
'-----------

Merci d'avance pour votre aide,

JP

PS : si ma cellule = "(0)- - - 8" j'ai mis :
Start:=4, Length:=7
4 qui correspond au 1er espace après mon chiffre entre parenthèses ;
faut-il que je mette 7 pour "englober" le 2nd chiffre ? En d'autres
termes, où commence le "Length" ?

4 réponses

1 2
Avatar
Jacky
Re...
Je n'arrive pas à reproduire ton problème
La plage [c1:k2] n'est pas sélectionnée


Il n'y a aucune sélection dans le code proposé

Sinon essaie comme ceci
'------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("$C$8:$K$40")) Is Nothing Then
Mise_En_Forme_JJ
End If
End Sub
'--------------
Sub Mise_En_Forme_JJ()
Application.ScreenUpdating = False
[c3:k4] = [c1:k2].Value
With Range("c3:k4").Font
.Name = "Verdana"
.FontStyle = "Gras"
.Size = 10
.ColorIndex = 15
End With
With Range("c3:k3").Characters(Start:=7, Length:=3).Font
.ColorIndex = 10
End With
With Range("c4:k4").Characters(Start:=7, Length:=3).Font
.ColorIndex = 3
End With
End Sub
'------------------------------
http://www.cijoint.fr/cjlink.php?file=cj200901/cijPF1vejW.xls
--
Bon rétablissement
JJ


"j-pascal" a écrit dans le message de news:

Bonsoir Jacky,

Merci pour ton aide précieuse.

Il y a un truc que je ne m'explique pas. J'ai essayé ton classeur au
bureau ; qq secondes m'ont suffit pour m'apercevoir que tout fonctionnait
parfaitement.

Ce soir je fais un essai à la maison et ça ne fonctionne plus !
J'ai déroulé le code pas à pas :

1 - Si je supprime une valeur, tout est ok
2 - Si j'ajoute une valeur (avec le menu déroulant), les deux dernières
lignes du bout de code suivant ne s'exécutent pas :

'---------
Sub "
Dim ad As String
ad = ActiveCell.Address
Application.ScreenUpdating = False

[c1:k2].Copy
[c3].PasteSpecial Paste:=xlPasteValues
'---------

La plage [c1:k2] n'est pas sélectionnée !! (pourtant aucun msg de
débogage)

A part le fait d'être malade et d'avoir dormi 30 minutes la nuit dernière
(et donc de n'avoir peut-être pas les yeux en face des trous), je n'y
comprends rien !!
La "Private Sub Worksheet_Change(ByVal Target As Range)" détecte bien la
suppression ou l'ajout de données et la proc. "Mise_En_Forme_JJ(col)" se
lance bien dans les deux cas !!

Dans le cas qui ne fonctionne pas, mon curseur vient se placer chaque fois
sur la cellule "c3".

Je viens de remarquer que tout fonctionne bien si je saisie la valeur au
clavier + enter (sans passer par le menu déroulant).

Serait-ce une histoire de DoEvents ?

J'espère à bientôt,

JP


Re...
Celui-ci devrait mieux convenir
http://www.cijoint.fr/cjlink.php?file=cj200901/cijgDKGUOu.xls






Avatar
j-pascal
Merci Jacky pour ta persévérance !

Ton dernier classeur fonctionne (chez moi !) dès lors qu'on supprime
une valeur ; par contre la sélection des dites valeurs actualise les
formules des lignes 1 et 2 mais pas la recopie sur les lignes 3 et 4.
Si, après avoir voulu entrer des valeurs (donc non actualisées), j'en
supprime une, alors tout s'actualise d'un coup (y compris donc, les
valeurs saisies !).

Observations :
- Si je shunte "Function SheetName() As Date" tout fonctionne
parfaitement. Je vais donc trouver une alternative à cette fonction (on
dirait que dans le cas où je saisie une valeur, cette fonction tourne
en boucle !!! et ne débouche plus sur le mise en forme !
- Si je saisie la valeur manuellement (sans passer par le menu
déroulant) tout fonctionne bien, y compris avec la "Function" !

Il me semble qu'au bureau (comme chez toi, semble-t-il) tout fonctionne
parfaitement. Je pense que le pb réside dans ma présente version
d'Excel.

Quoiqu'il en soit je te remercie bcp pour ton aide, car en dehors de ce
pb, j'ai appris pas mal de chose sur ce type de mise en forme que je
pourrais largement réutiliser. Dans le cas présent, se passer de la
référence du nom de l'onglet n'est pas bien grave.

Merci encore pour ta patience,

JP

Re...
Je n'arrive pas à reproduire ton problème
La plage [c1:k2] n'est pas sélectionnée


Il n'y a aucune sélection dans le code proposé

Sinon essaie comme ceci
'------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("$C$8:$K$40")) Is Nothing Then
Mise_En_Forme_JJ
End If
End Sub
'--------------
Sub Mise_En_Forme_JJ()
Application.ScreenUpdating = False
[c3:k4] = [c1:k2].Value
With Range("c3:k4").Font
.Name = "Verdana"
.FontStyle = "Gras"
.Size = 10
.ColorIndex = 15
End With
With Range("c3:k3").Characters(Start:=7, Length:=3).Font
.ColorIndex = 10
End With
With Range("c4:k4").Characters(Start:=7, Length:=3).Font
.ColorIndex = 3
End With
End Sub
'------------------------------
http://www.cijoint.fr/cjlink.php?file=cj200901/cijPF1vejW.xls
--
Bon rétablissement
JJ


"j-pascal" a écrit dans le message de news:

Bonsoir Jacky,

Merci pour ton aide précieuse.

Il y a un truc que je ne m'explique pas. J'ai essayé ton classeur au bureau
; qq secondes m'ont suffit pour m'apercevoir que tout fonctionnait
parfaitement.

Ce soir je fais un essai à la maison et ça ne fonctionne plus !
J'ai déroulé le code pas à pas :

1 - Si je supprime une valeur, tout est ok
2 - Si j'ajoute une valeur (avec le menu déroulant), les deux dernières
lignes du bout de code suivant ne s'exécutent pas :

'---------
Sub "
Dim ad As String
ad = ActiveCell.Address
Application.ScreenUpdating = False

[c1:k2].Copy
[c3].PasteSpecial Paste:=xlPasteValues
'---------

La plage [c1:k2] n'est pas sélectionnée !! (pourtant aucun msg de débogage)

A part le fait d'être malade et d'avoir dormi 30 minutes la nuit dernière
(et donc de n'avoir peut-être pas les yeux en face des trous), je n'y
comprends rien !!
La "Private Sub Worksheet_Change(ByVal Target As Range)" détecte bien la
suppression ou l'ajout de données et la proc. "Mise_En_Forme_JJ(col)" se
lance bien dans les deux cas !!

Dans le cas qui ne fonctionne pas, mon curseur vient se placer chaque fois
sur la cellule "c3".

Je viens de remarquer que tout fonctionne bien si je saisie la valeur au
clavier + enter (sans passer par le menu déroulant).

Serait-ce une histoire de DoEvents ?

J'espère à bientôt,

JP


Re...
Celui-ci devrait mieux convenir
http://www.cijoint.fr/cjlink.php?file=cj200901/cijgDKGUOu.xls








Avatar
Jacky
Re...
Bizarre ton problème
Teste ceci
Efface c3:k4
Et entre une donnée dans une cellule (plage c8:k40) par la liste de
validation
c3:k4 doit se mettre à jour

--
Salutations
JJ


"j-pascal" a écrit dans le message de news:

Merci Jacky pour ta persévérance !

Ton dernier classeur fonctionne (chez moi !) dès lors qu'on supprime une
valeur ; par contre la sélection des dites valeurs actualise les formules
des lignes 1 et 2 mais pas la recopie sur les lignes 3 et 4.
Si, après avoir voulu entrer des valeurs (donc non actualisées), j'en
supprime une, alors tout s'actualise d'un coup (y compris donc, les
valeurs saisies !).

Observations :
- Si je shunte "Function SheetName() As Date" tout fonctionne
parfaitement. Je vais donc trouver une alternative à cette fonction (on
dirait que dans le cas où je saisie une valeur, cette fonction tourne en
boucle !!! et ne débouche plus sur le mise en forme !
- Si je saisie la valeur manuellement (sans passer par le menu déroulant)
tout fonctionne bien, y compris avec la "Function" !

Il me semble qu'au bureau (comme chez toi, semble-t-il) tout fonctionne
parfaitement. Je pense que le pb réside dans ma présente version d'Excel.

Quoiqu'il en soit je te remercie bcp pour ton aide, car en dehors de ce
pb, j'ai appris pas mal de chose sur ce type de mise en forme que je
pourrais largement réutiliser. Dans le cas présent, se passer de la
référence du nom de l'onglet n'est pas bien grave.

Merci encore pour ta patience,

JP

Re...
Je n'arrive pas à reproduire ton problème
La plage [c1:k2] n'est pas sélectionnée


Il n'y a aucune sélection dans le code proposé

Sinon essaie comme ceci
'------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("$C$8:$K$40")) Is Nothing Then
Mise_En_Forme_JJ
End If
End Sub
'--------------
Sub Mise_En_Forme_JJ()
Application.ScreenUpdating = False
[c3:k4] = [c1:k2].Value
With Range("c3:k4").Font
.Name = "Verdana"
.FontStyle = "Gras"
.Size = 10
.ColorIndex = 15
End With
With Range("c3:k3").Characters(Start:=7, Length:=3).Font
.ColorIndex = 10
End With
With Range("c4:k4").Characters(Start:=7, Length:=3).Font
.ColorIndex = 3
End With
End Sub
'------------------------------
http://www.cijoint.fr/cjlink.php?file=cj200901/cijPF1vejW.xls
--
Bon rétablissement
JJ


"j-pascal" a écrit dans le message de news:

Bonsoir Jacky,

Merci pour ton aide précieuse.

Il y a un truc que je ne m'explique pas. J'ai essayé ton classeur au
bureau ; qq secondes m'ont suffit pour m'apercevoir que tout
fonctionnait parfaitement.

Ce soir je fais un essai à la maison et ça ne fonctionne plus !
J'ai déroulé le code pas à pas :

1 - Si je supprime une valeur, tout est ok
2 - Si j'ajoute une valeur (avec le menu déroulant), les deux dernières
lignes du bout de code suivant ne s'exécutent pas :

'---------
Sub "
Dim ad As String
ad = ActiveCell.Address
Application.ScreenUpdating = False

[c1:k2].Copy
[c3].PasteSpecial Paste:=xlPasteValues
'---------

La plage [c1:k2] n'est pas sélectionnée !! (pourtant aucun msg de
débogage)

A part le fait d'être malade et d'avoir dormi 30 minutes la nuit
dernière (et donc de n'avoir peut-être pas les yeux en face des trous),
je n'y comprends rien !!
La "Private Sub Worksheet_Change(ByVal Target As Range)" détecte bien la
suppression ou l'ajout de données et la proc. "Mise_En_Forme_JJ(col)" se
lance bien dans les deux cas !!

Dans le cas qui ne fonctionne pas, mon curseur vient se placer chaque
fois sur la cellule "c3".

Je viens de remarquer que tout fonctionne bien si je saisie la valeur au
clavier + enter (sans passer par le menu déroulant).

Serait-ce une histoire de DoEvents ?

J'espère à bientôt,

JP


Re...
Celui-ci devrait mieux convenir
http://www.cijoint.fr/cjlink.php?file=cj200901/cijgDKGUOu.xls












Avatar
j-pascal
Re..

Je te confirme,
1 - La MAJ s'effectue si j'efface une donnée.
2 - La MAJ ne se fait pas si j'entre une donnée (par la liste de
validation) ; ça fonctionne si je saisie la donnée manuellement.

J'ai bien sûr effectué le test sur ton dernier classeur, sans aucune
modif. de ma part ...

Comme je te l'avais dit, le déroulement du code "pas à pas" montre que
la zone "c1:k2" n'est pas sélectionnée (les "petits pointillés qui
clignotent quand on copie la plage" n'apparaissent pas ...)

Je n'aime pas capituler, mais je crains que ce mystère reste entier ;-(

J'ai remplacé honorablement cette "Function" par une formule pour le
calcule de date. Le résultat est très satisfaisant même s'il ne s'agit
là que d'une alternative ...

Ce qui est étrange c'est que sans la "Function", tout fonctionne !

D'ailleurs, je me demandais s'il était possible d'inhiber une
"Function" comme on le fait avec une procédure en utilisant
"Application.EnableEvents = False" ? Car dans le cas présent, la (les
?) boucles effectuées dans ladite fonction n'apporte rien ...

Bien à toi,

JP

Re...
Bizarre ton problème
Teste ceci
Efface c3:k4
Et entre une donnée dans une cellule (plage c8:k40) par la liste de
validation
c3:k4 doit se mettre à jour

--
Salutations
JJ


"j-pascal" a écrit dans le message de news:

Merci Jacky pour ta persévérance !

Ton dernier classeur fonctionne (chez moi !) dès lors qu'on supprime une
valeur ; par contre la sélection des dites valeurs actualise les formules
des lignes 1 et 2 mais pas la recopie sur les lignes 3 et 4.
Si, après avoir voulu entrer des valeurs (donc non actualisées), j'en
supprime une, alors tout s'actualise d'un coup (y compris donc, les valeurs
saisies !).

Observations :
- Si je shunte "Function SheetName() As Date" tout fonctionne parfaitement.
Je vais donc trouver une alternative à cette fonction (on dirait que dans
le cas où je saisie une valeur, cette fonction tourne en boucle !!! et ne
débouche plus sur le mise en forme !
- Si je saisie la valeur manuellement (sans passer par le menu déroulant)
tout fonctionne bien, y compris avec la "Function" !

Il me semble qu'au bureau (comme chez toi, semble-t-il) tout fonctionne
parfaitement. Je pense que le pb réside dans ma présente version d'Excel.

Quoiqu'il en soit je te remercie bcp pour ton aide, car en dehors de ce pb,
j'ai appris pas mal de chose sur ce type de mise en forme que je pourrais
largement réutiliser. Dans le cas présent, se passer de la référence du nom
de l'onglet n'est pas bien grave.

Merci encore pour ta patience,

JP

Re...
Je n'arrive pas à reproduire ton problème
La plage [c1:k2] n'est pas sélectionnée


Il n'y a aucune sélection dans le code proposé

Sinon essaie comme ceci
'------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("$C$8:$K$40")) Is Nothing Then
Mise_En_Forme_JJ
End If
End Sub
'--------------
Sub Mise_En_Forme_JJ()
Application.ScreenUpdating = False
[c3:k4] = [c1:k2].Value
With Range("c3:k4").Font
.Name = "Verdana"
.FontStyle = "Gras"
.Size = 10
.ColorIndex = 15
End With
With Range("c3:k3").Characters(Start:=7, Length:=3).Font
.ColorIndex = 10
End With
With Range("c4:k4").Characters(Start:=7, Length:=3).Font
.ColorIndex = 3
End With
End Sub
'------------------------------
http://www.cijoint.fr/cjlink.php?file=cj200901/cijPF1vejW.xls
--
Bon rétablissement
JJ


"j-pascal" a écrit dans le message de news:

Bonsoir Jacky,

Merci pour ton aide précieuse.

Il y a un truc que je ne m'explique pas. J'ai essayé ton classeur au
bureau ; qq secondes m'ont suffit pour m'apercevoir que tout fonctionnait
parfaitement.

Ce soir je fais un essai à la maison et ça ne fonctionne plus !
J'ai déroulé le code pas à pas :

1 - Si je supprime une valeur, tout est ok
2 - Si j'ajoute une valeur (avec le menu déroulant), les deux dernières
lignes du bout de code suivant ne s'exécutent pas :

'---------
Sub "
Dim ad As String
ad = ActiveCell.Address
Application.ScreenUpdating = False

[c1:k2].Copy
[c3].PasteSpecial Paste:=xlPasteValues
'---------

La plage [c1:k2] n'est pas sélectionnée !! (pourtant aucun msg de
débogage)

A part le fait d'être malade et d'avoir dormi 30 minutes la nuit dernière
(et donc de n'avoir peut-être pas les yeux en face des trous), je n'y
comprends rien !!
La "Private Sub Worksheet_Change(ByVal Target As Range)" détecte bien la
suppression ou l'ajout de données et la proc. "Mise_En_Forme_JJ(col)" se
lance bien dans les deux cas !!

Dans le cas qui ne fonctionne pas, mon curseur vient se placer chaque
fois sur la cellule "c3".

Je viens de remarquer que tout fonctionne bien si je saisie la valeur au
clavier + enter (sans passer par le menu déroulant).

Serait-ce une histoire de DoEvents ?

J'espère à bientôt,

JP


Re...
Celui-ci devrait mieux convenir
http://www.cijoint.fr/cjlink.php?file=cj200901/cijgDKGUOu.xls














1 2