| 
									
										
										
										
											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> | 
					
						
							|  |  |  | 
 |