пишу
try
Excel := CreateOleObject("Excel.Application");
Excel.WorkBooks.Open("C:Rpt20061.xls");
Excel.VBE.ActiveVBProject.VBComponents.Import("C:Module12.bas"); //Тут, как уже понятно, ошибка
Excel.Application.Run("Macro4",
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);
Читаем инет:
В ToolsMacroSecurity есть опция Trust access to VB project.
Вот е надо включить.
Ставим, Закрываем excel. Открываем, проверяем, стоит. Закрываем.
Запускаем программу. Однофигственно.
Читаем инет:
[HKEY_CURRENT_USERSOFTWAREMicrosoftOffice10.0ExcelSecurity]
"AccessVBOM"=dword:00000001
Стоит, Закрываем regedit. Открываем, проверяем, стоит. Закрываем.
Запускаем программу. Однофигственно.
Читаем инет:
Макрос – безопасность – низкая
Ставим, Закрываем excel. Открываем, проверяем, стоит. Закрываем.
Запускаем программу. Однофигственно.
Идем на ww.delphimaster.ru, спрашиваем:
Помогите, люди добрые, кто чем может, сами мы не местные.
← →
Vlad Oshin © ( 2007-04-04 12:26 ) [1]
Макрос – безопасность – низкая/ средняя/ высокая
Тоже самое..
← →
Vlad Oshin © ( 2007-04-04 15:40 ) [2]
А если писать на VBA макрос, то дает этот самый доступ
другой макрос импортируется, автозапускается
т.е. все доверенно получается
что же делать? как заставить из delphi это делать
← →
umbra © ( 2007-04-04 15:58 ) [3]
а если в книге заранее сделать макрос-импортер, а из делфи вызывать этот макрос, передавая ему имя файла, который надо импортировать?
← →
Паша 1 ( 2007-04-04 15:59 ) [4]
попробуй так:
Excel.DisplayAlerts:= False;
таким макаром ты говоришь ехелю, шоб он не задавал дурацких вопросов. правда, насчет макроса – не знаю, остальные вопросы не задает. типа, сохранять ли измененный файл, например.
← →
umbra © ( 2007-04-04 16:04 ) [5]
> Excel.DisplayAlerts:= False;
на настройки безопасности это не влияет
← →
Паша 1 ( 2007-04-04 16:40 ) [6]
> это не влияе
разве я где-то сказал, шо оно влияет? но вполне возможно, шо ехель тогда будет их просто игнорировать. или не будет
← →
Vlad Oshin © ( 2007-04-04 16:42 ) [7]
> umbra © (04.04.07 15:58) [3]
> а если в книге заранее сделать макрос-импортер, а из делфи
> вызывать этот макрос, передавая ему имя файла, который надо
> импортировать?
так, значит, придется вставлять в книгу другой макрос. Программно. Иначе – какой смысл? Можно сразу вставить нужный.
> > Excel.DisplayAlerts:= False;
> на настройки безопасности это не влияет
угу, но на всякий случай – не работает.
← →
umbra © ( 2007-04-04 16:50 ) [8]
>
> так, значит, придется вставлять в книгу другой макрос. Программно.
> Иначе – какой смысл? Можно сразу вставить нужный.
нет, можно сделать файл-образец с макросом-импортером. Затем, создавать новые книги, беря за шаблон этот файл ( Workbooks.Add(образец.xls) ). В новых файлах этот макрос уже будет. А потом его вызывать из делфи ( Application.Run("importer", "c:module.bas") ). Минус в том, что файл-образец должен быть всегда.
Но проблема с сообщением "Программный доступ к проекту Visual Basic не является доверенным" программно, похоже, не решается. Документированным способом, по крайней мере. Недокументированного я не знаю. 🙂
Еще вариант – ниписать AddIn для экселя.
← →
Vlad Oshin © ( 2007-04-04 16:58 ) [9]
> > а если в книге заранее сделать макрос-импортер, а из делфи
>
> > вызывать этот макрос, передавая ему имя файла, который
> надо
> > импортировать?
а если так:
Создать книгу, обозвать Макросной, положить туда макрос. Сразу нужный.
Программно:
1. Открыть книгу Макросную, открыть книгу над которой надо поработать.
2. Выполнить макрос из Макросной книги, но в отношении другой.
(как сам эксель может делать – переходим в нужную книгу, выбираем макрос из другой книги, выполняем)
Тогда вопрос:
А как это сделать? Выполнить макрос из книги, применительно к другой книге?
Следующее выполняет макрос в той же книге, где он и сидит.
Excel2 := CreateOleObject("Excel.Application");
Excel2.WorkBooks.Open("C:BookMacro.xls");
Excel := CreateOleObject("Excel.Application");
Excel.WorkBooks.Open("C:Rpt20061.xls");
Excel2.Application.Run("Macro4",
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);
Пробовал так:
Excel.Application.Run("BookMacro.xls!Macro4",
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);
ругается, что макрос не найден
← →
Vlad Oshin © ( 2007-04-04 16:59 ) [10]
> umbra © (04.04.07 16:50) [8]
упс.. долго писал
сейчас почитаю-попробую
← →
umbra © ( 2007-04-04 17:05 ) [11]
> Выполнить макрос из книги, применительно к другой книге?
передавать макросу книгу в качестве параметра. И хранить можно не в отдельной книге, а в "Личной книге макросов", тогда он будет всегда доступен.
← →
Vlad Oshin © ( 2007-04-04 17:15 ) [12]
> umbra © (04.04.07 17:05) [11]
спасибо, заработало вот так:
Excel := CreateOleObject("Excel.Application");
Excel.WorkBooks.Open("C:BookMacro.xls");
Excel.WorkBooks.Add("C:Rpt20061.xls");
Excel.Application.Run("Hurghada2_3.xls!Macro4",
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);
мне этого достаточно 🙂
спасибо
всем спасибо.
← →
Vlad Oshin © ( 2007-04-04 17:18 ) [13]
только хотел вопрос про сбивающееся форматирование дозадать 🙂
Не получается запустить макрос vba в проекте c#. Подскажите, что я делаю не так. Сначала открываю excel файл,а затем прогоняю макрос. Но вылезает ошибка в строке "oModule = oWb.VBProject.VBComponents.Add(VBA.vbext_ComponentType.vbext_ct_StdModule);" Программный доступ к проекту Visual Basic не является доверенным
2 ответа 2
Дело может быть в самом Excel. Статью по ссылке почитайте. Может поможет. Запрещен программируемый доступ к проекту на VBA для Office По сути нужно разрешить в выполнение в Excel всех макросов – изменить настройки безопасности.
Опция включения доступа к объектной модели находится в Excel 2013 по следующему пути Файл>Параметры>Центр управления безопасностью> Кнопка "Параметры центра управления безопасностью. " > Вкладка "Параметры макросов". Вам нужна галочка "Предоставлять доступ к объектной модели проектов VBA"
Если у вас другой Excel – попробуйте поискать в сети где она находится. По идее все должно быть примерно там же.
У меня есть две запланированные задачи на моем компьютере. Они оба открывают файлы Excel и запускают макрос и очень похожи в том, что они делают. Они оба работают на моем компьютере. Однако я перенес запланированные задания на компьютер коллег. Один работал, другой нет.
Тот, который не работал, открыл Excel, но имел ошибку, говорящую:
"Программный доступ к Visual Basic Project не является доверенным".
Как я уже сказал, оба файла Excel очень похожи. Тот, который не работал, ссылается на два дополнительных проекта, а другой – нет. Они есть,
Я никогда не сталкивался с этой ошибкой раньше.