Microsoft 365 Affichage d'un texte sur une cellule qui se décale

Léraud Florian

XLDnaute Junior
Bonjour le forum =)

Afin de finaliser mon tableur, j'aimerais qu'il m'affiche un certain nombre de messages.

Le but est simple :

-si la valeur présente dans la ligne "Heures BE restantes / Semaine " est égale à 0 alors j'aimerais que la case "Remarque" affiche "BE occupé" de la semaine correspondante
-si la valeur présente dans la ligne "Heures Fabrication restantes / Semaine " est égale à 0 alors j'aimerais que la case "Remarque" affiche "Fab occupée" de la semaine correspondante
-si la valeur présente dans la ligne "Heures Finition restantes / Semaine " est égale à 0 alors j'aimerais que la case "Remarque" affiche "Fini occupée" de la semaine correspondante
-si la valeur présente dans la ligne "Heures Pose restantes / Semaine " est égale à 0 alors j'aimerais que la case "Remarque" affiche "Pose occupée" de la semaine correspondante

Mais il se peut qu'il y ait plusieurs "domaines" qui s'ajoute : ex : "BE occupé" et "Pose occupée" pour une même semaine
Exemple :

1657525605633.png


Mais il est possible d'ajouter plusieurs chantiers par semaine (voir PJ) et donc de créer un décalage de ligne. Du fait du décalage des cellules, je ne parviens pas à faire cela :/
PS : au passage, je ne comprends pas pourquoi la ligne .Range.Columns(j).AutoFit n'ajoute pas la colonne comme elle le devrait 🤔. Si quelqu'un a une explication je suis preneur^^.

Merci d'avance =)
 

Pièces jointes

  • Planning avancé final opérationnel.xlsm
    320.5 KB · Affichages: 5
Solution
@Léraud Florian

voilà, c'est fait ! :)

sur la feuille, tu peux voir 8 des 16 cas possibles ; les 8 autres cas sont en mettant un 1 pour les Heures BE restantes, donc en G17:N17.

formule personnalisée en G21 (déjà étirée à droite jusqu'en N21) : =GetRem(G17;G18;G19;G20)


comme tu pourras le voir à la lecture du code VBA, je n'ai pas utilisé "@" ! pourquoi ? tout simplement car mon système avec "@" avait pour but d'éviter un caractère de saut de ligne en début...

soan

XLDnaute Barbatruc
Inactif
Bonsoir Florian,

ton fichier en retour ; formule en G21 :

Code:
=SUBSTITUE(SUBSTITUE(SUBSTITUE("#" & SI(G17=0;"BE occupé";"") & SI(G18=0;"@" & "Fab occupée";"") & SI(G19=0;"@" & "Fini occupée";"") & SI(G20=0;"@" & "Pose occupée";"");"@";CAR(10));"#" & CAR(10);"");"#";"")

Image.jpg


à toi de faire les tests : je te laisse t'amuser à mettre des 1 à la place des 0 en G17:G20 ; essaye toutes les combinaisons possibles ! c'est juste une piste ; à toi d'adapter ce qui est nécessaire ! 😁 😜

(pour la suite, je laisse la place à un autre intervenant)

soan
 

Pièces jointes

  • Planning avancé final opérationnel.xlsm
    324.6 KB · Affichages: 2

Léraud Florian

XLDnaute Junior
Bonjour à tous, bonjour soan =)

C'est exactement ce que je voulais, je vais essayer de l'adapter à une macro (car sinon l'équation va disparaitre à chaque rafraichissement de la page à cause de la ligne suivante :)
1657605033976.png

Juste une petite question concernant ton équation, à quoi sert le "@" 😁

En tout cas, merci pour ton travail ;)
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Florian,

Léraud Florian à dit:
C'est exactement ce que je voulais

merci pour ton retour ! 😊



Léraud Florian à dit:
Juste une petite question concernant ton équation, à quoi sert le "@" 😁

j'avais un peu peur que tu me le demandes, car à vrai dire je ne comprends pas bien moi-même ma propre formule ! 😭

... nan, sérieusement : le symbole "@" est juste un caractère bien distinctif qui permet ensuite de le remplacer par CAR(10) ; et CAR(10) est un caractère de saut de ligne : c'est pour passer à la ligne suivante, et c'est grâce à ça qu'on peut mettre plusieurs lignes dans une même cellule.​



attention : il faut aussi que dans Format de cellule,
Alignement, la case soit cochée pour :​

☑ Renvoyer à la ligne automatiquement

soan
 
Dernière édition:

Léraud Florian

XLDnaute Junior
Bonjour Florian,

merci pour ton retour ! 😊
Pas de quoi, c'est normal 😁
j'avais un peu peur que tu me le demandes, car à vrai dire je ne comprends pas bien moi-même ma propre formule ! 😭
Alors j'aimerais bien ne pas comprendre comme vous 😙

... nan, sérieusement : le symbole "@" est juste un caractère bien distinctif qui permet ensuite de le remplacer par CAR(10) ; et CAR(10) est un caractère de saut de ligne : c'est pour passer à la ligne suivante, et c'est grâce à ça qu'on peut mettre plusieurs lignes dans une même cellule.​


Ah oui d'accord je crois voir ^^, merci à vous =)
Mais donc "@" est une variable qui va prendre un chr(10) ?
attention : il faut aussi que dans Format de cellule,
Alignement, la case soit cochée pour :​

☑ Renvoyer à la ligne automatiquement

soan
Effectivement, je viens de voir le résultat sans ^^ toutes les chaines de caractères se mettent à la suite 😅

Merci à vous 😄
 

soan

XLDnaute Barbatruc
Inactif
@Léraud Florian

complément en image de mon post précédent :

Image.jpg




Mais donc "@" est une variable qui va prendre un chr(10) ?

non, "@" n'est pas du tout une variable ! du moins pas au sens de variable VBA ! une variable VBA étant en fait un emplacement alloué en RAM (mémoire vive) ; emplacement auquel est attribué le nom de la variable.

"@" est juste du texte d'un seul caractère, comme par exemple la lettre "A" ou le chiffre "5" ; mais j'ai justement choisi un caractère distinctif qui n'apparaît normalement pas dans le texte habituel d'une telle cellule, sinon le remplacement par CAR(10) chamboulerait tout !

si par exemple ta cellule avait dû contenir des adresses mail, j'aurais évidemment choisi un autre caractère distinctif puisque toute adresse mail valide doit obligatoirement comporter un caractère "@" !​

soan
 

Léraud Florian

XLDnaute Junior
@Léraud Florian

complément en image de mon post précédent :

Regarde la pièce jointe 1145094
Merci pour la petite précision ^^




non, "@" n'est pas du tout une variable ! du moins pas au sens de variable VBA ! une variable VBA étant en fait un emplacement alloué en RAM (mémoire vive) ; emplacement auquel est attribué le nom de la variable.

"@" est juste du texte d'un seul caractère, comme par exemple la lettre "A" ou le chiffre "5" ; mais j'ai justement choisi un caractère distinctif qui n'apparaît normalement pas dans le texte habituel d'une telle cellule, sinon le remplacement par CAR(10) chamboulerait tout !

si par exemple ta cellule avait dû contenir des adresses mail, j'aurais évidemment choisi un autre caractère distinctif puisque toute adresse mail valide doit obligatoirement comporter un caractère "@" !​

soan
Ah ooookk, je comprends mieux là pour le coup ;)

Merci pour les explications =)
 

soan

XLDnaute Barbatruc
Inactif
@Léraud Florian

je vais essayer de l'adapter à une macro (car sinon l'équation va disparaitre à chaque rafraichissement de la page à cause de la ligne suivante :)

attention : ne fais rien encore pour adapter ma formule en macro ! tu perdrais ton temps pour rien ! 😭

tu comprendras avec mon prochain post, et c'est moi-même qui vais faire l'adaptation en macro.

mais ça va me prendre pas mal de temps : conception + longue explication dans le post.

(alors ne t'inquiètes pas si ma réponse va beaucoup tarder ! je travaille dessus !)

soan
 

Léraud Florian

XLDnaute Junior
attention : ne fais rien encore pour adapter ma formule en macro ! tu perdrais ton temps pour rien ! 😭

tu comprendras avec mon prochain post, et c'est moi-même qui vais faire l'adaptation en macro.

mais ça va me prendre pas mal de temps : conception + longue explication dans le post.

(alors ne t'inquiètes pas si ma réponse va beaucoup tarder ! je travaille dessus !)

soan

C'est plus que je n'espérais ^^

Merci pour ton investissement, c'est très généreux à toi 😄

Pas de soucis pour le temps, cela me permet d'essayer de comprendre plus en détail ta formule 😉
 

soan

XLDnaute Barbatruc
Inactif
@Léraud Florian

voilà, c'est fait ! :)

sur la feuille, tu peux voir 8 des 16 cas possibles ; les 8 autres cas sont en mettant un 1 pour les Heures BE restantes, donc en G17:N17.

formule personnalisée en G21 (déjà étirée à droite jusqu'en N21) : =GetRem(G17;G18;G19;G20)


comme tu pourras le voir à la lecture du code VBA, je n'ai pas utilisé "@" ! pourquoi ? tout simplement car mon système avec "@" avait pour but d'éviter un caractère de saut de ligne en début de cellule, ce qui aurait entraîné une ligne vide avant le reste du texte de la cellule.

avec les différentes conditions qu'il y a à tester, la souplesse de VBA permet de le faire facilement, mais par formule sur la feuille de calcul, ça oblige à faire quelque chose de plus compliqué ! car dans la concaténation des différents cas à séparer par des sauts de ligne, chacun d'eux peut être la cause d'un saut de ligne en début de cellule !


voici donc la raison de mon avertissement du post #8 : je ne voulais pas te laisser essayer de faire une adaptation de mon système avec "@" alors que je savais déjà que c'était utile seulement pour une formule de la feuille de calcul, et inutile en VBA ; cela même si mon code VBA est une fonction personnalisée.

je te laisse faire tous les tests ; si tu as besoin d'un complément d'information, ou d'une adaptation, n'hésite pas à demander. 😉



code VBA (14 lignes) :

VB:
Option Explicit

Function GetRem(a%, b%, c%, d%) As String
  Dim s2$
  Const lf As String * 1 = vbLf
  Const s1 As String * 8 = " occupée"
  If a = 0 Then s2 = "BE" & Left$(s1, 7)
  If b = 0 Then s2 = s2 & lf & "Fab" & s1
  If c = 0 Then s2 = s2 & lf & "Fini" & s1
  If d = 0 Then s2 = s2 & lf & "Pose" & s1
  If Left$(s2, 1) = lf Then s2 = Right$(s2, Len(s2) - 1)
  GetRem = s2
End Function

soan
 

Pièces jointes

  • Exo Florian.xlsm
    18.3 KB · Affichages: 1
Dernière édition:

Léraud Florian

XLDnaute Junior
@soan

J'ai pu avoir l'agréable surprise de voir que tout fonctionne à la perfection 😁

J'ai juste une petite question concernant cette ligne que je n'ai pas comprise :

VB:
If a = 0 Then s2 = "BE" & Left$(s1, 7)

Si a=0 (donc la cellule en question dans le tableur)n on écrit "BE" mais je ne comprends pas la commande left ^^

Merci pour ton superbe travail de qualité en tout cas ! 😉
 

Léraud Florian

XLDnaute Junior
@soan

J'ai pu avoir l'agréable surprise de voir que tout fonctionne à la perfection 😁

J'ai juste une petite question concernant cette ligne que je n'ai pas comprise :

VB:
If a = 0 Then s2 = "BE" & Left$(s1, 7)

Si a=0 (donc la cellule en question dans le tableur)n on écrit "BE" mais je ne comprends pas la commande left ^^

Merci pour ton superbe travail de qualité en tout cas ! 😉
J'a compris ! Cette ligne permet de compter le nombre de lettres à partir de la gauche pour enlever le "e" de "occupée" ^^
 

soan

XLDnaute Barbatruc
Inactif
J'ai pu avoir l'agréable surprise de voir que tout fonctionne à la perfection 😁

alors c'est impeccable ! 😊


Merci pour ton superbe travail de qualité en tout cas ! 😉

j'essaye de faire de mon mieux ! 😜



pour ta question sur la fonction Left$(), voici la réponse :

Left$() est l'équivalent VBA de la fonction Excel GAUCHE() : ça prend les n caractères de gauche d'un texte ; ici, le texte est s1 : Const s1 As String * 8 = " occupée" ; c'est une constante chaîne de caractères de longueur fixe, de 8 caractères : " occupée" (espace initial compris) ; or pour BE, le caractère « e » final est en trop ! donc en prenant les 7 caractères de gauche, on a bien " occupé", sans « e » final.

si je préfère écrire Left$() au lieu de Left(), c'est car sans le caractère « $ », le retour est du type Variant ; je trouve que c'est mieux avec « $ » car alors, le retour est de type String ; or un Variant occupe plus de place mémoire qu'un autre type de donnée, chaîne de caractères ou autre.​

soan
 
Dernière édition:

Léraud Florian

XLDnaute Junior
alors c'est impeccable ! 😊




j'essaye de faire de mon mieux ! 😜



pour ta question sur la fonction Left$(), voici la réponse :

Left$() est l'équivalent VBA de la fonction Excel GAUCHE() : ça prend les n caractères de gauche d'un texte ; ici, le texte est s1 : Const s1 As String * 8 = " occupée" ; c'est une constante chaîne de caractères de longueur fixe, de 8 caractères : " occupée" (espace initial compris) ; or pour BE, le caractère « e » final est en trop ! donc en prenant les 7 caractères de gauche, on a bien " occupé", sans « e » final.​

si je préfères écrire Left$() au lieu de Left(), c'est car sans le caractère « $ », le retour est du type Variant ; je trouve que c'est mieux avec « $ » car alors, le retour est de type String ; or un Variant occupe plus de place mémoire qu'un autre type de donnée, chaîne de caractères ou autre.

soan

Merci pour ton explication beaucoup plus analytique que la mienne ^^

Maintenant que je sais son fonctionnement, je vais pouvoir m'en servir pour de futurs projets ;)
 

Discussions similaires

Réponses
3
Affichages
115

Membres actuellement en ligne

Statistiques des forums

Discussions
313 283
Messages
2 096 813
Membres
106 752
dernier inscrit
Tahiri1976