[ RESOLU ] Obtenir un schéma de principe selon un tableau

polobeg

XLDnaute Nouveau
Bonjour à vous tous,

Je me retourne une fois de plus vers vous car pleinement satisfait des réponses obtenues précédemment.

Voici ma demande j'aimerai savoir si cela est possible d'avoir un schéma de principe d'apres des images selon un tableau qui est préalablement rempli.

Je joints un fichier excel qui sera sans aucun doute plus parlant.

Merci d'avance à tous ceux qui y regarderont
Cordialement :)
 

Pièces jointes

  • Probléme.xls
    63 KB · Affichages: 49
  • Probléme.xls
    63 KB · Affichages: 48
  • Probléme.xls
    63 KB · Affichages: 48
Dernière édition:

polobeg

XLDnaute Nouveau
Re : Obtenir un schéma de principe selon un tableau

JOB, vous ne cesserez jamais de m'impressionner.

Le double clic est il obligatoire n'y a t-il pas moyen que cela soit automatique ? ou bien mettre en bout de ligne "mise en forme" par exemple

Le deuxieme fichier, un bijou j'aimerai vraiment avoir les connaissances requisses pour inventer un tel fichier.
L'histoire de la hauteur des objets et sympa mais si cela pouvait etre automatique.
Je m'explique :

J'ai une mise en page a respecter avec un emplacement précis
Si ma colonne d'image est trop grande est ce possible qu'elle se reduise et donc s'adapte d'elle meme à ce cadre ?

Je ne sais pas si je suis bien clair dans mon explication.

Cordialement
 

job75

XLDnaute Barbatruc
Re : Obtenir un schéma de principe selon un tableau

Re,

Si je comprends bien la nouvelle version fonctionne correctement chez vous.

Le double clic est il obligatoire n'y a t-il pas moyen que cela soit automatique ? ou bien mettre en bout de ligne "mise en forme" par exemple

Le double-clic me paraît indispensable car on ne va pas créer autant de groupes d'objets qu'il y a de lignes, cela serait bien inutile et serait du genre usine à gaz.

J'ai une mise en page a respecter avec un emplacement précis
Si ma colonne d'image est trop grande est ce possible qu'elle se reduise et donc s'adapte d'elle meme à ce cadre ?

Cela paraît bien difficile, il vaut mieux décider au coup par coup quels objets on réduit (ou agrandit).

Enfin pour terminer, faire un cadre avec des bordures n'est pas le top.

Dans ce fichier (2) j'utilise une Shape "Rectangle 1" qui se redimensionne automatiquement.

Par ailleurs dans les propriétés de "ZoneTexte 1" j'ai coché "Ajuster la forme au texte".

Edit : j'avais fait une erreur : la macro AjusterHauteur était appelée après le calcul de h et y.

Ce doit bien sûr être avant.

A+
 

Pièces jointes

  • Shapes sans Label avec ajustement hauteur(2).xls
    104 KB · Affichages: 30
Dernière édition:

job75

XLDnaute Barbatruc
Re : Obtenir un schéma de principe selon un tableau

Re,

Il y a un moyen de redimensionner automatiquement les objets pour qu'ils soient tous à la même échelle :

- préciser pour les 5 objets à droite à quelles hauteurs (en cm) ils correspondent

- insérer une ligne (6) et dans B6:M6 calculer le coefficient de réduction/agrandissement qu'il faut appliquer aux objets.

C'est à vous de faire ce travail.

Quand vous aurez fini revenez avec le fichier, j'adapterai la macro.

A+
 

job75

XLDnaute Barbatruc
Re : Obtenir un schéma de principe selon un tableau

Re,

Non, pas besoin d'une ligne supplémentaire.

Il suffit d'un nouveau paramètre (href), les valeurs étant en colonne R.

Le code dans son intégralité :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, [A6:N9]) Is Nothing Then Exit Sub 'plage à adapter
Dim lig, x#, y#, s As Shape
Cancel = True
lig = Target.Row - 3
'---RAZ à adapter---
Application.ScreenUpdating = False
For Each s In Shapes
  If Not Intersect(s.TopLeftCell, [J14:N1000]) Is Nothing _
    And s.Name <> "Rectangle 1" Then s.Delete
Next
'---initialisation à adapter---
With Shapes("Rectangle 1")
  .Left = [J14].Left
  .Top = [J14].Top
  .Width = 0
  .Visible = False
End With
x = [J14].Left + 16
y = [J14].Top + 16
'---Copies des Shapes à adapter---
CopieShape [K4:M4], lig, Shapes("Picture 66"), x, y, "Réhausse", [R7], 0
CopieShape [J4], lig, Shapes("Picture 63"), x, y, "Dalle", [R9], 0
CopieShape [E4:I4], lig, Shapes("Picture 67"), x, y, "TR", [R13], 0
CopieShape [B4:D4], lig, Shapes("Picture 64"), x, y, "ED", [R18], 0
If y > [J14].Top + 16 Then
  CopieShape [A4], lig, Shapes("Picture 65"), x, y, "FDR ht", [R24], 1
  Shapes("Rectangle 1").Visible = True
End If
Application.ScreenUpdating = True
End Sub

Sub CopieShape(r As Range, lig, s As Shape, x#, y#, titre$, href#, der As Byte)
Dim i, coef#, h#, w#, xrectangle#
For Each r In r
  For i = 1 To IIf(der, 1, Val(r(lig)))
    s.Copy
    Me.Paste
    With Selection
      .Left = x
      .Top = y
      .ShapeRange.LockAspectRatio = msoFalse
      coef = 100 * IIf(der, r(lig), r(2)) / href 'r(2) => ligne masquée
      .ShapeRange.ScaleHeight coef, msoFalse, msoScaleFromTopLeft
      h = .Height
      w = .Width
    End With
    y = y + h
    Me.DrawingObjects("ZoneTexte 1").Copy
    Me.Paste
    Selection.Text = titre & " " & _
      IIf(der, 100 * Val(Replace(r(lig), ",", ".")), r)
    Selection.Left = x + w + 4
    Selection.Top = y - h / 2 - Selection.Height / 2
    xrectangle = Selection.Left + Selection.Width + 10
    With Me.Shapes("Rectangle 1")
      .Height = y + 16 - .Top
      If xrectangle - .Left > .Width Then .Width = xrectangle - .Left
    End With
  Next
Next
ActiveCell.Activate
End Sub
Fichier (3).

Bonne soirée.
 

Pièces jointes

  • Shapes sans Label avec ajustement hauteur(3).xls
    115.5 KB · Affichages: 31

job75

XLDnaute Barbatruc
Re : Obtenir un schéma de principe selon un tableau

Re,

Je n'ai pas oublié que vous vouliez avoir les objets dans une zone bien déterminée.

Dans ce fichier (4) c'est la zone J14:N38 (en jaune), modifiable bien sûr.

A la fin de la macro il faut passer par un groupage des objets, "Rectangle 1" compris.

La hauteur du groupe est ajustée à la hauteur de la plage, on ne touche pas à sa largeur.

Le nouveau code :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, [A6:N9]) Is Nothing Then Exit Sub 'plage à adapter
Dim zone As Range, lig, x#, y#, s As Shape
Cancel = True
Set zone = [J14:N38] 'zone des Shapes, à adapter
lig = Target.Row - 3
Application.ScreenUpdating = False
'---RAZ---
For Each s In Shapes
  If Not Intersect(s.TopLeftCell, zone) Is Nothing _
    And s.Name <> "Rectangle 1" Then s.Delete
Next
'---initialisation---
With Shapes("Rectangle 1")
  .Left = zone(1).Left + 0.1
  .Top = zone(1).Top + 0.1
  .Width = zone.Width - 0.2
  .Visible = False
End With
x = zone(1).Left + 16
y = zone(1).Top + 16
'---Copies des Shapes à adapter---
CopieShape [K4:M4], lig, Shapes("Picture 66"), x, y, "Réhausse", [R7], 0
CopieShape [J4], lig, Shapes("Picture 63"), x, y, "Dalle", [R9], 0
CopieShape [E4:I4], lig, Shapes("Picture 67"), x, y, "TR", [R13], 0
CopieShape [B4:D4], lig, Shapes("Picture 64"), x, y, "ED", [R18], 0
If y > zone(1).Top + 16 Then
  CopieShape [A4], lig, Shapes("Picture 65"), x, y, "FDR ht", [R24], 1
  Shapes("Rectangle 1").Visible = True
  '---ajustement de la hauteur du groupe à la zone des Shapes---
  For Each s In Shapes
    If Not Intersect(s.TopLeftCell, zone) Is Nothing Then s.Select False
  Next
  With Selection.ShapeRange.Group 'groupage
    .Height = zone.Height - 0.2
    .Ungroup
  End With
  ActiveCell.Activate
End If
Application.ScreenUpdating = True
End Sub

Sub CopieShape(r As Range, lig, s As Shape, x#, y#, titre$, href#, der As Byte)
Dim i, coef#, h#, w#
For Each r In r
  For i = 1 To IIf(der, 1, Val(r(lig)))
    s.Copy
    Me.Paste
    With Selection
      .Left = x
      .Top = y
      .ShapeRange.LockAspectRatio = msoFalse
      coef = 100 * IIf(der, r(lig), r(2)) / href 'r(2) => ligne masquée
      .ShapeRange.ScaleHeight coef, msoFalse, msoScaleFromTopLeft
      h = .Height
      w = .Width
    End With
    y = y + h
    Me.DrawingObjects("ZoneTexte 1").Copy
    Me.Paste
    Selection.Text = titre & " " & _
      IIf(der, 100 * Val(Replace(r(lig), ",", ".")), r)
    Selection.Left = x + w
    Selection.Top = y - h / 2 - Selection.Height / 2
    With Me.Shapes("Rectangle 1")
      .Height = y + 16 - .Top
    End With
  Next
Next
End Sub
Bonne nuit.
 

Pièces jointes

  • Shapes sans Label avec ajustement hauteur(4).xls
    117 KB · Affichages: 34

polobeg

XLDnaute Nouveau
Re : Obtenir un schéma de principe selon un tableau

Bonjour,

Merci beaucoup j'ai bien cela que je veux,en revanche je ne comprends pas pourquoi une image defini à 100 c ( exemple ) s'agrandi lorsque dans le tableau elle est defini à 90 ou 60 ou 30 inférieur à 100 quoi.

De plus vous me dites :

Le double-clic me paraît indispensable car on ne va pas créer autant de groupes d'objets qu'il y a de lignes, cela serait bien inutile et serait du genre usine à gaz.

Mais je ne veux pas tout mettre dans le meme onglet c'est un peu le meme but que mon precedent post
1 ligne = 1 onglet
Ainsi j'ai 20 lignes à remplir cela me fait donc un schéma dans un onglet different à chaque fois. Pour cela que l'histoire du double clic me gêne.

Cordialement
 

job75

XLDnaute Barbatruc
Re : Obtenir un schéma de principe selon un tableau

Bonjour polobeg, le forum,

je ne comprends pas pourquoi une image defini à 100 c ( exemple ) s'agrandi lorsque dans le tableau elle est defini à 90 ou 60 ou 30 inférieur à 100 quoi.

Bien comprendre que sur le fichier (3) les objets sont mis à l'échelle déterminée par href en colonne R.

Ensuite au fichier (4) le groupe est ajusté pour entrer complètement dans la zone.

Il y a d'ailleurs des limites : chez moi la zone J14:N32 passe, J14:N31 ne passe plus.

Je vais étudier la question des onglets.

Bonne journée.
 

job75

XLDnaute Barbatruc
Re : Obtenir un schéma de principe selon un tableau

Re,

Fichier (5) avec un onglet par ligne :

Code:
Dim F As Worksheet 'variable mémorisée

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Not Sh.Name Like "Ligne*" Then Exit Sub
Dim zone As Range, lig&, x#, y#, s As Shape
Set F = Feuil1 'CodeName
Set zone = Sh.[B3:E27] 'zone des Shapes, à adapter
lig = Val(Mid(Sh.Name, 6)) - 3
Application.ScreenUpdating = False
'---RAZ---
For Each s In Sh.Shapes
  If Not Intersect(s.TopLeftCell, zone) Is Nothing _
    And s.Name <> "Rectangle 1" Then s.Delete
Next
'---initialisation---
With Sh.Shapes("Rectangle 1")
  .Left = zone(1).Left + 0.1
  .Top = zone(1).Top + 0.1
  .Width = zone.Width - 0.2
  .Visible = False
End With
x = zone(1).Left + 16
y = zone(1).Top + 16
'---Copies des Shapes à adapter---
CopieShape F.[K4:M4], lig, F.Shapes("Picture 66"), x, y, "Réhausse", F.[R7], 0
CopieShape F.[J4], lig, F.Shapes("Picture 63"), x, y, "Dalle", F.[R9], 0
CopieShape F.[E4:I4], lig, F.Shapes("Picture 67"), x, y, "TR", F.[R13], 0
CopieShape F.[B4:D4], lig, F.Shapes("Picture 64"), x, y, "ED", F.[R18], 0
If y > zone(1).Top + 16 Then
  CopieShape F.[A4], lig, F.Shapes("Picture 65"), x, y, "FDR ht", F.[R24], 1
  Sh.Shapes("Rectangle 1").Visible = True
  '---ajustement de la hauteur du groupe à la zone des Shapes---
  For Each s In Sh.Shapes
    If Not Intersect(s.TopLeftCell, zone) Is Nothing Then s.Select False
  Next
  With Selection.ShapeRange.Group 'groupage
    .Height = zone.Height - 0.2
    .Ungroup
  End With
  ActiveCell.Activate
End If
Application.ScreenUpdating = True
End Sub

Sub CopieShape(r As Range, lig, s As Shape, x#, y#, titre$, href#, der As Byte)
Dim i, coef#, h#, w#
For Each r In r
  For i = 1 To IIf(der, 1, Val(r(lig)))
    s.Copy
    ActiveSheet.Paste
    With Selection
      .Left = x
      .Top = y
      .ShapeRange.LockAspectRatio = msoFalse
      coef = 100 * IIf(der, r(lig), r(2)) / href 'r(2) => ligne masquée
      .ShapeRange.ScaleHeight coef, msoFalse, msoScaleFromTopLeft
      h = .Height
      w = .Width
    End With
    y = y + h
    F.DrawingObjects("ZoneTexte 1").Copy
    ActiveSheet.Paste
    Selection.Text = titre & " " & _
      IIf(der, 100 * Val(Replace(r(lig), ",", ".")), r)
    Selection.Left = x + w
    Selection.Top = y - h / 2 - Selection.Height / 2
    With ActiveSheet.Shapes("Rectangle 1")
      .Height = y + 16 - .Top
    End With
  Next
Next
End Sub
Important : dans chaque feuille "Ligne" il faut avoir créé la Shape "Rectangle 1".

A+
 

Pièces jointes

  • Shapes sans Label avec ajustement hauteur(5).xls
    169 KB · Affichages: 27

job75

XLDnaute Barbatruc
Re : Obtenir un schéma de principe selon un tableau

Re,

Sur les fichiers précédents, s'il n'y a par exemple que 2 objets, il seront agrandis quelle que soit leur taille.

En effet la hauteur de "Rectangle 1" est modifiée chaque fois qu'un objet est ajouté.

Si l'on ne veut pas d'agrandissements mais uniquement des réductions, il faut modifier la hauteur de "Rectangle 1" uniquement quand la hauteur de la zone est dépassée :

Code:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
'-----
With Sh.Shapes("Rectangle 1")
  .Left = zone(1).Left + 0.1
  .Top = zone(1).Top + 0.1
  .Width = zone.Width - 0.2
  .Height = zone.Height - 0.2
  .Visible = False
End With
'-----

Sub CopieShape(r As Range, lig, s As Shape, x#, y#, titre$, href#, der As Byte)
'-----
    With ActiveSheet.Shapes("Rectangle 1")
      If y + 16 - .Top > .Height Then .Height = y + 16 - .Top
    End With
'-----
Fichier (6), voyez "Groupe 4".

A+
 

Pièces jointes

  • Shapes sans Label avec ajustement hauteur(6).xls
    135 KB · Affichages: 37
Dernière édition:

job75

XLDnaute Barbatruc
Re : Obtenir un schéma de principe selon un tableau

Bonjour polobeg, le forum,

De retour à Paris, sur Excel 2003, j'ai testé le fichier (5) du post #14.

Il ne fonctionne pas à cause de Label1 et voici la raison.

En mode "Création" il n'est pas possible d'accéder aux propriétés de Label1 : c'est un objet vérolé.

Dans ce fichier (6) je l'ai supprimé et recréé, maintenant tout fonctionne bien.

L'énigme est résolue, ah mais !!!

A+
 

Pièces jointes

  • Shapes(6).xls
    68.5 KB · Affichages: 43
Dernière édition:

polobeg

XLDnaute Nouveau
Re : Obtenir un schéma de principe selon un tableau

Bonjour Job,

Désolé je n'ai pas encore pu regarder à tout cela, et y a de quoi faire à priori :)
J'etais en formation prés de marseille toute la semaine et la de retour beaucoup de boulot

Je vous tiens informer dés que j'aurais pris 5 min
Merci bien
Cordialement
 

polobeg

XLDnaute Nouveau
Re : Obtenir un schéma de principe selon un tableau

Bonjour JOB,

Je commence seulement à revenir sur ce sujet afin de le mettre en place sur mon fichier
mais je n'arrive pas à enlever l'idée du HREF qui reduit ou agrandi la taille de mon image.

Car finalement je vais creer une image par élement à la cote juste ( Comment dois je procédé ? ) j'ai essayé par tatonnement dans le fichier #25

Cordialement
 

job75

XLDnaute Barbatruc
Re : Obtenir un schéma de principe selon un tableau

Bonjour polobeg,

Les données href sont indispensables car elles permettent la mise à l'échelle des objets.

Ensuite, avec le fichier (6) du post #25, comme je l'ai dit, les images ne sont pas agrandies.

Et si l'on ne veut pas avoir de réduction, prévoir une zone de hauteur suffisante pour tous les cas.

Par exemple B3:E100.

A+
 

polobeg

XLDnaute Nouveau
Re : Obtenir un schéma de principe selon un tableau

Bonjour Job,

Je suis en phase de rebasculer mon fichier exemple sur mon fichier définitif mais j'ai un petit souci

avec cette ligne la : .ShapeRange.ScaleHeight coef, msoFalse, msoScaleFromTopLeft
peux tu me dire à quoi celle ci correspond j'ai peut etre omnis une étape

mon avis serait que j'ai oublié : coef = 100 * IIf(der, r(lig), r(2)) / href 'r(2) => ligne masquée d'appliquer ceci ( Peut être )

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 327
Membres
103 518
dernier inscrit
hbenaoun63