Posted: Fri Feb 04, 2011 5:18 pm Post subject: Единый макрос на все отчёты
Приветствую!
У нас в "oaer", много шаблонов для отчётов, шаблоны разные но заполняются при помощи одного макроса... соответственно в каждом шаблоне свой модуль, со своим текстом одинакового макроса... если находиться недочёт по макросу, надо перелопачивать все шаблоны...
Вопрос: Подскажите как-то можно использовать один модуль?
может не "oaer"?
p/s/ есть идея, но она не очень, вызывать пустой шаблон, в котором лежит модуль с макросом, потом вызывать шаблоны, которые будут вызывать макрос из первого шаблона
Ну по моему у Parazitа есть код импортирующий текстовый файл в книгу Excel и запускающий от туда макрос - вроде у него уворовано
Code:
create object xlapplication 'excel.application'.
call method of xlapplication 'Workbooks' = xlworkbook.
if sy-subrc ne 0. raise excel_init_error. endif.
call method of xlworkbook 'Open'
exporting #1 = wa_path_xls.
if sy-subrc ne 0. raise excel_init_error. endif.
call method of xlapplication 'Worksheets' = xlsheet
exporting #1 = 1.
if sy-subrc ne 0. raise excel_init_error. endif.
* импорт файла в Excel
call method of xlapplication 'VBE' = xlvbe.
call method of xlvbe 'ActiveVBProject' = xlactivevbproject.
call method of xlactivevbproject 'VBComponents' = xlvbcomponents.
loop at it_module into wa_module.
wa_save_pos = sy-tabix.
call method of xlvbcomponents 'Import' = wa_module-xlimport
exporting #1 = wa_module-wa_path_bas.
modify it_module from wa_module index wa_save_pos.
call method cl_gui_frontend_services=>file_delete
exporting
filename = wa_module-wa_path_bas_s
changing
rc = wa_rc
exceptions
access_denied = 1.
endloop.
" проверка на возможность запуска макросов
" запуск макроса-пустышки 's0', а не сразу 'Dovba',
" потому что, если в макросе есть 'ActiveWorkbook.Close', то sy-subrc <> 0 тоже
call method of xlapplication 'Run' = xlrun
exporting #1 = 's0'.
if sy-subrc ne 0.
call function 'POPUP_TO_INFORM'
exporting
titel = 'Ошибка создания отчета'
txt1 = 'Необходимо сделать следующее:'
txt2 = '1) открыть Excel - Меню - Сервис - Макрос - Безопасность - '
txt3 = 'Надежные издатели - Доверять доступ к Visual Basic Project (поставить галочку)'
txt4 = '2) закрыть Excel и заново сформировать отчет'.
else.
if i_background <> 'X'.
progress curstep totalstep 'Формирование отчета в Excel'.
call method of xlapplication 'Run' = xlrun
exporting #1 = 'Dovba'.
endif.
endif.
if i_background <> 'X'.
loop at it_module into wa_module.
call method of xlvbcomponents 'Remove' = xlremove
exporting #1 = wa_module-xlimport.
free object wa_module-xlimport.
endloop.
endif.
set property of xlapplication 'DisplayAlerts' = 0.
if sy-subrc ne 0. raise excel_open_error. endif.
call method of xlapplication 'Save'.
if sy-subrc ne 0. raise excel_open_error. endif.
set property of xlapplication 'Visible' = 1.
if sy-subrc ne 0. raise excel_open_error. endif.
free object xlapplication. " надо очищать - иначе Excel даже после закрытия висит в процессах
free object xlworkbook.
free object xlsheet.
free object xlvbe.
free object xlactivevbproject.
free object xlvbcomponents.
free object xlremove.
free object xlrun.
Сам не пытался так сделать - сделал по аналогии - в общем доступе лежит файл в нем макрос - его и вставляю в виде модуля. Но не на ABAP это все было. Концепция важна
Можно сделать и по другому, через ABAP динамически формировать код Excel и затем загружать его в нужный файл, можно реализовать это через инклуду и влючать ее в необходимую программу. Вариаций на эту тему много.
Code:
************************************************************************
* Работа с Exel с помощью OLE *
************************************************************************
INCLUDE ole2incl.
DATA: lv_app TYPE ole2_object, " Приложение
lv_vbe TYPE ole2_object, " VBA Editor
lv_activevbproject TYPE ole2_object, " Проект
lv_vbcomponents TYPE ole2_object, " Коллекция компонент
lv_vbcomponent TYPE ole2_object, " Компонент проекта
lv_workbook TYPE ole2_object, " Книга
lv_sheet TYPE ole2_object, " Страница
lv_range TYPE ole2_object. " Диапазон
* создаем OLE объект
CREATE OBJECT lv_app 'Excel.Application'.
IF sy-subrc NE 0.
WRITE: / 'Невозможно создать объект Excel'(i01).
STOP.
ENDIF.
***********************************************************************
* Загрузка файла, созданного по шаблону из SMW0, в рабочую книгу Excel
***********************************************************************
DATA: lv_full_name TYPE rlgrap-filename.
CALL METHOD OF lv_app 'Workbooks' = lv_workbook.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
CALL METHOD OF lv_workbook 'Open'
EXPORTING #1 = lv_full_name.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
***********************************************************************
* Удаление всех стандартных модулей из текущего проекта (типа 1)
* 1 vbext_ct_StdModule Standard module
* 2 vbext_ct_ClassModule Class module
* 3 vbext_ct_MSForm Microsoft Form
* 11 vbext_ct_ActiveXDesigner ActiveX Designer
* 100 vbext_ct_Document Document Module
***********************************************************************
CALL METHOD OF lv_app 'VBE' = lv_vbe.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
CALL METHOD OF lv_vbe 'ActiveVBProject' = lv_activevbproject.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
CALL METHOD OF lv_activevbproject 'VBComponents' = lv_vbcomponents.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
* найдем число компонент в проекте
DATA: lv_count TYPE n, " число элементов в семействе
lv_type TYPE i, " тип компонента в семействе
lv_name(128). " имя компонента
GET PROPERTY OF lv_vbcomponents
'Count' = lv_count.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
* удалим из проекта компоненты типа 1 (Стандартные модули)
DO lv_count TIMES.
CALL METHOD OF lv_vbcomponents 'Item' = lv_vbcomponent
EXPORTING #1 = sy-index.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
GET PROPERTY OF lv_vbcomponent
'Type' = lv_type.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
IF lv_type = '1'.
GET PROPERTY OF lv_vbcomponent
'Name' = lv_name.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
CALL METHOD OF lv_vbcomponents 'Remove'
EXPORTING #1 = lv_vbcomponent.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
ENDIF.
FREE OBJECT: lv_vbcomponent.
ENDDO.
***********************************************************************
* Динамическое создание программы для макроса,
* выгрузка ее в текстовый файл с расширением '.BAS' и
* загрузка в рабочую книгу текущего проекта
* !!! В проекте в стандартных модулях не должно быть процедуры
* с таким же именем
***********************************************************************
DATA: lv_string TYPE string,
lt_module LIKE TABLE OF lv_string.
* Выгрузка в файл - фокус на страницу "Описание задачи"
lv_string = 'Sub SetHeighFoobod(sMsgText As String)'.
APPEND lv_string TO lt_module.
lv_string = 'Worksheets("Описание задачи").Activate'.
APPEND lv_string TO lt_module.
lv_string = 'End Sub'.
APPEND lv_string TO lt_module.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
filename = lv_full_name_bas
* FILETYPE = 'ASC'
* IMPORTING
* FILELENGTH =
TABLES
data_tab = lt_module
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
OTHERS = 5
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* импорт файла в текущий проект
CALL METHOD OF lv_vbcomponents 'Import'
EXPORTING #1 = lv_full_name_bas.
IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.