"""
vlookup_to_clipboard.py
=======================
Python 역할: 데이터 읽기 → merge → 클립보드 복사
VBA 역할 : 클립보드 → 지정 셀에 붙여넣기 (서식/VBA/필터 완전 보존)
지원 형식: xls / xlsx / xlsm
"""
import time
import pandas as pd
from pathlib import Path
from openpyxl.utils import column_index_from_string
start = time.time()
# =============================================================================
# 공통 읽기 함수
# =============================================================================
def process_dataframe(file, sheet_name, col_start, col_end,
skip_rows, col_title_list=None):
"""xls / xlsx / xlsm 공통 DataFrame 읽기 + 첫 공백행 전까지 자동 절단"""
ext = Path(file).suffix.lower()
engine = 'xlrd' if ext == '.xls' else 'openpyxl'
df = pd.read_excel(file,
sheet_name=sheet_name,
header=skip_rows,
usecols=f"{col_start}:{col_end}",
names=col_title_list,
engine=engine)
first_blank_index = df[df.isnull().all(axis=1)].index.min()
if pd.notna(first_blank_index):
df = df.iloc[:first_blank_index]
return df
# =============================================================================
# 메인
# =============================================================================
def main():
file_ext = Path(FILE).suffix.lower().lstrip('.')
print(f"\n{'='*52}")
print(f" 파일 : {FILE}")
print(f" 확장자 : .{file_ext}")
print(f"{'='*52}")
# ── df1: A:B 읽기 (이름, 제품) ───────────────────────────────────────
df1 = process_dataframe(FILE, SHEET_NAME,
COL_START_DF1, COL_END_DF1, SKIP_ROWS)
print(f"\n[df1] shape={df1.shape}\n{df1.to_string()}")
# ── df2: F:G 읽기 (제품, 가격) ───────────────────────────────────────
df2 = process_dataframe(FILE, SHEET_NAME,
COL_START_DF2, COL_END_DF2, SKIP_ROWS,
COL_TITLE_LIST_DF2)
print(f"\n[df2] shape={df2.shape}\n{df2.to_string()}")
# ── merge ─────────────────────────────────────────────────────────────
df_result = df1.merge(df2, on=MERGE_KEY, how='left')
df_result.columns = RESULT_COLUMNS
print(f"\n[결과] shape={df_result.shape}\n{df_result.to_string()}")
# ── 클립보드 복사 (index/header 없이 값만) ────────────────────────────
df_result.to_clipboard(index=False, header=False)
print(f"\n📋 클립보드 복사 완료 → VBA에서 붙여넣기 대기 중...")
end = time.time()
print(f"✅ Python 완료 | 경과시간: {end - start:.5f} sec")
# =============================================================================
# 설정값 (여기만 수정)
# =============================================================================
if __name__ == "__main__":
FILE = "01xls.xls"
SHEET_NAME = "Sheet1"
SKIP_ROWS = 3 # 헤더 4행 → 0-based = 3
COL_START_DF1 = "A"
COL_END_DF1 = "B"
COL_START_DF2 = "F"
COL_END_DF2 = "G"
COL_TITLE_LIST_DF2 = ['제품', '가격']
MERGE_KEY = '제품'
RESULT_COLUMNS = ['이름', '제품', '가격']
main()
실행후
데이터 처리 결과 붙여넣기 Ctrl + v
claude_pandas_excel_final.py
0.00MB
01xls.xls
0.05MB
01xlsm.xlsm
0.02MB
01xlsx.xlsx
0.02MB
이 방법으로 하면 vba도 영향이 안가고 양식에도 안가니까 이 방법이 현재까지의 답
jupyter lab 참고파일
'컴퓨터 > Python' 카테고리의 다른 글
| xlsm파일 pandas df으로 한 번에 기존파일 수정 저장하기 vba useform 안날아감 (0) | 2026.03.31 |
|---|---|
| 세금계산서 pdf to excel 파일로 변환하기 (0) | 2026.03.27 |
| python 3.14.0 이 이미 설치되어있다는데 Python 3.13.5으로 나오면 (0) | 2025.11.17 |
| python 동영상 가로세로 비율 조정 코드 (0) | 2025.09.23 |
| 유튜브영상 다운로드 레터박스 없애기 (0) | 2025.09.11 |