Nommer suite de shape

Noopy123

XLDnaute Junior
Bonjour,

J'ai une suite de shape rectangle qui se créé selon le code suivant :
VB:
x = ActiveCell.Row               ' définit la ligne de la cellule active
y = ActiveCell.Column           ' définit la colonne de la cellule active
For L = x To x + 5              ' 8 est le nombre de rectangles en X
    For C = y To y + 5          ' 5 est le nombre de rectangles en Y
        With Cells(L, C)
            ActiveSheet.Shapes.AddShape(msoShapeRectangle, .Left, .Top, .Width, .Height).Select
            Selection.ShapeRange.ShapeStyle = msoShapeStylePreset1
              
             End With
        
    Next C
Next L

J’aimerais pourvoir nommer les rectangles créés ,via ce code, avec la cellules dans lequel ils paraissent (sachant que la cellule est aléatoire en fonction de la cellule sélectionnée , ... Mais impossible de trouver la solution
Sinon a Default de leur donner les nom 1,2,3,4....

Merci par avance pour votre aide
 

Noopy123

XLDnaute Junior
Voilà la solution :)
VB:
If TypeName(Selection) = "Range" Then
Set Grille = Selection.Item(1).Resize(1, 5)
Grille.RowHeight = 50: Grille.ColumnWidth = 6
With ActiveSheet
    For Each c In Grille
    Set shp = .Shapes.AddShape(1, c.Left, c.Top, c.Width, c.Height)
    shp.Line.ForeColor.RGB = RGB(0, 0, 0)
    shp.Fill.ForeColor.RGB = RGB(255, 255, 255)
    shp.Name = "Rect_" & c.Address(0, 0)
    shp.Placement = xlFreeFloating

    Next
End With
End If

Set Base = Selection.Item(1).Resize(2, 5)
Base.RowHeight = 50: Base.ColumnWidth = 4.91
 

Staple1600

XLDnaute Barbatruc
Re

Si j'étais, je m’intéresserai à la fusion de cellules.
Voir l'exemple ci-dessous
(ce n'est donc qu'un exemple, pas une solution finalisée)
VB:
Sub Grille_POUR_TEST()
Dim c As Range, m As Range, Grille As Range, shp As Shape
If TypeName(Selection) = "Range" Then
Set Grille = Selection.Item(1).Resize(6, 6)
Grille.RowHeight = 50: Grille.ColumnWidth = 4.86
Grille(6, 4).Resize(, 3).Merge: Grille(4, 1).Resize(, 2).Merge
Grille(4, 3).Resize(, 2).Merge: Grille(4, 5).Resize(, 2).Merge
Grille(6, 1).Resize(, 3).Merge: Grille(2, 2).Resize(, 2).Merge
With ActiveSheet
For Each c In Grille
If c.MergeCells Then
Set m = c(1).MergeArea
Set shp = .Shapes.AddShape(1, m.Left, m.Top, m.Width, m.Height)
shp.Line.ForeColor.RGB = RGB(192, 0, 0): shp.Fill.ForeColor.RGB = RGB(255, 255, 255)
shp.Name = "Rect_" & c(1).MergeArea.Address(0, 0)
Else
Set shp = .Shapes.AddShape(1, c.Left, c.Top, c.Width, c.Height)
shp.Line.ForeColor.RGB = RGB(192, 0, 0): shp.Fill.ForeColor.RGB = RGB(255, 255, 255)
shp.Name = "Rect_" & c.Address(0, 0)
End If
Next
End With
End If
End Sub
 

Noopy123

XLDnaute Junior
Génial l'idée de la fusion, je n'avais pas pensé à ça ! Merci beaucoup j'ai réussi à créer toutes mes formes et en plus à les nommer :)

Par contre sais-tu pourquoi ça me créé 2 rectangle sur la zone sélectionnée au lieu de 1. Rien de très dérangeant mais c'est au cas où ^^
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Rebelote
Génial l'idée de la fusion, je n'avais pas pensé à ça ! Merci beaucoup j'ai réussi à créer toutes mes formes et en plus à les nommer
Reparlons encore une fois d'usage...:rolleyes:
Un autre usage, c'est de publier dans sa discussion la dernière mouture de son code (ou de sa formule)
Toujours dans l'idée que cela profite à tout le forum.
Dommage qu'il faille "rabâcher" une seconde fois ce que j'avais déjà suggéré au message#15.
 

Noopy123

XLDnaute Junior
VB:
Private Sub CommandButton3_Click()
Dim c As Range, m As Range, Grille As Range, shp As Shape
If TypeName(Selection) = "Range" Then
Set Grille = Selection.Item(1).Resize(6, 6)
Grille.RowHeight = 50: Grille.ColumnWidth = 4.91
Grille(4, 1).Resize(, 2).Merge
Grille(4, 3).Resize(, 2).Merge
Grille(4, 5).Resize(, 2).Merge
With ActiveSheet
For Each c In Grille
If c.MergeCells Then
Set m = c(1).MergeArea
Set shp = .Shapes.AddShape(1, m.Left, m.Top, m.Width, m.Height)
shp.Line.ForeColor.RGB = RGB(192, 0, 0): shp.Fill.ForeColor.RGB = RGB(255, 255, 255)
shp.Name = "Rect_" & c.Address(0, 0)
Else
Set shp = .Shapes.AddShape(1, c.Left, c.Top, c.Width, c.Height)
shp.Line.ForeColor.RGB = RGB(192, 0, 0): shp.Fill.ForeColor.RGB = RGB(255, 255, 255)
shp.Name = "Rect_" & c.Address(0, 0)
End If
Next
End With
End If

Grille(1).Resize(6, 6).MergeCells = False

End Sub

Il s'agit d'un vulgaire copier coller légèrement transformé
 

Discussions similaires

Réponses
0
Affichages
157
Réponses
1
Affichages
177

Statistiques des forums

Discussions
312 339
Messages
2 087 408
Membres
103 539
dernier inscrit
RAPH2012