Worksheet.Shapes.AddShape()
возвращает объект Shape
.
Лучше использовать этот объект, а не полагаться на то, что созданная фигура является второй на листе (которая может измениться в какой-то момент).
Этот код (без .Range
) работает для меня в Access 2010:
Dim shp As Excel.Shape
' Note: there is no reason to select the shape
Set shp = wksModelsMenu.Shapes.AddShape(msoShapeRoundedRectangle, iLeft, iTop, iWidth, iHeight)
' Use the created object to set its properties
With shp
.ShapeStyle = msoShapeStylePreset10
.TextFrame2.TextRange.Font.Bold = msoTrue
.TextFrame2.VerticalAnchor = msoAnchorMiddle
.TextFrame2.TextRange.Characters.Text = "TEST TEST TEST"
.TextFrame2.TextRange.Characters.ParagraphFormat.Alignment = msoAlignCenter
.TextFrame2.TextRange.Characters.Font.Bold = msoTrue
End With
Вы также можете сделать это без переменной Shape (но я считаю, что приведенный выше код лучше читается):
With wksModelsMenu.Shapes.AddShape(msoShapeRoundedRectangle, iLeft, iTop, iWidth, iHeight)
.ShapeStyle = msoShapeStylePreset10
' etc.
End With
Дополнительное примечание:
Вы можете сделать то же самое при создании листа:
Set wksModelsMenu = wkbModels.Sheets.Add(before:=wkbModels.Sheets("Models"))
wksModelsMenu.Name = StrSheetName