2017-10-02 08:15:36 +00:00
|
|
|
#### VBA and Macros
|
|
|
|
|
|
|
|
VBA Macros are stored in a special data blob that is exposed in the `vbaraw`
|
|
|
|
property of the workbook object when the `bookVBA` option is `true`. They are
|
2017-10-27 16:25:54 +00:00
|
|
|
supported in `XLSM`, `XLSB`, and `BIFF8 XLS` formats. The supported format
|
|
|
|
writers automatically insert the data blobs if it is present in the workbook and
|
|
|
|
associate with the worksheet names.
|
2017-10-02 08:15:36 +00:00
|
|
|
|
2017-11-20 01:51:14 +00:00
|
|
|
<details>
|
|
|
|
<summary><b>Custom Code Names</b> (click to show)</summary>
|
|
|
|
|
|
|
|
The workbook code name is stored in `wb.Workbook.WBProps.CodeName`. By default,
|
|
|
|
Excel will write `ThisWorkbook` or a translated phrase like `DieseArbeitsmappe`.
|
|
|
|
Worksheet and Chartsheet code names are in the worksheet properties object at
|
|
|
|
`wb.Workbook.Sheets[i].CodeName`. Macrosheets and Dialogsheets are ignored.
|
|
|
|
|
|
|
|
The readers and writers preserve the code names, but they have to be manually
|
|
|
|
set when adding a VBA blob to a different workbook.
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
2017-10-02 08:15:36 +00:00
|
|
|
<details>
|
|
|
|
<summary><b>Macrosheets</b> (click to show)</summary>
|
|
|
|
|
|
|
|
Older versions of Excel also supported a non-VBA "macrosheet" sheet type that
|
|
|
|
stored automation commands. These are exposed in objects with the `!type`
|
|
|
|
property set to `"macro"`.
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
<details>
|
|
|
|
<summary><b>Detecting macros in workbooks</b> (click to show)</summary>
|
|
|
|
|
|
|
|
The `vbaraw` field will only be set if macros are present, so testing is simple:
|
|
|
|
|
|
|
|
```js
|
|
|
|
function wb_has_macro(wb/*:workbook*/)/*:boolean*/ {
|
|
|
|
if(!!wb.vbaraw) return true;
|
|
|
|
const sheets = wb.SheetNames.map((n) => wb.Sheets[n]);
|
|
|
|
return sheets.some((ws) => !!ws && ws['!type']=='macro');
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|