En OpenXML, les macros sont une combinaison de format binaire et les fichiers XML relation.
Pour vérifier cela par vous-même, créez un nouveau fichier Word/Excel, créez une nouvelle macro et enregistrez-le en tant que document/classeur à extension macro. Fermez le fichier et renommez-le pour qu'il se termine par .zip
.
Dans le répertoire principal, vous trouverez le fichier [Content_Types].xml
, à l'intérieur duquel il y a deux pointeurs de relation:
<Default Extension="bin" ContentType="application/vnd.ms-office.vbaProject"/>
<Override PartName="/word/vbaData.xml" ContentType="application/vnd.ms-word.vbaData+xml"/>
Pour suivre ces fichiers, recherchez word/vbaData.xml
, à l'intérieur de laquelle il y aura quelque chose comme:
<wne:vbaSuppData ...namespaces ommitted... >
<wne:mcds>
<wne:mcd wne:macroName="PROJECT.NEWMACROS.MACRO1"
wne:name="Project.NewMacros.Macro1"
wne:bEncrypt="00"
wne:cmg="56"/>
</wne:mcds>
</wne:vbaSuppData>
Ceci montre qu'il existe une macro nommée Project.NewMacros.Macro1
, mais rien d'autre. Alors regardons à l'intérieur de word/_rels/document.xml.rels
:
<Relationships ...namespaces ommitted...>
<Relationship Id="rId1"
Type="http://schemas.microsoft.com/office/2006/relationships/vbaProject"
Target="vbaProject.bin"/>
...other relationships ommitted...
</Relationships>
Ce point à word/vbaProject.bin
, qui est un format de fichier binaire. Si vous avez besoin d'ajouter cette macro par programme (par exemple, vous ne pouvez pas définir tout le reste et ajouter manuellement la macro), vous pouvez créer manuellement la macro dans un document unique, puis copier par programme le flux binaire manuellement créé le fichier vbaProject.bin
dans un nouveau fichier vbaProject.bin
.
Si vous décidez de suivre l'approche de copie de flux, the answer to this question includes a snippet demonstrating one way to do so.