2010 Access - как добавлять и работать с фигурами в файле Excel - PullRequest
0 голосов
/ 07 мая 2018

Я хотел бы добавить фигуры и изменить их из версии 2010 Access vba на листе Excel.

Код, который я написал на основе «макроса записи» в Excel:

StrSheetName = "Menu"
wkbModels.Sheets.Add(before:=wkbModels.Sheets("Models")).Name = StrSheetName
Set wksModelsMenu = wkbModels.Sheets(StrSheetName)

With wksModelsMenu
    iLeft = 1
    iTop = 1
    iWidth = 125
    iHeight = 200
    .Shapes.AddPicture fDirectory & "logo.jpg", False, True, iLeft, iTop, iWidth, iHeight
    iLeft = 240
    iTop = 1
    iWidth = 300
    iHeight = 125
    .Shapes.AddShape(msoShapeRoundedRectangle, iLeft, iTop, iWidth, iHeight).Select
    .Shapes(1).Range.ShapeStyle = msoShapeStylePreset10
    .Shapes(1).Range.TextFrame2.TextRange.Font.Bold = msoTrue
    .Shapes(1).Range.TextFrame2.VerticalAnchor = msoAnchorMiddle
    .Shapes(1).Range.TextFrame2.TextRange.Characters.Text = _
                "TEST TEST TEST"
    .Shapes(1).Range.TextFrame2.TextRange.Characters.ParagraphFormat.Alignment = msoAlignCenter
    .Shapes(1).Range.TextFrame2.TextRange.Characters.Font.Bold = msoTrue
End With

На ".Shapes (1) .Range.ShapeStyle ..." и после ".Shapes (1)." Заявления Я получаю сообщение об ошибке «Объект не поддерживает это свойство или метод». Удаление "(1)" приводит к ошибке компиляции.

Библиотека mso установлена ​​и соответствующие элементы (т. Е. MsoShapeStylePreset10) имеют правильные значения.

Есть идеи, что мне нужно делать?

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Shapes(1) возвращает объект Shape, который НЕ имеет члена Range, поэтому Shapes(1).Range вызовет ошибку. Удаление Range из каждой строки, скорее всего, решит вашу проблему, например Shapes(1).ShapeStyle = ...

Надеюсь, это поможет.

0 голосов
/ 08 мая 2018

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
0 голосов
/ 07 мая 2018

Итак, что бы это ни стоило, я обнаружил, что если я переместил индекс из «фигур» в «диапазон», он работал бы как нужно.

Это:

Shapes(1).Range.....

изменяется на:

Shapes.Range(1)

Конечно, если вы посмотрите на код, вы увидите, что вторая форма - это то, над чем я действительно хочу работать.

Shapes(2).Range

не работает.

Shapes.Range(2)

работал отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...