4 votes

2010 Access - comment ajouter et travailler avec des formes dans un fichier Excel

Je voudrais ajouter des formes et les modifier à partir de vba Access 2010 dans une feuille de calcul Excel.

Le code que j'ai écrit sur la base de la "macro d'enregistrement" d'Excel est le suivant :

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

Sur les instructions ".Shapes(1).Range.ShapeStyle..." et les instructions suivantes ".Shapes(1).", je reçois une erreur "Object doesn't support this property or method". En supprimant le "(1)", on obtient une erreur de compilation.

La bibliothèque mso est installée et les éléments référencés (par exemple, msoShapeStylePreset10) ont les valeurs appropriées.

Des idées sur ce que je dois faire ?

1voto

LEBoyd Points 84

Donc, pour ce que ça vaut, j'ai trouvé que si je déplaçais l'index d'après les "Shapes" à après les "Range", cela fonctionne comme il faut.

Ceci :

Shapes(1).Range.....

les modifications apportées à :

Shapes.Range(1)

Bien sûr, si vous regardez le code, vous voyez que la deuxième forme est celle sur laquelle je veux vraiment travailler.

Shapes(2).Range

n'a pas fonctionné.

Shapes.Range(2)

a fonctionné parfaitement.

1voto

xidgel Points 2127

Shapes(1) renvoie un Shape qui n'a PAS d'objet Range membre, donc Shapes(1).Range générera une erreur. Suppression de Range de chaque ligne résoudra probablement votre problème, par exemple Shapes(1).ShapeStyle = ...

J'espère que cela vous aidera.

1voto

Andre Points 19020

Worksheet.Shapes.AddShape() renvoie un Shape objet.

Il est préférable d'utiliser cet objet, plutôt que de se fier au fait que la forme créée soit la deuxième sur la feuille (ce qui peut changer à un moment donné).

Ce code (sans .Range ) fonctionne pour moi dans 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

Vous pouvez également le faire sans variable Shape (mais je trouve le code ci-dessus plus lisible) :

With wksModelsMenu.Shapes.AddShape(msoShapeRoundedRectangle, iLeft, iTop, iWidth, iHeight)
    .ShapeStyle = msoShapeStylePreset10
    ' etc.
End With

Note supplémentaire :
Vous pouvez faire de même lors de la création de la feuille :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X