# 한글 매크로(.msr) 사용법

## ★ 2026-09-28 그룹 재정리 + 실행 점검 — 30종 전부 이 PC 한글 2024에서 실제 실행 확인 (상세: `점검결과_요약.md`, 코드표: `매크로_코드표.md`)
| 코드 | 매크로 | 단축키(슬롯) | 커서 위치 | 하는 일 |
|---|---|---|---|---|
| A-서식-01 | 요일입력 | Alt+0(슬롯 9) | 날짜가 있는 줄 아무 곳 | 날짜 뒤에 (요일)이 자동으로 붙습니다 — 2026. 10. 12. 도, 2026-10-12 · 2026/10/12 도 |
| A-서식-02 | 날짜표기통일 | 실행 창(슬롯 22) | 날짜가 있는 줄 아무 곳 | 2026-7-6, 2026/7/10, 2026.7.3 → 2026. 7. 6. 공문 표기로 |
| A-서식-03 | 기간일수계산 | Alt+Shift+9(슬롯 19) | 기간이 적힌 줄 아무 곳 | '3. 2. ~ 3. 6.' 뒤에 (5일간) 을 자동으로 (신규) |
| A-서식-04 | 번호재정렬 | Alt+7(슬롯 6) | 본문: 아무 곳(문서 전체 처리) / 표: 다시 매길 번호 열의 아무 칸 | 본문 전체의 1. 가. 1) 가) ① 계층 번호를 확인해 고치고(빨강), 표에서는 열을 자동 채우기로 |
| A-서식-05 | 금액한글표기 | Alt+Shift+6(슬롯 16) | 금액이 적힌 줄 아무 곳 | 1,234,000원·1,234천원·12백만원 뒤에 (금일백이십삼만사천원) 처럼 한글 금액을 자동으로 |
| A-서식-06 | 글자수카운터 | Alt+Shift+8(슬롯 18) | 셀 부분을 블록 지정(전체를 셀 때는 아무 곳) | 글자 수·바이트 수를 바로 알려 줍니다 |
| A-서식-07 | 표간격정리 | Alt+5(슬롯 4) | 표 안 아무 칸 | 표 열 너비를 내용에 맞게 — 순번·비고·숫자 열은 좁게, 글 열은 넓게, 표 너비는 그대로 |
| A-서식-08 | 표머리두줄HY그래픽 | Alt+4(슬롯 3) | 표 안 아무 칸(맨 왼쪽 위 칸 권장) | 표 양식 한 번에 — 제목 행 HY그래픽 굵게·회색 바탕·아래 이중선, 바깥 테두리 굵게 |
| A-서식-09 | 한셀입력 | Alt+2(슬롯 1) | 한 줄로 맞출 칸 | 긴 글을 한 줄에 — 글자 크기는 그대로, 장평(최소 80%)·자간(최소 -10%)으로 맞추고, 그래도 넘치면 어절 단위 줄바꿈 |
| A-서식-10 | 노란색 | Alt+1(슬롯 0) | 강조할(또는 되돌릴) 글자를 블록 지정 | 블록 잡은 글자에 노란 음영 + 빨간 글자(형광펜 대신) — 한 번 더 누르면 원래대로 |
| B-계산-01 | 계산및합계 | Alt+3(슬롯 2) | 계산할 줄 아무 곳 / 합계까지 내려면 여러 줄을 블록 지정 | 커서 줄만 계산, 여러 줄을 긁으면 각 줄 계산 + 윗줄에 합계 — 곱하기·나누기·더하기·빼기·괄호 |
| C-표계산-01 | 선택셀표계산천원 | Alt+Shift+3(슬롯 13) | 표 안, 계산을 시작할 산출기초 칸 | 산출기초 칸에 커서만 두면 오른쪽 예산 칸이 채워집니다 |
| C-표계산-02 | 전체열표계산천원 | 실행 창(슬롯 24) | 표 안, 시작할 행의 아무 산출기초 칸 | 2027년·2026년처럼 산출기초가 여러 벌이면 한 번에 계산합니다 |
| C-표계산-03 | 증감포함표계산천원 | Alt+Shift+4(슬롯 14) | 표 안, 첫 데이터 행의 산출기초(A) 칸 | 예산(A)·예산(B)·증감·합계 행까지 한 번에 |
| C-표계산-04 | 중간합계증감포함표계산천원 | 실행 창(슬롯 25) | 표 안, 첫 행(가. 제목 행)의 2027년 산출기초(A) 칸 — 비어 있어도 됩니다 | 가./나. 그룹 중간합계와 전체 합계까지 한 번에 |
| C-표계산-05 | 구성비열채우기 | 실행 창(슬롯 26) | 표 안, 값이 있는 열의 아무 칸(오른쪽에 빈 열 필요) | 예산 열 옆에 구성비(%)를 자동으로 (신규) |
| C-표계산-06 | 가로세로평균 | 실행 창(슬롯 27) | 표 안 아무 칸 (세로는 평균을 낼 열의 칸) | 표 평균 한 매크로로 — [아니요] 가로: 행마다 평균을 마지막 열에 / [예] 세로: 커서 열의 평균을 마지막 행에 |
| C-표계산-07 | 등수정리 | 실행 창(슬롯 28) | 표 안, 점수 열의 아무 칸(오른쪽에 빈 열이 있어야 함) | 점수 열 오른쪽에 등수를 채웁니다(동점은 공동 순위) |
| C-표계산-08 | 음수를세모로적용합계 | Alt+6(슬롯 5) | 표 안, 합계를 낼 열의 아무 칸 | 열의 음수를 모두 △로 바꾸고 합계까지 |
| C-표계산-09 | 표위치확인및제거 | Alt+Shift+1(슬롯 11) | 표 안 아무 칸 | 표 칸마다 주소([A1] [B2]…)를 빨간 안내문으로 — 계산식 값은 그대로, 칸을 골라 실행하면 고른 칸만 |
| C-표계산-10 | 표계산식적용및제거 | Alt+Shift+2(슬롯 12) | 표 안 아무 칸 (계산식을 타이핑한 표, 또는 계산식 필드가 든 표) | 타이핑한 =C2/B2 같은 글자를 진짜 표 계산식으로 (적용) — 다시 실행하면 값만 남기고 계산식 제거 |
| D-표정리-01 | 오름내림차순정렬 | Alt+9(슬롯 8) | 표 안, 기준이 될 열의 아무 칸 | 한 번 누르면 오름차순, 한 번 더 누르면 내림차순 (14·15 통합) |
| D-표정리-02 | 중복값빨간색 | Alt+8(슬롯 7) | 표 안, 검사할 열의 아무 칸 | 중복값을 빨간 글자로, 한 번 더 누르면 묶음마다 다른 색으로 |
| D-표정리-03 | 숫자자동콤마삽입 | Alt+Shift+0(슬롯 20) | 표 안 아무 칸 | 1400000 → 1,400,000, 천 단위 콤마를 한 번에 |
| D-표정리-04 | 표빈칸하이픈채우기 | Alt+Shift+-(슬롯 21) | 표 안 아무 칸 | 표의 빈 칸을 한 번에 '-'로 채우고 가운데 정렬 |
| D-표정리-05 | 합계행자동서식 | Alt+Shift+5(슬롯 15) | 표 안 아무 칸 | 표의 합계 행을 굵게 + 위쪽 이중 실선(0.5mm)으로 |
| D-표정리-06 | 엑셀에서표데이터값복사 | Alt+Shift+7(슬롯 17) | 표 밖 본문(새로 붙여넣기) 또는 표 안 아무 칸(기존 표 정리) | 엑셀에서 복사한 표를 붙여넣고 공백까지 정리 |
| D-표정리-07 | 개인정보마스킹 | Alt+-(슬롯 10) | 표 안 아무 칸(표 전체 처리) 또는 본문 줄 | 명단의 이름·휴대전화·주민번호를 한 번에 가립니다 (신규) |
| D-표정리-08 | 전화번호서식통일 | 실행 창(슬롯 29) | 표 안 아무 칸(표 전체 처리) 또는 본문 줄 | 전화번호를 010-1234-5678 로 통일하고, 같은 번호는 빨간색으로 (신규) |
| E-좌석표-01 | 좌석표 | 실행 창(슬롯 23) | 명렬표(학년반·번호·이름 표, 학년반·번호 열은 없어도 됨) 안 아무 칸 | 명렬표(학년반·번호·이름) → 새 쪽에 교실 좌석표. 배치(5열25명/4열20명)와 출입문 좌/우를 예/아니요로 |

- 코드 = `매크로\<코드>_<이름>.msr` 파일명 = 사용설명서·강의자료 페이지 제목. 슬롯·그룹의 기준은 `C:\0914\매크로선택.txt`.
- 단축키는 슬롯 번호(목록 순서)로 정해집니다: 0~10 = Alt+1…9,0,- / 11~21 = Alt+Shift+1…9,0,- / 22~29 = 없음 → Alt+Shift+L(매크로 실행 창)에서 이름 선택 후 Enter. 순서는 `매크로등록기.exe`나 `매크로선택.txt`+`python C:\0914\loop\reslot_all.py` 로 바꿀 수 있습니다.
- 통합 파일: `통합매크로.hmi`(30종). 한글에서 Alt+Shift+L → 폴더 아이콘 → 파일 형식 `hmi` → 선택. 기본 폴더 `%AppData%\Hnc\User\Hwp\`.
- 사용설명서(매크로 1개 = 영상 1개 = 한 장): `한글매크로_사용설명서_영상.pptx`, 강의자료: `한글매크로_강의자료.pptx`.

## ⚠️ 먼저 알아둘 것: 슬롯 0~29 제한
한글 전역 스크립트 매크로는 **슬롯 번호 0~29(30개)까지만** 실행 시 문서를 실제로 바꾸는
동작(글자 삽입, 서식 변경 등)이 됩니다. 슬롯 30 이상은 함수는 실행되지만(안내창은 뜸)
문서는 조용히 안 바뀝니다. 지금 이 PC는 이미 30개가 꽉 차 있어서, 새 매크로를 더 넣으려면
아래 (A)나 (C) 방법으로 기존 것 중 하나를 정리해야 합니다.

## 1. 설치 방법 (셋 중 하나)

### (A) 자동 설치 — 매크로 하나씩 추가할 때
한글을 **완전히 종료**한 뒤, 명령창에서:

```
python C:\0914\src\hmilib.py "C:\0914\src\*.js"
```

한글 전역 매크로 저장소(`%APPDATA%\HNC\User\Hwp\HWPWMko-KR130.HMI`)에 바로 등록됩니다.
기존 매크로는 이름이 같을 때만 교체되고, 나머지는 그대로 둡니다.
실행 전 자동으로 `C:\0914\src\hmi_backup\` 에 백업본을 남깁니다.
**슬롯이 이미 꽉 찼으면 설치가 실패합니다** — 먼저 `python -c "..."` 로 `hmilib.delete('이름')`
을 호출해 안 쓰는 매크로를 지우고 자리를 만드세요.

### (B) 수동 설치
한글 → 도구 → 매크로 → **매크로 정의** → 불러오기 → `C:\0914\*.msr` 선택

### (C) 통합 선택 도구 — 원하는 것만 골라 한 번에 설정할 때 (권장)
1. `C:\0914\매크로선택.txt` 를 열어 원하는 매크로 이름을 적습니다(한 줄에 하나,
   `이름=슬롯번호` 로 몇 번 자리에 넣을지도 정할 수 있음). 고를 수 있는 전체 이름은:
   ```
   python C:\0914\src\combine_macros.py --list
   ```
2. 통합 파일을 만듭니다:
   ```
   python C:\0914\src\combine_macros.py
   ```
   → `C:\0914\통합매크로.HMI` 생성(지금 설치된 것은 건드리지 않음, 안전하게 미리보기만 함).
3. 내용을 확인한 뒤, 실제로 적용하려면(한글 완전히 종료 후):
   ```
   copy "%APPDATA%\HNC\User\Hwp\HWPWMko-KR130.HMI" "C:\0914\src\hmi_backup\"
   copy "C:\0914\통합매크로.HMI" "%APPDATA%\HNC\User\Hwp\HWPWMko-KR130.HMI"
   ```
   ⚠️ 이 방법은 **기존 매크로를 모두 지우고 선택한 것만 남깁니다.** 기존 것도 같이 쓰고
   싶으면 매크로선택.txt 에 그 이름도 함께 적으세요(`--list` 로 이름 확인, 집주소/정리/ㅇ 등
   기존 매크로도 그대로 포함할 수 있습니다).

### (D) GUI 드래그앤드롭 도구 — 마우스로 직접 배치/순서 조정 (가장 쉬움)
`dist\매크로등록기.exe` 를 더블클릭해서 실행하세요(설치 필요 없는 단일 실행파일).
- 실행하면 **지금 실제로 설치된 매크로 30개를 자동으로 불러와** 목록에 보여줍니다.
- 탐색기에서 `.msr` 파일을 목록의 원하는 줄 위로 **마우스로 끌어다 놓으면** 그 자리에 배정됩니다.
- 목록 안의 줄도 마우스로 끌어서(또는 ▲위로/▼아래로 버튼으로) 순서를 바꿀 수 있습니다 —
  순서 = 슬롯 번호이고, 슬롯 0~10은 `Alt+숫자`, 11~21은 `Alt+Shift+숫자`, 22~29는 단축키
  없음으로 화면에 표시됩니다(⚠️ 이 단축키 대응은 한글과컴퓨터가 공식 문서화하지 않은
  **추정치**입니다 — 설치 후 실제 Alt+1 등을 눌러 맞는지 확인해 주세요. 틀렸다면 이
  프로그램에서 순서만 다시 바꿔 재설치하면 됩니다).
- **"미리보기로 저장(.HMI 파일)"**: 실제 설치는 안 하고 파일로만 저장(검토용, 안전).
- **"실제 한글에 설치"**: 누르기 전 확인창이 뜨고, 누르면 자동 백업(`src\hmi_backup\`) 후
  화면에 보이는 목록대로 실제 설치 저장소를 통째로 교체합니다. **한글을 먼저 종료**하고 누르세요.
- 소스: `src\macro_installer_gui.py` (재빌드: `python -m PyInstaller --onefile --windowed
  --name 매크로등록기 --collect-all tkinterdnd2 --distpath dist src\macro_installer_gui.py`)

## 2. 실행 방법
- 도구 → 매크로 → **매크로 실행**(또는 등록한 단축키)
- 매크로마다 **커서(입력 커서) 위치**가 기준입니다. 실행 전 커서를 올바른 줄/셀에 두세요.

## 3. 매크로별 요점 (전체 표는 위 ★ 절과 `매크로_코드표.md`)

각 매크로의 동작·커서 위치·주의사항은 사용설명서 PPTX 한 장씩에 실행 영상과 함께 정리돼 있습니다. 여기서는 2026-09-28 에 바뀐 것만 적습니다.

### A-서식-01 요일입력
- 마침표형 `2026. 10. 12. ~ 2026. 10. 16.` → `(월) ~ (금)` (연도 생략분은 앞 연도 상속)
- **기호형도 인식**: `2026-10-30(금)`, `2026/11/04(수)`, `2026_11_13(금)`, `2026,11,17(화)` — 연도가 있고 앞뒤 기호가 같아야 함
- 이미 `(월)`이 붙어 있으면 건너뜀, `2026. 2. 30.` 같은 없는 날짜는 건드리지 않음

### B-계산-01 계산및합계 (옛 계산및합계 + 계산하기 통합)
- **블록 없이 실행** → 커서가 있는 줄(표 안이면 그 칸) 하나만 계산. `=` 뒤가 비면 채우고, 값이 있으면 검산(틀리면 고쳐 빨간색), `=` 가 없으면 줄 끝에 `=결과`
- **여러 줄 블록 후 실행** → 각 줄 계산 + 합계를 **선택 범위 바로 윗줄**에: 윗줄에 `:` 가 있으면 그 뒤에 `총 1,600천원`(기존 글은 지우지 않음), `:` 가 없으면 위에 줄을 하나 새로 만들어 적음. 표에서는 위 칸이 비어 있으면 거기에, 아니면 위에 행을 추가
- 글머리 기호가 섞이면 첫 줄과 같은 기호의 줄만 합산(이중 계산 방지). 단위는 주변 관례(천원/원) 따름

### D-표정리-01 오름내림차순정렬 (옛 오름차순정렬 + 내림차순정렬 통합)
- 기준 열에 커서 → 실행하면 오름차순, 이미 오름차순이면 내림차순(토글). 숫자면 숫자 비교, 글자가 섞이면 사전순

### C-표계산-08 음수를세모로적용합계
- 열의 `-800` 을 전부 `△800` 으로 바꾸고 마지막 행에 합계(음수면 `△500`)

표 계산 매크로는 모두 **커서가 있는 셀부터 표의 마지막 행까지 자동 반복**하며, 이미 값이 적힌 칸은 맞으면 그대로, **틀리면 올바른 값으로 고쳐 쓴 뒤 적색으로 표시**합니다.

## 4. 개발/검증 구조
```
C:\0914\
 ├─ *.msr            ← 한글용 매크로 파일(배포본)
 ├─ src\             ← 매크로 원본(JScript)과 빌드/설치 도구
 │   ├─ _lib.js          공통 라이브러리
 │   ├─ NN_이름.js       매크로 본체
 │   ├─ build_msr.py     JS → .msr 빌드
 │   ├─ hmilib.py        한글 전역 매크로 저장소(.HMI) 읽기/쓰기/설치
 │   ├─ msrlib.py        .msr 파일 포맷 읽기/쓰기
 │   └─ hmi_backup\      설치 전 자동 백업
 └─ test\            ← 검증
     ├─ stub_run.js      한글 동작 모사 + 실제 JScript 엔진으로 로직 검증(빠름)
     ├─ run_real.py      한글에 실제 등록 후 RunScriptMacro 로 실행 검증(정확)
     └─ cases_NN.json    검증 케이스
```

## 5. 알아둘 점
- 한글의 `Pos`(문단 내 위치)는 **문단 시작이 0이 아닙니다**(첫 문단은 16). 매크로는 항상 기준값을 읽어서 계산합니다.
- 매크로가 잘못 동작하면 되돌리기(Ctrl+Z)로 복구됩니다.

> 2026-09-21: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-21: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-22: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-22: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-22: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-22: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-22: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-23: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-23: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-23: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-23: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-23: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-23: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-23: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-23: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-23: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-24: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-28: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.

> 2026-09-28: msr 파일명·설명서·강의자료가 모두 그룹 코드(A-서식-01 …)를 씁니다. 코드표: `매크로_코드표.md`.
