[VBA] Visualiser le contenu d'une forme dans une cellule
Bonjour à tous et à toutes.
Ce topic fait suite à celui-ci : https://forum.excel-pratique.com/excel/macro-creer-des-carres-de-certaines-tailles-automatiquement-t70616-10.html
Mais il n'est pas nécessaire de l'avoir vu (ça peut peut être vous aider à comprendre tout de même
Il existe sur mon excel, des formes (rectangles, et il suffit d'appuyer sur le bouton "création" en haut à gauche de la première feuilles pour créer ), ceux-ci sont nommées
de :
Machine "001"
en passant par "Machine 002"
et "Machine 009"
"Machine 015"
à "Machine 075"
Ces Formes sont créés à partir de données remplis dans "liste", elles contiennent, comme dans la feuille "liste" un nom machine, un numéro de série, etc. (Vous pourrez voir dans le macro, pour la création de ces carrés, qu'il existe des noms spécifique à ces données (Nom, liste, commande) y fessant référence).
Si vous souhaitez rajouter une machine, à celles déjà existantes, il suffit d'effacer les précédentes machines dans "liste", les anciens carrés resteront.
Le nom du carré "Machine 0XX" créé prends automatiquement celui de libre le plus proche de zéro,exemple : je créer les carrés "Machine 001" à "Machine 050", je supprime le "Machine 045", si je créer une nouveau carré, le nouveau carré prendra automatiquement le nom "Machine 045" (pratique pour ma demande !)
Ma demande :
Je voudrais, que dans une nouvelle feuille sur cet Excel, il y est, d'afficher en temps réel, ou à l'aide d'un bouton de lancement de macro, les données indiqués dans les carrés, (correspondants à ce qui à été indiquer dans la feuille "liste" pour leur création).
En effet, actuellement, je peux connaitre le contenu des cellules, uniquement en regardant les carrés 1 par 1. Les données dans la feuille "liste" étant souvent mise à jour, avec le rajout de une ou deux machines, il ne met pas possible de vérifier les machines présentes à l'aide de cette feuille "liste".
La feuille si possible, devra ressembler à la feuille "liste", sauf, que celle-ci, au lieu de créer les carrés, indiquerais ceux existant.
Il ne s'agit pas, de faire copié collé, les données de "liste" vers une autre page, avant de supprimer les données de "liste" et de devoir gérer à "l'a peu prêt". Il faut vraiment, que la macro, cherche dans les "Machines 0XX" les données, et les affiches facilement à la demande.
Merci de votre attention !
Je travail sur Excel 2003 (cela à peut être son importance ?)
PS : ci-joint le fichier Excel
Bonsoir
ValentinF a écrit :Le nom du carré "Machine 0XX" créé prends automatiquement celui de libre le plus proche de zéro,exemple : je créer les carrés "Machine 001" à "Machine 050", je supprime le "Machine 045", si je créer une nouveau carré, le nouveau carré prendra automatiquement le nom "Machine 045" (pratique pour ma demande !)
Je ne crois pas t'avoir dit ça
La macro recherche le numéro de la machine le plus élevé et crée les nouvelles "Machine" à partir de ce numéro +1
A tester
Bonjour Banzai64.
Ce que vous avez fait marche très bien. 8)
Trouvez ci-joint le fichier que j'utilise actuellement et où j'ai intégré le nouveau macro.
Les modifications que j'ai apportées :
J'ai modifié la Base de données des machines avec la possibilité de truquer la taille de certaines machines en les agrandissant (trop petite pour voir clairement l'écriture à l'intérieur), et le nom de la feuille "liste" est devenu "création".
Dans la feuille "Création" j'ai rajouté (un peu par bidouille) un moyen d'avoir les machines positionnés de manière Vertical ou Horizontal.
J'ai modifié les tailles d'écritures dans le macro de "création" et mis, le "sens" sur la même ligne que le "client" histoire de gagner de la place.
Et j'ai supprimé l'affichage du N° de série ( en rouge ) dans les carrés, j'ai gardé la possibilité de l'écrire dans la feuille "création" (supposant que ça servira pour la suite)
A rajouter :
Le problème est que maintenant dans "liste machines", tout est décalé. (et j'aimerais même si à présent , le N° série ne s'affiche plus dans le carré, qu'il s'affiche tout de même dans la feuille "liste machines")
Et j'aimerais avoir la possibilité d'avoir une cellule dans "Création" (ou que cella soit imposé par le macro), pour que l'écriture puisse être a l'horizontale OU à la verticale suivant nos choix. (si, une machine est très longue et posée à la vertical, il est plus intéressant d'avoir l'écriture à 90°, vous pouvez le voir sur certains des carrés existants)
Comme j'ai modifié l'insertion du texte provenant des données dans la feuille "création" (anciennement "liste") dans les rectangles , peut-être qu'il y a des erreurs "dormantes".
PS: Si dans "liste machines", les noms des carrés vont vers les "Machines 100", c'est normal, j'ai fais des tests.
PS: J'ai supprimé le plan de l'atelier, afin de diminuer la taille du tableur Excel (il était au dessus de la limite des 300Ko)
Merci.
Bonjour
Un peu de calme et zen
A tester
Pour l'écriture verticale ce n'est pas lisible
Pour tester : enlève la remarque à la ligne
.TextFrame.Orientation = msoTextOrientationVerticalA toi de voir
Bonjour.
Merci pour ces modifications et excusez-moi pour le temps de réponse (je n'étais pas disponible)
Peut-on rajouter dans le macro une fonction, pour que, suivant que dans la feuille "création" qu'il soit indiquer dans la colonne "H" ou "V", l'écriture soit à l'Horizontale ou à la Verticale (en rapport au post précédent).
Et pourrait on définir, la taille d'écriture en fonction de l'orientation de l'écriture "H" ou "V" (ne vous embetez pas, prenez les mêmes valeurs en V qu'en H pour le moment, je m'occuperai de modifier ça en fonction de mes tests) ?
Merci à vous !
Bonjour
La macro intervertit la Longueur et la largeur si on demande Vertical
Maintenant elle écrit en vertical si la demande est Vertical
A tester
Bonjour et merci.
J'aurais du préciser ma pensée, mais en réalité je voudrais que le texte soit à la vertical comme sur l'image suivante, ou si vous préférer avec une orientation de 90° (Pour moi c'était la même chose, d'où le quiproquo)
Cordialement.
Bonjour
Modifie la ligne
If Vertical = True Then
.TextFrame.Orientation = msoTextOrientationUpward
End IfMagnifique.
Je me retrouves devant une nouvelle énigme un peu bizarre (comme sur le premier topic où on avait des erreurs parfois, parfois non
En bref, trouvez ci-joint la dernière version.
Si je créé une machine Horizontale, l'écriture est à l'horizontale
Si je crée une machine à la Verticale, l'écriture est à la verticale
Si je crée une machine Horizontale APRES une machine Verticale, l'écriture est verticale au lieu d'être Horizontale.
Bizarre Bizarre
Cordialement
Valentin.
Bonjour
Pas réussi à reproduire le bug
Mais je me suis aperçu que les dimensions étaient déjà interverties lors de la sélection H ou V
Modification du code
Bonjour.
Étrangement, moi non plus je n'ai pas réussi à reproduire le bug
J'ai essayé de rajouter des lignes de codes pour pouvoir définir la taille de l'écriture dans les carrés, suivant que l'on soit en Horizontale OU en Vertical, j'ai rajouté dans "If Vertical" :
If Vertical = True Then
.TextFrame.Characters.Font.Size = IIf(Longueur * CoeffLong > 2300, 12, _
IIf(Longueur * CoeffLong > 1999, 9, _
IIf(Longueur * CoeffLong > 1799, 7, _
IIf(Longueur * CoeffLong > 1299, 5, 5))))
.TextFrame.Orientation = msoTextOrientationUpwardMais rien n'y fait.
Et est-il possible de rajouter dans le code, un peu dans le même style du code cité plus haut, une ligne qui définirait à part et seulement la taille du "N° de commande" ?
Cordialement !
Bonjour
Remplace la partie correspondante par celle-ci
.TextFrame.Characters.Font.Size = IIf(Largeur > 2300, 12, _
IIf(Largeur > 1999, 9, _
IIf(Largeur > 1799, 7, _
IIf(Largeur > 1299, 5, 5))))Bonjour.
Ça fonctionne bien.
Une dernière chose :
Je voulais savoir s'il était possible de rajouter, une ligne spécifique à la taille de l'écriture pour la ligne "Commande".
Merci !
Bonjour
Bien sur
Tu déclares une variable ( Dim Ecriture As Double)
Tu initialises ta variable (Ecriture = F2.Range("..." & J) )
Tu te sers de ta variable ( .TextFrame.Characters.Font.Size = Ecriture )
Bonjour.
J'ai rajouté :
Dim Commande As Double
Commande = "N° " & F2.Range("E" & J)
.TextFrame.Characters(Commande).Font.Size = IIf(Largeur * CoeffLarg > 2300, 12, _
IIf(Largeur * CoeffLarg > 1999, 10, _
IIf(Largeur * CoeffLarg > 1799, 9, _
IIf(Largeur * CoeffLarg > 1299, 8, 7))))Juste après la partie avec :
.TextFrame.Characters.Font.Size = IIf(Largeur * CoeffLarg > 2300, 12, _
IIf(Largeur * CoeffLarg > 1999, 9, _
IIf(Largeur * CoeffLarg > 1799, 7, _
IIf(Largeur * CoeffLarg > 1299, 5, 5))))
.TextFrame.VerticalAlignment = xlVAlignCenter
.TextFrame.HorizontalAlignment = xlHAlignCenterEt j'ai le message d'erreur :
"Visual Basic : Erreur de compilation : Déclaration existante dans la portée en cours"
Une idée de ce que c'est ?
Merci.
Bonjour
ValentinF a écrit :J'ai rajouté :
Dim Commande As Double
ValentinF a écrit :Et j'ai le message d'erreur :
"Visual Basic : Erreur de compilation : Déclaration existante dans la portée en cours"
ValentinF a écrit :Une idée de ce que c'est ?
Oui : Déclaration existante dans la portée en cours
Tu as déjà une variable Commande de déclarée
Option Explicit
Sub Creation()
Dim F1 As Worksheet, F2 As Worksheet
Dim PosX As Double, PosY As Double
Dim Sh As Shape, J As Long, CoeffLong As Double, CoeffLarg As Double
Dim NbMachine As Integer, Num As Integer, LongMax As Double
Dim Nom As String, Client As String, Sens As String, Serie As String, Commande As String
Dim Part1 As String, Part2 As String
Dim Longueur As Double, Largeur As Double
Dim Vertical As BooleanBonjour, voici le début de la modification du code :
Dim NbMachine As Integer, Num As Integer, LongMax As Double
Dim Nom As String, Client As String, Sens As String, Serie As String, Commande As String
Dim Ecriture As Double
Dim Part1 As String, Part2 As String
Dim Longueur As Double, Largeur As Double
Dim Vertical As Boolean
Application.ScreenUpdating = False
Set F1 = Sheets("Plan atelier")
Set F2 = Sheets("Création")
CoeffLong = F2.Range("I2")
CoeffLarg = F2.Range("J2")
For Each Sh In F1.Shapes
If Sh.Name Like "Machine*" Then
Num = Val(Mid(Sh.Name, InStr(1, Sh.Name, " ") + 1))
If Num > NbMachine Then NbMachine = Num
End If
Next Sh
'MsgBox "Prochaine machine : " & NbMachine + 1
PosX = 20: PosY = 20
For J = 2 To F2.Range("A" & Rows.Count).End(xlUp).Row
Vertical = False
Nom = F2.Range("A" & J)
Client = F2.Range("B" & J) & " (" & F2.Range("C" & J) & ")"
Serie = "N° " & F2.Range("D" & J)
Commande = "N° " & F2.Range("E" & J)
Ecriture = "N° " & F2.Range("E" & J)
Longueur = F2.Range("G" & J)
Largeur = F2.Range("H" & J)j'ai "erreur d'exécution 13 : incompatibilité de type"
Mais je crois que c'est ma faute, à me relire j'ai mal posé ma question.
Voici ce que je voudrais faire :
Dans les carrés créé par le macro, je veux que la taille d'écriture pour "nom machine", "le sens" et "le client" soit différent de la taille d'écriture de "N° de commande"
Avec la commande "Dim Ecriture as double", j'ai l'impression que je dois rajouter une nouvelle colonne.
Merci !
Cordialement
Bonsoir
ValentinF a écrit :Avec la commande "Dim Ecriture as double", j'ai l'impression que je dois rajouter une nouvelle colonne.
Ton impression est bonne mais ..... une échappatoire
Tu la déduis de la taille du reste du texte
A voir dans le fichier
Bonjour.
Ci-joint la version final (à décompresser)
J'ai rajouté, des boutons (en bas de la feuille création) pour changer automatiquement la couleur de fond et de ligne des carrés sélectionnés. Rajouté quelques consignes. Rajouté une feuille de saisie pouvant prendre comme référence une base de donnée.
Et modifié quelques éléments de la macro "Création" (La taille d'écriture par exemple).
Un grand merci pour toute l'aide que vous m'avez apporté.
Je valide donc ce topic comme résolu.
En espérant cette fois ne pas ré-ouvrir un topic sur le même sujet.