Search
🤔

10. ABAP EXCEL 프로그램 디버깅2

ABAP EXCEL 프로그램2

ABAP에서 Excel 파일 다운로드 및 처리에 관한 상세 정리

1. Excel 다운로드를 위한 주요 개념

OLE(Object Linking and Embedding): ABAP에서 Excel 매크로의 기능을 활용하기 위해 사용. 이를 통해 Excel 애플리케이션과 상호작용 가능.
객체 생성: CREATE OBJECT를 사용해 Excel 객체를 생성하고, Excel 애플리케이션의 기능을 인수인계받아 사용할 수 있음.
Excel 애플리케이션, Workbook, Worksheet: Excel 내부 구조에 따라 작업을 분리하여 처리.

2. 주요 로직 및 설명

a. 경로 설정 (Directory 선택)

FORM set_directory USING p_fname. CLEAR gv_file. CREATE OBJECT objfile. objfile->get_temp_directory( CHANGING temp_dir = gv_initial_dir EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 ). objfile->directory_browse( EXPORTING initial_folder = gv_initial_dir CHANGING selected_folder = gv_directory EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 ). IF sy-subrc = 0. gv_file = gv_directory && '\' && p_fname && '.xlsx'. ELSE. MESSAGE '파일경로에러' TYPE 'E'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM.
ABAP
복사
1.
get_temp_directory: 사용자 시스템에서 기본 임시 폴더 경로를 가져옴.
2.
directory_browse: 사용자가 다운로드할 폴더를 선택할 수 있도록 경로 탐색창 제공.
3.
gv_file: 최종적으로 생성될 Excel 파일의 전체 경로와 이름을 지정.

b. Excel 다운로드 (OLE 객체 사용)

FORM download_excel_smpl. CREATE OBJECT go_application 'Excel.Application'. SET PROPERTY OF go_application 'Visible' = 1. CALL METHOD OF go_application 'Workbooks' = go_wbook. CALL METHOD OF go_wbook 'Add'. CALL METHOD OF go_application 'Worksheets' = go_sheet EXPORTING #1 = 1. CALL METHOD OF go_sheet 'Activate'. SET PROPERTY OF go_sheet 'Name' = 'ZSCARR'. GET PROPERTY OF go_application 'ActiveWorkbook' = go_wbook. * 데이터 입력 PERFORM fill_cell USING go_application 1 1 'MANDT'. PERFORM fill_cell USING go_application 1 2 'CARRID'. PERFORM fill_cell USING go_application 1 3 'CARRNAME'. * 파일 저장 CALL METHOD OF go_wbook 'SaveAs' EXPORTING #1 = gv_file. IF sy-subrc = 0. MESSAGE '엑셀정상다운' TYPE 'S'. ELSE. MESSAGE '엑셀다운에러' TYPE 'S'. ENDIF. ENDFORM.
ABAP
복사
1.
CREATE OBJECT go_application: Excel 애플리케이션 객체 생성.
2.
WorkbooksWorksheets: Excel 파일(Workbook)과 시트(Worksheet)를 생성하고 관리.
3.
fill_cell: Excel 셀에 데이터를 입력하기 위한 PERFORM 구문 사용.
4.
SaveAs: Excel 파일을 지정된 경로에 저장.

c. 셀 데이터 입력 (PERFORM 구문 활용)

FORM fill_cell USING pv_application pv_row pv_col pv_value. DATA: lv_ecell TYPE ole2_object. CALL METHOD OF pv_application 'Cells' = lv_ecell EXPORTING #1 = pv_row #2 = pv_col. SET PROPERTY OF lv_ecell 'Value' = pv_value. ENDFORM.
ABAP
복사
1.
셀 데이터 설정: 특정 행(pv_row), 열(pv_col), 값(pv_value)을 지정하여 Excel 셀에 데이터 입력.
2.
Cells: Excel의 셀 참조 객체를 생성하고, 값을 설정.

d. 셀 스타일 및 정렬 설정

CALL METHOD OF go_application 'Columns' = lo_columns. CALL METHOD OF lo_columns 'AutoFit'. " 열 자동 정렬
ABAP
복사
열 너비 조정: AutoFit 메소드를 통해 데이터에 맞춰 열 크기를 자동 조정.
정렬 및 병합: 범위를 지정하고 가운데 정렬 및 병합 설정 가능.
CALL METHOD OF RANGE 'Merge'. " 범위 병합 SET PROPERTY OF RANGE 'HorizontalAlignment' = c_center. " 가운데 정렬
ABAP
복사

e. 셀 색상 설정

DATA: lo_interior TYPE ole2_object. CALL METHOD OF lv_ecell 'Interior' = lo_interior. SET PROPERTY OF lo_interior 'Color' = 65535. " 노란색
ABAP
복사
1.
Interior: 셀 배경색 설정을 위한 속성.
2.
Color: 색상 코드로 배경색 지정(예: 65535 = 노란색).

f. 테두리 설정

CALL METHOD OF RANGE 'Borders' = borders EXPORTING #1 = 7. SET PROPERTY OF borders 'LineStyle' = 1. " 테두리 스타일
ABAP
복사
테두리 설정: Borders 속성을 통해 셀의 테두리 스타일 및 종류 지정.

3. 최종 구성 예시

엑셀 매크로를 통해 특정 데이터를 Excel 파일로 다운로드하고, 셀 스타일 및 정렬, 색상, 테두리 등을 설정할 수 있는 코드 조합입니다.

4. 주요 상수

상수명
설명
c_center
가운데 정렬
-4108
c_left
왼쪽 정렬
-4131
c_right
오른쪽 정렬
-4152
색상 코드
노란색
65535
테두리 코드
기본 스타일
1

5. 참고

OLE2_OBJECT: Excel 매크로의 기능을 부여하기 위해 사용.
Excel 색상 코드: 색상 코드는 10진수 값으로 지정되며, 특정 코드에 따라 색상이 달라짐.
정렬 및 병합: 범위와 속성을 사용하여 데이터 표현을 깔끔하게 구성 가능.
이와 같은 방식으로 ABAP 코드에서 Excel 파일을 손쉽게 다운로드하고 스타일링할 수 있습니다.
ACT_FUNTION_KEY 더블클릭
EXCEL_DOWN_SMPL 더블클릭
디버깅 걸고
FORM excel_down_smpl . * 다운로드 양식 선택 LS_KEY-OBJID = 'ZTEST14_EXCEL01'. " 다운로드 받을 엑셀 파일의 이름 설정 (40자 제한) LS_KEY-RELID = 'MI'. " RELID는 구분 용도로 사용 (필수는 아니며 시스템마다 다를 수 있음. 없어도됨) * 파일 경로 조회 PERFORM SET_DIRECTORY USING LS_KEY-OBJID. " 사용자로부터 파일을 저장할 경로를 선택 받음 * 엑셀 다운 PERFORM DOWNLOAD_EXCEL_SMPL USING LS_KEY-OBJID. " 엑셀 파일 생성 및 다운로드를 수행(매크로 실행해서 다운) IF SY-SUBRC = 0. " SY-SUBRC가 0일 경우는 엑셀 다운로드 성공 MESSAGE '엑셀정상다운' TYPE 'S'. " 성공 메시지를 출력 ELSE. " SY-SUBRC가 0이 아닐 경우는 엑셀 다운로드 실패 MESSAGE '엑셀다운에러' TYPE 'S'. " 에러 메시지를 출력 ENDIF. ENDFORM.
ABAP
복사

PERFORM USING 변수

FORM구문에 이 변수를 다시 받아서 사용하겠다
로컬변수로 선언한걸 가져다가 FORM 구문안에서도 쓰고 싶다
여러개의 변수를 직접 받아다가 재사용하고 싶다 (반복적으로)
LS_KEY 들어가서 보고 싱글스탭 한번해주고 OBJID가 들어온다
LS_KEY-OBJID가 새로운 변수(p_ls_key_objid - 로컬변수)로 해서 받아온다
FORM set_directory USING p_ls_key_objid. " ls_key-objid 값을 로컬 변수로 받아오는 서브루틴이다. CLEAR GV_FILE. " 파일 경로를 저장할 전역 변수 GV_FILE을 초기화한다. CREATE OBJECT OBJFILE. " CL_GUI_FRONTEND_SERVICES 클래스의 객체 OBJFILE을 생성한다. " 처음 생성된 OBJFILE은 아무것도 모르는 신입사원과 같다. 즉, 빈 깡통 상태이다. " CL_GUI_FRONTEND_SERVICES는 직장 상사로, 다양한 GUI 관련 작업을 수행할 수 있는 능력을 가지고 있다. " 직장 상사가 본인의 일을 신입사원인 OBJFILE에게 인수인계한다. " OBJFILE은 이제 직장 상사의 모든 기능을 대신 수행할 수 있는 상태가 된다. IF GV_FILE IS NOT INITIAL. " 만약 GV_FILE에 값이 이미 있다면, GV_INITIAL_DIR = GV_FILE. " 초기 디렉토리 경로를 GV_FILE의 값으로 설정한다. ELSE. " GV_FILE이 비어 있다면 (처음 실행 시), OBJFILE->GET_TEMP_DIRECTORY( CHANGING TEMP_DIR = GV_INITIAL_DIR EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 ). " OBJFILE(신입사원)에게 임시 디렉토리를 가져오도록 요청한다. " 이 과정에서 발생할 수 있는 예외 사항들을 처리해야 한다. ENDIF. OBJFILE->DIRECTORY_BROWSE( EXPORTING INITIAL_FOLDER = GV_INITIAL_DIR CHANGING SELECTED_FOLDER = GV_DIRECTORY EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 ). " OBJFILE(신입사원)에게 사용자가 디렉토리를 선택할 수 있도록 다이얼로그 창을 열게 한다. " 사용자가 선택한 디렉토리는 GV_DIRECTORY 변수에 저장된다. IF SY-SUBRC = 0. " SY-SUBRC가 0이라면 (성공적으로 디렉토리가 선택되었다면), GV_FILE = GV_DIRECTORY && '\' && LS_KEY-OBJID && '.xlsx'. " 최종 파일 경로를 생성하고 GV_FILE 변수에 저장한다. ELSE. " 디렉토리 선택에 실패한 경우, MESSAGE '파일경로에러' TYPE 'E'. " 오류 메시지를 출력한다. LEAVE LIST-PROCESSING. " 리스트 프로세싱을 종료한다. ENDIF. ENDFORM.
ABAP
복사

왜 굳이 이런 방식을 사용하는가?

1.
TOP 영역에서 사용하는 클래스를 명시적으로 볼 수 있다.
프로그램의 TOP 영역에서 DATA: objfile TYPE REF TO cl_gui_frontend_services.
선언을 통해 어떤 클래스(CL_GUI_FRONTEND_SERVICES)를 사용하는지 명확히 보여준다.
이는 코드를 처음 접하는 개발자가 "어떤 클래스가 사용되고 있는지"를 한눈에 파악할 수 있게 해준다.
2.
클래스를 직접 호출하지 않는 이유
클래스(CL_GUI_FRONTEND_SERVICES)를 직접 호출하면 코드가 길어지고 읽기 어려워진다.
매번 CL_GUI_FRONTEND_SERVICES=>METHOD_NAME 형태로 사용하는 대신, 객체를 생성하고 objfile->method_name처럼 간단히 호출 가능하다.
예:
CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE( ... ).
ABAP
복사
objfile->directory_browse( ... ).
ABAP
복사
3.
클래스와 객체의 차이
클래스(CL_GUI_FRONTEND_SERVICES)
설계도 역할을 하며, 다양한 기능(메서드)을 정의한다. "직장 상사"로 비유 가능.
객체(OBJFILE)
클래스로부터 생성된 "실체"로, 직장 상사의 일을 대신 수행하는 "신입사원" 같은 존재다.

결론적으로 왜 객체를 생성하고 사용하는가?

TOP 영역에서 클래스 사용이 명시적으로 드러난다.
코드 간결성: 클래스명 전체를 매번 적는 대신, 단어 하나(OBJFILE)로 간단히 작업할 수 있다.
유지보수성: 객체만 변경하면 해당 객체를 사용하는 모든 코드에 적용되므로 유지보수가 용이하다.
역할 분리: 클래스는 설계, 객체는 실행이라는 역할을 분리하여 코드의 가독성과 확장성을 높인다.
이때 아무것도 없는 깡통이였는데 싱글스탭으로 쭉 넘기면
이렇게 들어온다.
FORM excel_down_smpl . * 다운로드 양식 선택 * LS_KEY-OBJID = 'ZTEST14_EXCEL01'. * LS_KEY-RELID = 'MI'. DATA FNAME(40) TYPE C. * 파일 경로 조회 * PERFORM SET_DIRECTORY USING LS_KEY-OBJID. PERFORM SET_DIRECTORY USING FNAME. * 엑셀 다운 * PERFORM DOWNLOAD_EXCEL_SMPL USING LS_KEY-OBJID. PERFORM DOWNLOAD_EXCEL_SMPL USING FNAME. IF SY-SUBRC = 0. MESSAGE '엑셀정상다운' TYPE 'S'. ELSE. MESSAGE '엑셀다운에러' TYPE 'S'. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form SET_DIRECTORY *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> LS_KEY_OBJID *&---------------------------------------------------------------------* *FORM set_directory USING p_ls_key_objid. FORM set_directory USING p_fname. CLEAR GV_FILE. CREATE OBJECT OBJFILE. IF GV_FILE IS NOT INITIAL. GV_INITIAL_DIR = GV_FILE. ELSE. OBJFILE->GET_TEMP_DIRECTORY( CHANGING TEMP_DIR = GV_INITIAL_DIR EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 ). ENDIF. OBJFILE->DIRECTORY_BROWSE( EXPORTING INITIAL_FOLDER = GV_INITIAL_DIR CHANGING SELECTED_FOLDER = GV_DIRECTORY EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 ). IF SY-SUBRC = 0. * GV_FILE = GV_DIRECTORY && '\' && LS_KEY-OBJID && '.xlsx'. GV_FILE = GV_DIRECTORY && '\' && p_fname && '.xlsx'. ELSE. MESSAGE '파일경로에러' TYPE 'E'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM.
ABAP
복사
기존의 LS_KEY-OBJID 이 부분을 FNAME로 변경해서 디버깅을 찍으면
fname은 인식이 안되는데 fP_fname은 인식되고 있다
gv_initial_dir = 'D:\'.
ABAP
복사
미리 파일경로를 잡고 돌리면은 창이 켜질때 기본으로 잡혀서 켜진다.
FORM excel_down_smpl . * 다운로드 양식 선택 * LS_KEY-OBJID = 'ZTEST14_EXCEL01'. * LS_KEY-RELID = 'MI'. DATA FNAME(40) TYPE C. FNAME = 'TABLE_SAMPLE'. * 파일 경로 조회 * PERFORM SET_DIRECTORY USING LS_KEY-OBJID. PERFORM SET_DIRECTORY USING FNAME. * 엑셀 다운 * PERFORM DOWNLOAD_EXCEL_SMPL USING LS_KEY-OBJID. PERFORM DOWNLOAD_EXCEL_SMPL. IF SY-SUBRC = 0. MESSAGE '엑셀정상다운' TYPE 'S'. ELSE. MESSAGE '엑셀다운에러' TYPE 'S'. ENDIF. ENDFORM.
ABAP
복사
엑셀 다운 쪽에서 원래
PERFORM DOWNLOAD_EXCEL_SMPL USING FNAME.
ABAP
복사
이였는데 USING을 굳이 쓸 필요없어서 지워줬다.
지우면서 이제 하단의 FORM 쪽의 USING을 지워주면 된다.
FORM download_excel_smpl . " 엑셀 파일을 생성하고 데이터를 채운 뒤 저장하는 서브루틴이다. "* OLE OBJECT 생성 및 Excel 애플리케이션 실행 CREATE OBJECT GO_APPLICATION 'Excel.Application'. " Excel.Application OLE 객체를 생성한다. " 생성된 객체는 Excel 프로그램을 제어할 수 있는 권한을 갖는다. "* Excel 창 표시 여부 설정 SET PROPERTY OF GO_APPLICATION 'Visible' = 1. " Excel 애플리케이션의 Visible 속성을 1로 설정하여 Excel 창을 화면에 표시한다. " (0으로 설정하면 화면에 표시되지 않고 백그라운드에서 동작한다.) "* Workbooks 객체 가져오기 및 Workbook 추가 CALL METHOD OF GO_APPLICATION 'Workbooks' = GO_WBOOK. " 현재 Excel 애플리케이션의 Workbooks 컬렉션을 가져온다. CALL METHOD OF GO_WBOOK 'Add'. " 새 Workbook(엑셀 파일)을 추가한다. "* Worksheets 객체 가져오기 및 첫 번째 Sheet 활성화 CALL METHOD OF GO_APPLICATION 'Worksheets' = GO_SHEET EXPORTING #1 = 1. " 첫 번째 Worksheet를 선택하여 활성화한다. CALL METHOD OF GO_SHEET 'Activate'. " 선택된 Worksheet를 활성화 상태로 만든다. SET PROPERTY OF GO_SHEET 'Name' = 'ZSCARR'. " 활성화된 Worksheet의 이름을 'ZSCARR'로 변경한다. GET PROPERTY OF GO_APPLICATION 'ActiveWorkbook' = GO_WBOOK. " 현재 활성화된 Workbook 객체를 가져온다. "* 데이터 입력 PERFORM FILL_CELL USING GO_APPLICATION 01: 01 'MANDT', 02 'CARRID', 03 'CARRNAME', 04 'CURRCODE', 05 'URL'. " FILL_CELL 서브루틴을 호출하여 데이터를 엑셀에 입력한다. " GO_APPLICATION 객체를 통해 각 셀에 데이터를 채운다. "* 파일 경로 설정 " CONCATENATE GV_DIRECTORY '\' P_LS_KEY_OBJID '.xlsx' INTO GV_PATH. " GV_DIRECTORY와 P_LS_KEY_OBJID를 이용해 최종 저장 경로 GV_PATH를 생성한다. " 예: C:\Users\Example\example.xlsx "* 파일 저장 CALL METHOD OF GO_WBOOK 'SaveAs' EXPORTING #1 = GV_PATH. " Workbook을 지정된 경로에 '.xlsx' 형식으로 저장한다. " EXPORTING =>> 위치 지정한다. " #1 = pv_row. 몇번째 행 " #2 = pv_col. 몇번째 열 IF SY-SUBRC = 0. " 파일 저장에 성공한 경우, MESSAGE '엑셀정상다운' TYPE 'S'. " 성공 메시지를 출력한다. ELSE. " 파일 저장에 실패한 경우, MESSAGE '엑셀다운에러' TYPE 'S'. " 실패 메시지를 출력한다. ENDIF. ENDFORM. FORM FILL_CELL USING PV_APPLICATION PV_ROW PV_COL PV_VALUE. " Excel의 특정 셀에 값을 입력하는 서브루틴이다. " PARAMETERS: " PV_APPLICATION - Excel 애플리케이션 객체. " PV_ROW - 값을 입력할 셀의 행 번호. " PV_COL - 값을 입력할 셀의 열 번호. " PV_VALUE - 해당 셀에 입력할 값. DATA: LV_ECELL TYPE OLE2_OBJECT. " OLE2_OBJECT 타입의 LV_ECELL 변수는 특정 Excel 셀 객체를 참조한다. "* 특정 셀 객체 가져오기 CALL METHOD OF PV_APPLICATION 'Cells' = LV_ECELL EXPORTING #1 = PV_ROW #2 = PV_COL. " Excel 애플리케이션에서 지정된 행(PV_ROW)과 열(PV_COL)에 해당하는 셀 객체를 가져온다. " 가져온 셀 객체는 LV_ECELL 변수에 저장된다. "* 셀에 값 설정 SET PROPERTY OF LV_ECELL 'Value' = PV_VALUE. " LV_ECELL 객체의 Value 속성을 사용하여 지정된 값을 셀에 입력한다. ENDFORM.
ABAP
복사
아무것도 없다가 싱글스탭 이후에 CREATE OBJECT 하는 순간 값들이 들어오는걸 볼 수 있다
TOP쪽의 OLE2_OBJECT를 더블클릭해서 보면
상수를 넣어서 셋팅한걸 볼 수 있다.
이런식으로매크로 돌면서 행에 맞춰서 값이 들어가는걸 볼 수 있음.
SET PROPERTY OF GO_APPLICATION 'SheetsInNewWorkbook' = 2.
ABAP
복사
이 문장 하나를 추가해준다
SheetsInNewWorkbook 속성
이 속성은 새로 생성되는 Workbook(엑셀 파일)에 기본적으로 포함될 Sheet(워크시트)의 개수를 설정하는 데 사용된다.
기본적으로 Excel에서 새로 생성하는 Workbook에는 3개의 Sheet가 포함. 그래서 2개의 Sheet로 변경할 수 있다.
* 데이터 입력 PERFORM FILL_CELL USING GO_APPLICATION 01: 01 'MANDT', 02 'CARRID', 03 'CARRNAME', 04 'CURRCODE', 05 'URL'.
ABAP
복사
밑에 하단의 소스를 넣어준다
* 주요 기능: 엑셀의 열 너비 설정, 셀 범위와 테두리 스타일 지정, 수평 정렬, 새로운 워크시트 생성 및 이름 설정. *DATA: lo_columns TYPE ole2_object. *CALL METHOD OF go_application 'Columns' = lo_columns. *CALL METHOD OF lo_columns 'Autofit'. " 위 코드는 주석 처리되었지만, 엑셀 열의 자동 너비 조정을 위해 사용 가능하다. * 각 열의 너비를 수동으로 설정 PERFORM column_width USING 1 15. PERFORM column_width USING 2 15. PERFORM column_width USING 3 15. PERFORM column_width USING 4 15. PERFORM column_width USING 5 15. " 열(column)의 너비를 15로 설정한다. " PERFORM column_width는 각 열의 너비를 설정하는 서브루틴을 호출한다. * 셀 범위 설정과 관련된 OLE 객체 선언 DATA : BORDERS TYPE OLE2_OBJECT. DATA : RANGE TYPE OLE2_OBJECT. DATA : CELL1 TYPE OLE2_OBJECT. DATA : CELL2 TYPE OLE2_OBJECT. * 특정 셀의 위치를 지정 (CELL1은 첫 번째 셀) CALL METHOD OF GO_APPLICATION 'CELLS' = CELL1 EXPORTING #1 = 1 " 행 번호 (Row): 1 #2 = 1. " 열 번호 (Column): 1 " CELL1은 (1, 1) 위치의 셀을 참조한다. * 또 다른 셀의 위치를 지정 (CELL2는 두 번째 셀) CALL METHOD OF GO_APPLICATION 'Cells' = CELL2 EXPORTING #1 = 2 " 행 번호 (Row): 2 #2 = 5. " 열 번호 (Column): 5 " CELL2는 (2, 5) 위치의 셀을 참조한다. * CELL1과 CELL2를 기준으로 범위(RANGE) 객체 생성 CALL METHOD OF GO_APPLICATION 'Range' = RANGE EXPORTING #1 = CELL1 #2 = CELL2. " RANGE는 CELL1(1,1)부터 CELL2(2,5)까지의 범위를 포함하는 객체이다. * 테두리 스타일 설정 (RANGE에 테두리를 추가) CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 7. SET PROPERTY OF borders 'Linestyle' = 1. " 테두리(LineStyle)를 스타일 1(실선)로 설정. #1 = 7은 테두리 종류를 나타낸다. * 위와 동일한 작업을 다른 테두리(위, 아래, 좌, 우 등)에 반복 적용 CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 8. SET PROPERTY OF borders 'Linestyle' = 1. CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 9. SET PROPERTY OF borders 'Linestyle' = 1. CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 10. SET PROPERTY OF borders 'Linestyle' = 1. CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 11. SET PROPERTY OF borders 'Linestyle' = 1. CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 12. SET PROPERTY OF borders 'Linestyle' = 1. " #1 값은 각 방향별 테두리를 의미. 예: 7(전체), 8(위쪽), 9(아래쪽), 10(왼쪽), 11(오른쪽), 12(대각선). * 수평 정렬 설정 CONSTANTS: c_center TYPE i VALUE -4108, " 중앙 정렬 c_left TYPE i VALUE -4131, " 왼쪽 정렬 c_right TYPE i VALUE -4152. " 오른쪽 정렬 CALL METHOD OF RANGE 'select'. " RANGE 객체를 선택. SET PROPERTY OF RANGE 'HorizontalAlignment' = c_center. " 수평 정렬을 중앙으로 설정(-4108 값). * 새로운 워크시트 생성 및 활성화 CALL METHOD OF GO_APPLICATION 'Worksheets' = GO_SHEET EXPORTING #1 = 2. " 두 번째 워크시트를 선택. CALL METHOD OF GO_SHEET 'Activate'. " 선택한 워크시트를 활성화. SET PROPERTY OF GO_SHEET 'Name' = 'ZSCARR2'. " 활성화된 워크시트의 이름을 'ZSCARR2'로 설정. GET PROPERTY OF GO_APPLICATION 'ActiveWorkbook' = GO_WBOOK. " 현재 활성화된 Workbook 객체를 가져온다.
ABAP
복사
PERFORM 구문이 없어서 더블클릭해서 생성해주자
*&---------------------------------------------------------------------* *& Form COLUMN_WIDTH *&---------------------------------------------------------------------* *& Excel의 특정 열(Column)의 너비를 설정하는 서브루틴이다. *&---------------------------------------------------------------------* *& PARAMETERS: *& P_COLUMN - 열 번호 (조정하려는 열의 번호). *& P_WIDTH - 열 너비 (설정하려는 열의 폭). *&---------------------------------------------------------------------* FORM column_width USING p_column TYPE i p_width TYPE i. DATA: lo_selection TYPE ole2_object, " 현재 선택된 Excel 영역을 참조하는 OLE 객체 lo_column TYPE ole2_object. " 특정 열(Column)을 참조하는 OLE 객체 * 특정 열 선택 CALL METHOD OF GO_SHEET 'Columns' = lo_column EXPORTING #1 = p_column. " GO_SHEET 객체에서 P_COLUMN(열 번호)에 해당하는 열을 참조하여 lo_column에 저장한다. * 열 선택 CALL METHOD OF lo_column 'select'. " lo_column 객체를 선택 상태로 만든다. 선택된 열은 이후 동작(예: 너비 조정)에 영향을 받는다. * 현재 선택된 열에 대한 참조 가져오기 CALL METHOD OF go_application 'selection' = lo_selection. " Excel 애플리케이션에서 현재 선택된 영역(Selection)을 가져와 lo_selection에 저장한다. * 열 너비 설정 SET PROPERTY OF lo_column 'ColumnWidth' = p_width. " lo_column 객체의 'ColumnWidth' 속성을 P_WIDTH 값으로 설정한다. " 설정된 값은 해당 열(P_COLUMN)의 너비로 적용된다. ENDFORM. "Column_width
ABAP
복사
하단에 구문 생기면 소스 넣어주기
FILL_CELL 구문에 해당 소스3줄 추가로 넣어준다.
DATA: lo_interior TYPE ole2_object. CALL METHOD OF LV_ECELL 'Interior' = lo_interior. SET PROPERTY OF lo_interior 'Color' = 65535.
ABAP
복사
DATA: lo_interior TYPE ole2_object. " Excel 셀의 Interior(셀 내부 속성)를 참조하기 위한 OLE 객체 변수 선언. CALL METHOD OF LV_ECELL 'Interior' = lo_interior. " LV_ECELL 객체(특정 Excel 셀)를 통해 해당 셀의 Interior 속성을 가져온다. " Interior는 Excel 셀 내부(배경)의 속성을 제어하기 위해 사용된다. " 가져온 Interior 객체는 lo_interior 변수에 저장된다. SET PROPERTY OF lo_interior 'Color' = 65535. " Interior 객체의 'Color' 속성을 설정하여 셀의 배경 색상을 변경한다. " 65535는 Excel의 색상 코드로, **노란색**(Yellow)을 나타낸다.
ABAP
복사
이런식으로 엑셀 파일이 다운된다
해당 빨간 부분의 주석 풀어주고 파랑부분 주석처리
DATA: lo_columns TYPE ole2_object. " Excel의 모든 열(Columns)을 참조하는 OLE 객체 lo_columns를 선언. " lo_columns는 워크시트 내 열의 속성 및 메서드에 접근할 수 있는 객체이다. CALL METHOD OF go_application 'Columns' = lo_columns. " Excel 애플리케이션(go_application) 객체에서 열(Columns) 전체를 참조하는 객체를 가져온다. " 반환된 열 객체는 lo_columns 변수에 저장된다. " 이 작업은 Excel의 전체 열에 대해 동작을 적용하기 위해 수행된다. CALL METHOD OF lo_columns 'Autofit'. " lo_columns 객체의 'Autofit' 메서드를 호출하여 열 너비를 자동으로 조정한다. " Autofit은 각 열에 들어있는 데이터의 길이에 맞게 열 너비를 최적화한다. " 이 동작은 Excel의 수동 작업인 "셀 크기에 맞게 열 너비 자동 조정"과 동일한 효과를 가진다.
ABAP
복사
그리고 밑에도 한줄을 주석을 풀어준다
CALL METHOD OF RANGE 'Merge'. " Excel의 RANGE 객체에서 'Merge' 메서드를 호출하여 지정된 셀 범위를 병합한다. " 병합된 셀은 하나의 큰 셀로 합쳐지며, 해당 범위 내 데이터는 중앙에 표시된다. " 병합 동작은 Excel에서 '병합 및 가운데 맞춤(Merge & Center)' 기능과 유사하다.
ABAP
복사
이제 해당부분 다시 주석처리 원복시켜준다
엑셀에서 옵션에
개발도구를 체크해주고
확인누르고 진행하면 기록이 된다.
그러고 순수 똑같이 양식을 직접 만들어본다
Sub 매크로1() ' ' 매크로1 매크로 ' ' Range("A1").Select ActiveCell.FormulaR1C1 = "MANDT" Range("B1").Select ActiveCell.FormulaR1C1 = "CARRID" Range("C1").Select ActiveCell.FormulaR1C1 = "CARRNAME" Range("D1").Select ActiveCell.FormulaR1C1 = "CURRCODE" Range("E1").Select ActiveCell.FormulaR1C1 = "URL" Columns("A:E").Select Selection.ColumnWidth = 15 Range("A1:E2").Select Range("E1").Activate Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Range("A1:E1").Select Range("E1").Activate With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 65535 .TintAndShade = 0 .PatternTintAndShade = 0 End With Range("C4").Select End Sub
ABAP
복사
보면 아밥소스에서 해준 설정들하고 겹친다.
결국 엑셀에서 매크로 돌려서 편집으로 소스보고 그거에 맞게 아밥에서 엑셀 설정을 잡아주면 된다.