컴퓨터/Python

xlsm파일 pandas df으로 한 번에 기존파일 수정 저장하기 vba useform 안날아감

풍경소리^^ 2026. 3. 31. 15:08
"""
두 범위를 df로 읽어서 merge(vlookup) 후 지정 위치에 저장
────────────────────────────────────────────────────────────
df1, df2, df_result 각각 skip_rows / 시작열 / 끝열 독립 지정
"""

import pandas as pd

# ── 설정 ─────────────────────────────────────────────────────────
FILE  = '01vlookup.xlsm'
SHEET = 'Sheet1'

# df1 범위 설정
DF1_SKIP_ROWS = 3    # 헤더 위 공백 행 수
DF1_COL_START = 'A'
DF1_COL_END   = 'B'
DF1_COL_NAMES = ['이름', '제품']

# df2 범위 설정
DF2_SKIP_ROWS = 3
DF2_COL_START = 'F'
DF2_COL_END   = 'G'
DF2_COL_NAMES = ['제품', '가격']

# 결과 출력 위치 설정
OUT_SKIP_ROWS = 3    # 헤더 위 공백 행 수 (데이터는 +1행부터 시작)
OUT_COL_START = 'J'

# ── 유틸 ─────────────────────────────────────────────────────────
def col_to_idx(col):
    """열 문자 → 0-based 인덱스  (A=0, B=1, J=9 ...)"""
    return ord(col.upper()) - ord('A')

def read_range(file, sheet, skip_rows, col_start, col_end, col_names):
    """
    지정 열 범위 읽기
      - skip_rows+1 : 헤더행까지 스킵 후 col_names 직접 지정
        → 같은 헤더명이 여러 범위에 있어도 suffix(.1 등) 방지
      - 빈 행(all NaN) 감지 시 그 직전까지만 사용
    """
    s, e = col_to_idx(col_start), col_to_idx(col_end)
    df_raw = pd.read_excel(
        file, sheet_name=sheet,
        skiprows=skip_rows + 1,
        usecols=range(s, e + 1),
        header=None,
        names=col_names,
    )
    empty = df_raw.isnull().all(axis=1)
    cut   = empty.idxmax() if empty.any() else len(df_raw)
    return df_raw.iloc[:cut].copy()

# ── STEP 1: 읽기 ─────────────────────────────────────────────────
df1 = read_range(FILE, SHEET, DF1_SKIP_ROWS, DF1_COL_START, DF1_COL_END, DF1_COL_NAMES)
df2 = read_range(FILE, SHEET, DF2_SKIP_ROWS, DF2_COL_START, DF2_COL_END, DF2_COL_NAMES)

print("df1:\n", df1)
print("\ndf2:\n", df2)

# ── STEP 2: merge (vlookup) ──────────────────────────────────────
df_result = df1.merge(df2, on='제품', how='left')
print("\n결과:\n", df_result)

# ── STEP 3: 저장 ─────────────────────────────────────────────────
#   startrow = OUT_SKIP_ROWS + 1  → 헤더행(OUT_SKIP_ROWS) 다음 데이터행
start_row = OUT_SKIP_ROWS + 1
start_col = col_to_idx(OUT_COL_START)

with pd.ExcelWriter(
    FILE,
    engine='openpyxl',
    mode='a',
    if_sheet_exists='overlay',
    engine_kwargs={'keep_vba': True},
) as writer:
    df_result.to_excel(
        writer,
        sheet_name=SHEET,
        startrow=start_row,
        startcol=start_col,
        index=False,
        header=False,
    )

print("\n✅ 저장 완료")

 

01vlookup.xlsm
0.01MB
vlooup_merge.py
0.00MB