xlsgen > overview > VBA macros |
xlsgen can read and extract in plain-text any VBA macro stored in an Excel spreadsheet, provided the spreadsheet is not password-protected.
VBA macros are stored at several levels :
The following source code extracts VBA macros from each of the mentioned levels :
Java code |
XlsWorkbook wbk = engine.Open( "Book1_testmacros.xls", "" ); XlsWorksheet wksht = wbk.getWorksheetByIndex(1); //read the workbook macros String sWbkMacros = wbk.getVBAMacros(); //==> will return this : // //Private Sub Workbook_Open() // MsgBox "Workbook_Open" //End Sub //read the worksheet 1 macros String sWkshtMacros = wksht.getVBAMacros(); //==> will return this : // //Private Sub Worksheet_SelectionChange(ByVal Target As Range) // Target.Interior.ColorIndex = 5 //End Sub //read macros for each module int nbModules = wbk.getVBAModules().getCount(); for (int i = 1; i <= nbModules; i++) { String sModuleMacros = wbk.getVBAModules().getItem(i).getVBAMacros(); } //==> will return this (Module1) : // //Public Function MySum(a, b) As Integer // MySum = a + b - a * b //End Function //==> and this (Module2) : // //Sub Macro1() //' //' Macro1 Macro //' Macro recorded 2 by xyz //' // //' // Range("D5:D9").Select // With Selection.Interior // .ColorIndex = 6 // .Pattern = xlSolid // End With // Range("E5:E9").Select // Selection.Font.ColorIndex = 3 // With Selection.Interior // .ColorIndex = 6 // .Pattern = xlSolid // End With //End Sub |
VB code |
Dim wbk As IXlsWorkbook Set wbk = engine.Open("Book1_testmacros.xls", "") Dim wksht As IXlsWorksheet Set wksht = wbk.WorksheetByIndex(1) ' read the workbook macros Dim sWbk As String sWbk = wbk.VBAMacros ' ==> will return this : ' 'Private Sub Workbook_Open() ' MsgBox "Workbook_Open" 'End Sub ' read the worksheet 1 macros Dim sWksht As String sWksht = wksht.VBAMacros ' ==> will return this : ' 'Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' Target.Interior.ColorIndex = 5 'End Sub ' read macros for each module Dim nbModules As Integer nbModules = wbk.VBAModules.Count Dim i As Integer For i = 1 To nbModules Dim sModule As String sModule = wbk.VBAModules.Item(i).VBAMacros Next ' ==> will return this (Module1) : ' 'Public Function MySum(a, b) As Integer ' MySum = a + b - a * b 'End Function ' ==> and this (Module2) : ' 'Sub Macro1() '' '' Macro1 Macro '' Macro recorded 2 by xyz '' ' '' ' Range("D5:D9").Select ' With Selection.Interior ' .ColorIndex = 6 ' .Pattern = xlSolid ' End With ' Range("E5:E9").Select ' Selection.Font.ColorIndex = 3 ' With Selection.Interior ' .ColorIndex = 6 ' .Pattern = xlSolid ' End With 'End Sub |
C# code |
IXlsWorkbook wbk = engine.Open( "Book1_testmacros.xls", "" ); IXlsWorksheet wksht = wbk.get_WorksheetByIndex(1); //read the workbook macros String sWbk = wbk.VBAMacros; //==> will return this : // //Private Sub Workbook_Open() // MsgBox "Workbook_Open" //End Sub //read the worksheet 1 macros String sWksht = wksht.VBAMacros; //==> will return this : // //Private Sub Worksheet_SelectionChange(ByVal Target As Range) // Target.Interior.ColorIndex = 5 //End Sub //read macros for each module int nbModules = wbk.VBAModules.Count; for (int i = 1; i <= nbModules; i++) { String sModule = wbk.VBAModules.get_Item(i).VBAMacros; } //==> will return this (Module1) : // //Public Function MySum(a, b) As Integer // MySum = a + b - a * b //End Function //==> and this (Module2) : // //Sub Macro1() //' //' Macro1 Macro //' Macro recorded 2 by xyz //' // //' // Range("D5:D9").Select // With Selection.Interior // .ColorIndex = 6 // .Pattern = xlSolid // End With // Range("E5:E9").Select // Selection.Font.ColorIndex = 3 // With Selection.Interior // .ColorIndex = 6 // .Pattern = xlSolid // End With //End Sub |
C++ code |
xlsgen::IXlsWorkbookPtr wbk = engine->Open( L"Book1_testmacros.xls", L"" ); xlsgen::IXlsWorksheetPtr wksht = wbk->WorksheetByIndex[1]; // read the workbook macros WriteFile(L"Workbook.txt", wbk->VBAMacros); // ==> will return this : // //Private Sub Workbook_Open() // MsgBox "Workbook_Open" //End Sub // read the worksheet 1 macros WriteFile(L"Worksheet1.txt", wksht->VBAMacros); // ==> will return this : // //Private Sub Worksheet_SelectionChange(ByVal Target As Range) // Target.Interior.ColorIndex = 5 //End Sub // read macros for each module int nbModules = wbk->VBAModules->Count; for (int i = 1; i <= nbModules; i++) { WCHAR s[128]; swprintf(s, L"AdditionalModule%d.txt", i); WriteFile(s, wbk->VBAModules->Item[i]->VBAMacros); } // ==> will return this (Module1) : // //Public Function MySum(a, b) As Integer // MySum = a + b - a * b //End Function // ==> and this (Module2) : // //Sub Macro1() //' //' Macro1 Macro //' Macro recorded 2 by xyz //' // //' // Range("D5:D9").Select // With Selection.Interior // .ColorIndex = 6 // .Pattern = xlSolid // End With // Range("E5:E9").Select // Selection.Font.ColorIndex = 3 // With Selection.Interior // .ColorIndex = 6 // .Pattern = xlSolid // End With //End Sub void WriteFile(LPWSTR filename, BSTR contents) { FILE* f = _wfopen(filename, L"w+b"); if (f) { fwrite((void*)contents, ::SysStringLen(contents) * 2, 1, f); fclose(f); } } |
xlsgen documentation. © ARsT Design all rights reserved.