[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 = msoTextOrientationVertical

A 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 If

Magnifique.

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 , mais c'est pas bien grave.

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 = msoTextOrientationUpward

Mais rien n'y fait. Je n'ai toujours pas moyen de dissocier la taille de l'écriture pour les "Horizontal" et les "Vertical"

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 = xlHAlignCenter

Et 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 Boolean

Bonjour, 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.

Rechercher des sujets similaires à "vba visualiser contenu forme"