Как создать макрос из Delphi? Как выполнить макрос, имеющийся в книге?
Вам не удастся создать макрос программно, т.к. по умолчанию в Excel VBA Project отключен доступ к VBA из программ. Как включить эту возможность, читайте "PRB: Programmatic Access to Office XP VBA Project Is Denied"
Пример создания макроса с параметром и вызов его из программы:
Delphi:
try
VBComp := WB.VBProject.VBComponents.Add(1); // vbext_ct_StdModule
VBComp.Name := 'TestModule'; // запишем туда наш макрос
VBComp.CodeModule.AddFromString( 'Public Sub Test(ByVal ADate As Date)'#10 + #9'MsgBox "Привет из VBA!" & Chr(13) & "Сегодня " & ADate, _'#10 + #9#9'vbInformation, "Test макроса"'#10 + 'End Sub'
); except
ShowMessage('Нужно включить вручную в Excel''е "Доверять доступ к Visual Basic Project"'); end; // выполним макрос
XL.Run('Test', Date());
C#:
Microsoft.Vbe.Interop.VBComponent VBComp = XL.ActiveWorkbook.VBProject.VBComponents.Add( Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule); VBComp.Name = "TestModule"; // запишем туда наш макрос VBComp.CodeModule.AddFromString( "Public Sub Test(ByVal ADate As Date)\n" + "\tMsgBox \"Привет из VBA!\" & Chr(13) & \"Сегодня \" & ADate, _\n" + "\t\tvbInformation, \"Test макроса\"\n" + "End Sub"); // и выполним его передав текущую дату XL.Run("Test", DateTime.Today, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing );
Если все же вам очень нужно добавить макрос, независимо от настроек доступа к VBA Project, то можно воспользоваться листом макросов xlExcel4MacroSheet. Макроязык представляет собой "команды".
Delphi:
ASheet := WB.Sheets.Add(EmptyParam, WB.Sheets[WB.Sheets.Count], 1, xlExcel4MacroSheet, lcid) as _Worksheet; ASheet.Range['A1', EmptyParam].Formula := '=alert("Привет из Excel4 MacroSheet!")'; ASheet.Range['A2', EmptyParam].Formula := '=return()'; ASheet.Range['A1', EmptyParam].Run( EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam );
Turn on or off Trust access to Visual Basic Project
How To Create and Call an Excel Macro Programmatically from VB
Programming To The Visual Basic Editor
Run Method