Вот код встраивания макроса в Excel, делал когда то, правда на Delphi.
function ZapMakros(path_makr:string):boolean;
var
security, i:Integer;
ProcessHandle : THandle;
ProcessID: Integer;
reg:TRegistry;
s, path_sh:string;
hw:cardinal;
W:variant;
begin
Result:=True;
security:=0;
hw:=FindWindow('XLMAIN', nil);
If hw<>0 then
begin
GetWindowThreadProcessID(hw, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
Sleep(500);
end;
try
//Открываем Excel
W:=CreateOleObject('Excel.Application');
try
//Проверяем, установлена ли защита на прогаммный доступ в Visual Basic,
//если установлена снимаем ее
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
If reg.OpenKey('SOFTWARE\Microsoft\Office\10.0\Excel', False) then
begin
reg.CloseKey;
If reg.OpenKey('SOFTWARE\Microsoft\Office\10.0\Excel\Security', False) then
begin
If reg.ValueExists('AccessVBOM') then
security:=reg.ReadInteger('AccessVBOM');
If security<>1 then
reg.WriteInteger('AccessVBOM', 1);
reg.CloseKey;
end
else
begin
If reg.OpenKey('SOFTWARE\Microsoft\Office\10.0\Excel\Security', True) then
begin
security:=1;
reg.WriteInteger('AccessVBOM', 1);
reg.CloseKey;
end;
end;
end;
W.visible:=False;//делаем открытый Excel невидимым
W.Workbooks.Open('d:\Kng.xls');//окрываем документ
//Проверяем, установлен ли уже макрос, если установлен, удаляем его
For i:=1 to W.Workbooks[1].VBProject.VBComponents.Count do
begin
s:=W.Workbooks[1].VBProject.VBComponents.Item(i).Name;
If s='MyMakros' then
begin
W.Workbooks[1].VBProject.VBComponents.Remove(W.Workbooks[1].VBProject.VBComponents.Item(i));
end;
end;
//Добавляем макрос
W.Workbooks[1].VBProject.VBComponents.Import('d:\bas.bas');
W.Workbooks[1].Save;
W.Quit;
finally
//Восстанавливаем защиту на программный доступ
If reg.OpenKey('SOFTWARE\Microsoft\Office\10.0\Excel\Security', False) then
begin
If reg.ValueExists('AccessVBOM') then
begin
reg.WriteInteger('AccessVBOM', security);
end;
reg.CloseKey;
end;
reg.Free;
//Закрываем Excel
hw:=FindWindow('XLMAIN', nil);
If hw<>0 then
begin
GetWindowThreadProcessID(hw, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
end;
end;
s:='Макрос добавлен';
MessageBox(0, PChar(s), 'Makrtest', MB_OK+MB_ICONINFORMATION);
except
s:='Ошибка';
MessageBox(0, PChar(s), 'Makrtest', MB_OK+MB_ICONERROR);
Result:=False;
end;
end;