Sub test_ok()
Dim tab_SHP() As Variant, i&, shp As Shape
With ActiveSheet
ReDim tab_SHP(1 To .Shapes.Count)
For i = 1 To .Shapes.Count
If .Shapes(i).AutoShapeType = 1 Then ' 1=Rectangle
tab_SHP(i) = .Shapes(i).Name
End If
Next
Set shp = .Shapes.Range(tab_SHP).Group
End With
shp.Name = "TEST"
End Sub
Sub Grouper()
Set Shp = ActiveSheet.DrawingObjects.group
Shp.Name = "toto"
End Sub
Sub test_ok()
Dim tab_SHP() As Variant, i&, shp As Shape
With ActiveSheet
ReDim tab_SHP(1 To .Shapes.Count)
For i = 1 To .Shapes.Count
If .Shapes(i).AutoShapeType = 1 Then ' 1=Rectangle
tab_SHP(i) = .Shapes(i).Name
End If
Next
Set shp = .Shapes.Range(tab_SHP).Group
End With
shp.Name = "TEST"
End Sub
si je ne me trompe pas ca s'appelle un organigrameMon code dessine des rectangles alignés qui représentent des travées et l'ensemble de ces travées formera une rangée. Ces rangées sont alignées les une sous les autres.
Et donc, l'objectif c'est que les rangées composées de travées soient groupées pour pouvoir les positionner comme bon me semble et reproduire le plan d'un rayonnage.
Bonjour, oui c'est vrai que décrit comme je l'ai fait on peut penser à un organigramme mais non en fait c'est réellement des rayonnages tels que l'on peut les voir chez IKEA par exemple.Bonjour à tous
si je ne me trompe pas ca s'appelle un organigrame
Ah bon ? Moi, en te lisant, j'avais pensé à des rayonnages de supermarché, ou à ceux d'un hangar de stockage.en fait c'est réellement des rayonnages tels que l'on peut les voir chez IKEA par exemple.
Sub MiseEnformerack_Plan_G()
ThisWorkbook.RefreshAll
'On dessine un carré pour une travée par rangée
'variable
Dim sh As Shape
Dim i As Integer, NbRangee As Integer, nbtravee As Integer, Coorx As Integer, Coory As Integer
Dim n As Integer
n = 0
NbRangee = Feuil6.Range("C2").Value 'nb de rangée
'Zone de traçage
ThisWorkbook.Worksheets("Plan_G").Activate
' Pas de grille de fond
ActiveWindow.DisplayGridlines = False
' On vide l'existant
' À vider
For i = ActiveSheet.Shapes().Count To 1 Step -1
ActiveSheet.Shapes(i).Delete
Next i
' Valeurs de départ
Coorx = 300
Coory = 20
For nbligne = 1 To NbRangee
ligne = nbligne + 1
nbtravee = Cells(ligne, 2).Value
n = n + 1
For t = 1 To nbtravee
Set sh = ActiveSheet.Shapes(). _
AddShape(msoShapeRectangle, Coorx, Coory, 32, 10)
' Mise en forme
sh.Line.Weight = 1.5
sh.Line.ForeColor.RGB = RGB(30, 144, 255)
sh.Fill.ForeColor.RGB = RGB(255, 255, 255)
sh.Name = Cells(ligne, 1) & t
With sh.TextFrame.Characters
.Font.Color = vbBlack
.Font.Size = 7
.Text = Cells(ligne, 1) & t
End With
'Alignement du texte dans les case
'Sélection de la rangée
For Each s In ActiveSheet.Shapes
If Not Intersect(s.TopLeftCell, Range("$D$1:$AD$40")) Is Nothing Then
s.Select False
End If
Next s
'Centrage du texte dans les cases
Selection.ShapeRange.TextFrame2.VerticalAnchor = msoAnchorMiddle
Selection.ShapeRange.TextFrame2.TextRange.ParagraphFormat.Alignment = _
msoAlignCenter
' Grouper les Shapes par rangée
Dim tab_SHP() As Variant, v&, shp As Shape
With ActiveSheet
ReDim tab_SHP(1 To .Shapes.Count)
For v = 1 To .Shapes.Count
If .Shapes(v).AutoShapeType = 1 Then ' 1=Rectangle
tab_SHP(v) = .Shapes(v).Name
End If
Next
Set shp = .Shapes.Range(tab_SHP).Group
End With
shp.Name = "Rangee" & n
' Position suivante
Coorx = Coorx + 32
If t = nbtravee Then
Coorx = 300
Coory = Coory + 15
End If
Next t
Next nbligne
Range("A2").Select
MsgBox "Le plan général a été crée !"
End Sub
mais c'est exactement cela!Ah bon ? Moi, en te lisant, j'avais pensé à des rayonnages de supermarché, ou à ceux d'un hangar de stockage.
N'oublie pas de clore ton fil. Pour cela, coche la réponse #2 ou #3 selon celle qui a le mieux résolu ton problème.
Bonjour Staple 1600,Bonsoir @njm504
Donc j'en déduis que mon code du message#3 fait l'affaire ?
@TooFatBoy
Merci pour la synergie
Dim tab_SHP() As Variant, v&, shp As Shape
With ActiveSheet
ReDim tab_SHP(1 To .Shapes.Count)
For v = 1 To .Shapes.Count
If .Shapes(v).AutoShapeType = 1 Then ' 1=Rectangle
tab_SHP(v) = .Shapes(v).Name
End If
Next
Set shp = .Shapes.Range(tab_SHP).Group
End With
Bonjour tu es très clair mais je me permet de reposter ma réponse à ton message #3:Re
@njm504 504
Ceci est est bien le code que j'ai posté dans le message#3, non ?
Donc ce que voulait dire TooFatBoy c'est que tu pouvais marqué ce message comme solution à ta questionVB:Dim tab_SHP() As Variant, v&, shp As Shape With ActiveSheet ReDim tab_SHP(1 To .Shapes.Count) For v = 1 To .Shapes.Count If .Shapes(v).AutoShapeType = 1 Then ' 1=Rectangle tab_SHP(v) = .Shapes(v).Name End If Next Set shp = .Shapes.Range(tab_SHP).Group End With
(ou source d'inspiration si tu préfères)
Suis-je plus clair ?
Sub MiseEnformerack_Plan_G()
ThisWorkbook.RefreshAll
'On dessine un carré pour une travée par rangée
'variable
Dim sh As Shape
Dim i As Integer, NbRangee As Integer, nbtravee As Integer, Coorx As Integer, Coory As Integer
Dim n As Integer
n = 0
NbRangee = Feuil6.Range("C2").Value 'nb de rangée
'Zone de traçage
ThisWorkbook.Worksheets("Plan_G").Activate
' Pas de grille de fond
ActiveWindow.DisplayGridlines = False
' On vide l'existant
' À vider
For i = ActiveSheet.Shapes().Count To 1 Step -1
ActiveSheet.Shapes(i).Delete
Next i
' Valeurs de départ
Coorx = 300
Coory = 20
For nbligne = 1 To NbRangee
ligne = nbligne + 1
nbtravee = Cells(ligne, 2).Value
n = n + 1
For t = 1 To nbtravee
Set sh = ActiveSheet.Shapes(). _
AddShape(msoShapeRectangle, Coorx, Coory, 32, 10)
' Mise en forme
sh.Line.Weight = 1.5
sh.Line.ForeColor.RGB = RGB(30, 144, 255)
sh.Fill.ForeColor.RGB = RGB(255, 255, 255)
sh.Name = Cells(ligne, 1) & t
With sh.TextFrame.Characters
.Font.Color = vbBlack
.Font.Size = 7
.Text = Cells(ligne, 1) & t
End With
'Alignement du texte dans les case
'Sélection de la rangée
For Each s In ActiveSheet.Shapes
If Not Intersect(s.TopLeftCell, Range("$D$1:$AD$40")) Is Nothing Then
s.Select False
End If
Next s
'Centrage du texte dans les cases
Selection.ShapeRange.TextFrame2.VerticalAnchor = msoAnchorMiddle
Selection.ShapeRange.TextFrame2.TextRange.ParagraphFormat.Alignment = _
msoAlignCenter
' Grouper les Shapes par rangée
Dim tab_SHP() As Variant, v&, shp As Shape
With ActiveSheet
ReDim tab_SHP(1 To .Shapes.Count)
For v = 1 To .Shapes.Count
If .Shapes(v).AutoShapeType = 1 Then ' 1=Rectangle
tab_SHP(v) = .Shapes(v).Name
End If
Next
Set shp = .Shapes.Range(tab_SHP).Group
End With
shp.Name = "Rangee" & n
' Position suivante
Coorx = Coorx + 32
If t = nbtravee Then
Coorx = 300
Coory = Coory + 15
End If
Next t
Next nbligne
Range("A2").Select
MsgBox "Le plan général a été crée !"
End Sub
Staple1600, les 2 codes que tu m'as proposés me posent des soucis.
Sub MiseEnformerack_Plan_G_test()
Dim sh As Shape
Dim r, NbRangee&, nbtravee&, Coorx&, Coory&, n&
n = 0
NbRangee = 16 ' pour test
''Zone de traçage
Coorx = 300
Coory = 20
For nbligne = 1 To NbRangee 'juste pour test
ligne = nbligne + 1
nbtravee = Cells(ligne, 2).Value
n = n + 1
For t = 1 To nbtravee
With ActiveSheet.Shapes().AddShape(msoShapeRectangle, Coorx, Coory, 32, 10)
nom = Cells(ligne, 1) & t
.Line.Weight = 1.5
.Line.ForeColor.RGB = RGB(30, 144, 255)
.Fill.ForeColor.RGB = RGB(255, 255, 255)
.Name = nom
With .TextFrame.Characters
.Font.Size = 7: .Font.Color = vbBlack: .Text = nom
End With
.TextFrame2.VerticalAnchor = msoAnchorMiddle
.TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignCenter
End With
' Position suivante
Coorx = Coorx + 32
If t = nbtravee Then
Coorx = 300
Coory = Coory + 15
End If
Next t
Next nbligne
MsgBox "Le plan général a été crée !"
End Sub