Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2016, 13:15   #1
Unreal2010
Новичок
Джуниор
 
Аватар для Unreal2010
 
Регистрация: 22.02.2016
Сообщений: 1
По умолчанию Получить имя первого макроса (процедуры) VBA

Нужно выполнить на книге Эксель произвольный макрос VBA из строковой переменной p_sScript. Так как текст модуля VBA может быть произвольным, решено автоматически получить имя первого макроса (первой процедуры sub) средствами самого VBA (процедура ProcOfLine) по примерам: пример №1, пример №2, пример №3

Но почему-то в Delphi процедура ProcOfLine выдает ошибку:



Как решить проблему?

Текст выполнения макроса:
Код:
  procedure RunScript (p_IExcel, p_IWorkbook, p_ISheet: Variant; p_sScript: String);
  const
    vbext_ct_StdModule = $00000001;
    vbext_ct_ClassModule = $00000002;
    vbext_ct_MSForm = $00000003;
    vbext_ct_ActiveXDesigner = $0000000B;
    vbext_ct_Document = $00000064;

    vbext_pk_Proc = $00000000;
    vbext_pk_Let = $00000001;
    vbext_pk_Set = $00000002;
    vbext_pk_Get = $00000003;
  var
    i, l_iCount: Integer;
    l_iAutomationSecurity: Integer;
    l_IModule, l_ICodeModule: Variant;
    l_vProcedureType: Longint;
    l_sProcName: String;
  begin
    l_sProcName := '';
    if Trim(p_sScript) = '' then Exit;
    try
      l_iAutomationSecurity := l_IExcel.AutomationSecurity;
      l_IExcel.AutomationSecurity := 1;
      l_IModule := p_IWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule);
      l_ICodeModule := l_IModule.CodeModule;
      l_ICodeModule.AddFromString(p_sScript);
      l_iCount := l_ICodeModule.CountOfLines;
      for i := 1 to l_iCount do
      begin
        try
          l_sProcName := l_ICodeModule.ProcOfLine(i, l_vProcedureType);
        except
//          Break;
        end;
        if l_sProcName <> '' then Break;
      end;
      if l_sProcName = '' then l_sProcName := g_sDefaultVBAMacrosName;

      l_IExcel.Application.Run(l_IModule.Name + '.' + l_sProcName);
    finally
      l_IExcel.AutomationSecurity := l_iAutomationSecurity;
    end;
  end;
Unreal2010 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить все символы, расположенные до первого двоеточия fr0st1k123 Общие вопросы C/C++ 3 12.12.2015 17:10
Получить все символы, расположенные до первого двоеточия fr0st1k123 Общие вопросы C/C++ 1 01.12.2015 21:45
получить все символы до первого двоеточия включительно с++ mary1010 C++ Builder 4 12.12.2012 09:26
выполнение макроса на всех листах кроме первого moose123 Microsoft Office Excel 3 13.06.2012 23:07
Как средствами VBA получить доменное имя пользователя? Прохожий Microsoft Office Excel 3 04.10.2008 18:28