Попробуйте ws.Shapes.SelectAll
, чтобы выбрать все фигуры на листе.
Чтобы выбрать две указанные c фигуры, вы можете использовать следующий способ:
Dim sel As ShapeRange
Set sel = ws.Shapes.Range(Array(ws.Shapes(1).Name, ws.Shapes(2).Name))
sel.Select
Чтобы использовать ваш указанный c способ (shp & shp1), вы должны назвать их после создания. shp.Name = "xx"
и shp1.Name = "yy"
, а затем используйте это следующим образом:
Dim sel As ShapeRange
Set sel = ws.Shapes.Range(Array("xx", "yy"))
'or
Set sel = ws.Shapes.Range(Array(shp.Name, shp1.Name))
sel.Select
'but they must have different names, in order to be individually identified!
Теперь, пожалуйста, используйте следующий (ваш) адаптированный код, способный делать то, что (я понял) вам нужно. Это комментируется в соответствующих областях, и я думаю, что это легко понять. Не забудьте указать значение в ячейке «А4» ... Код сначала удаляет существующие фигуры, если таковые имеются. Если вам это не нужно, вы можете прокомментировать эти строки:
Private Sub RUN()
Dim x As Long, cel As Range, ws As Worksheet, shp As Shape, y As Long, z As Long
Dim orow As Long, ocol As Long, cel0 As Range, shp1 As Shape
Dim sel As ShapeRange, sh As Shape 'new declarations
Set ws = ActiveSheet
orow = 3: ocol = 3
y = ws.Range("A4").value
z = ws.Range("A5").value
Set cel = Range("E6")
Set cel0 = cel.Offset(orow * (z - 1) + 4, 0)
'New: delete all existingn shapes, if any_______________
ws.Shapes.SelectAll: Selection.Delete
'_______________________________________________________
'firstly create all shapes and write their TextFrame text:
For x = 1 To y
Set shp = ws.Shapes.AddShape(msoShapeOval, cel.left, cel.top, cel.width, cel.width)
shp.TextFrame.Characters.text = x
Set shp1 = ws.Shapes.AddShape(msoShapeOval, cel0.left, cel0.top, cel0.width, cel0.width)
shp1.TextFrame.Characters.text = x
Set cel = cel.Offset(0, ocol)
Set cel0 = cel0.Offset(0, ocol)
Next x
'create the shaperange of all existing shapes___
ws.Shapes.SelectAll
Set sel = Selection.ShapeRange
'_______________________________________________
'Changge what can be done at once (except TextFrame properties)
With sel
.Fill.Visible = msoFalse
With .Line
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 0, 0)
.Transparency = 0
End With
End With
'____________________________________________________________
'Change TextFrame properties (individually for each shape):
For Each sh In sel
With sh.TextFrame
.Characters.Font.ColorIndex = 3
.HorizontalAlignment = xlHAlignCenter
.VerticalAlignment = xlVAlignCenter
End With
Next
'__________________________________________________________
End Sub