이번에 만들었는 업데이트는 많은 양의 데이터를 한 번에 입력하는 엑셀입니다. 7버전까지는 하나하나 수작업으로 입력하였는데 이번에는 한꺼번에 입력하는 것으로 만들었답니다. (주문량이 많으면 입력만 하루종일 걸려서 이렇게 변경하였습니다.)
이번부터는 각각의 쇼핑몰 사이트에 들어가서 정보를 보고 입력하는것이 아니라 토글이라는 사이트에서 취합하여 한번에 엑셀파일을 내려받고 그 엑셀파일을 불러와서 저에게 맞는 양식으로 변경하는 것입니다.
흐름도는 토글 > 엑셀 > 파이썬파일 이런 식입니다. 간단하죠.
업데이트
이번에 ver8부터는 수동으로 파일을 이메일 보내고 받아서 데이터 옮기고 그런 작업을 하지 않고 인터넷으로 업데이트 파일을 받아 실행하면 되도록 만들었습니다.
파일을 실행하면 업데이트 파일을 찾아 업데이트가 있으면 폼의 부분을 실행하여 받기를 유도하였습니다. 또한 도움말이나 information을 클릭하면 업데이트가 있는지 확인하는 것도 추가하였습니다.
파일은 github를 용량을 이용하여 업데이트의 파일을 업로드하도록 하였습니다.
토글의 파일
이제 토글의 파일을 다운로드하여 특정 폴더에 넣으면 이 파일을 엑셀에 적용하도록 하였습니다.
TOGLE폴더를 만들어서 그 안에 넣은 파일을 읽어 오도록 하는 것입니다. (쿼리를 사용)
쿼리를 사용하여 1차 가공을 합니다. 그 후 시트 <입력>에 적당한 위치에 값을 넣습니다.
이것이 파일을 실행하면 처음으로 하는 작업입니다. 이때 에러가 발생 시 수정도 포함입니다. 엑셀이 완벽하진 않으니까요.
입력시트
입력시트에 뿌려진 쿼리값을 가져와서 각각의 행에 미리 계산을 완료해서 그 값을 저장 시트에 넣습니다. 이때 수동으로 입력하는 부분과 자동으로 입력되어 있는 부분을 색으로 구분하여 입력하는 사람의 시작적으로 쉽게 하도록 하였습니다.
1행의 의미 :
- 빨강 → 수식을 사용하여 만들어진 열
- 녹색 → 자동으로 계산되는 열
- 노랑 → 수동으로 입력해야 하는 열
미리 수식을 만들었지만 이 수식은 지워질 수 있어서 VBA에 미리 적어 두어서 삭제되면 적도록 하였습니다.
Sub 입력_시트데이터_삭제_수식_체크()
Dim endRow As Integer
With ThisWorkbook.Sheets("입력")
endRow = .Cells(Rows.Count, "AB").End(xlUp).Row '"수취인명"이 기준
.Activate
.Range("A3:A" & endRow).ClearContents
.Range("B2:B" & endRow).ClearContents
.Range("C3:W" & endRow).ClearContents
.Range("X2:AA" & endRow).ClearContents
If .Range("A2").Formula = "" Then .Range("A2").Formula = "=IFERROR(""SE""&IF(ISNUMBER(SEARCH(""호"",MID(TOGLE[합],SEARCH(""SE"",TOGLE[합])+IF(MID(TOGLE[합],SEARCH(""SE"",TOGLE[합]),3)=""SE."",3,2),4))),LEFT(MID(TOGLE[합],SEARCH(""SE"",TOGLE[합])+IF(MID(TOGLE[합],SEARCH(""SE"",TOGLE[합]),3)=""SE."",3,2),4),SEARCH(""호"",MID(TOGLE[합],SEARCH(""SE"",TOGLE[합])+IF(MID(TOGLE[합],SEARCH(""SE"",TOGLE[합]),3)=""SE."",3,2),4))-1),LEFT(MID(TOGLE[합],SEARCH(""SE"",TOGLE[합])+IF(MID(TOGLE[합],SEARCH(""SE"",TOGLE[합]),3)=""SE."",3,2),4),3)),"""")"
If .Range("C2").Formula = "" Then .Range("C2").Formula = "=IFERROR(IF(AND(B2="""", A2="""", TOGLE[@판매채널]=""기타쇼핑몰"", TOGLE[@쇼핑몰구분]=""세은산업""),""1000"",IF(B2<>"""", B2, IF(MID(A2,3,1)=""."",MID(A2,4,6),MID(A2,3,5)))),""x"")"
If .Range("D2").Formula = "" Then .Range("D2").Formula = "=IFERROR(XLOOKUP(""SE.""&$C2,종류표[제품코드],종류표[명칭],,0),""x"")"
...
If .Range("W1").Formula = "" Then .Range("W1").Formula = "cs참조"
If .Range("X1").Formula = "" Then .Range("X1").Formula = "박스가격"
If .Range("Y1").Formula = "" Then .Range("Y1").Formula = "제작"
If .Range("Z1").Formula = "" Then .Range("Z1").Formula = "클레임"
If .Range("AA1").Formula = "" Then .Range("AA1").Formula = "cs메모"
End With
MsgBox "'입력' 시트의 데이터 삭제가 완료되었습니다."
End Sub
입력에서 저장(리본 메뉴)
입력란에 모두 입력하면 리본메뉴에 출고 DB, 고객 DB에 변환 저장하기를 눌러 각각 시트에 저장합니다.
진행바
데이터 이동시 진행을 알려주는 진행바를 추가하여 시작적으로 알 수 있게 했습니다.
물론 완료 후 진행한 결과물도 보이게 됩니다.
마무리
모든 데이터가 정상적으로 저장되며 이 출고DB, 고객DB에 저장됩니다. 그리고 리본메뉴에 액세스테 저장되도록 합니다.
따로 진행바를 만들지 않았습니다. 그냥 클릭하면 저장됩니다.
물론 파일 로드 시 비교하여 최신 부분을 불러오게 됩니다.
이 파일은 쿼리에서 액세스를 이용하여 데이터를 이동하기 때문에 파일만 있으면 됩니다. (DB폴더)
또한 가격이나 기타 부분은 따로 파일(SE_DB)을 만들어서 저장하기 때문에 앞으로 파일업데이트 시 파일만 교체하면 되어서 간편합니다.
MoveFiles
모든 작업이 완료되면 파이썬파일을 실행하여 <TOGLE>폴더 내에 1개의 파일을 제외한 모든 파일을 <OLD>폴더에 넣습니다.
import os
import shutil
from tkinter import messagebox
from datetime import datetime
import sys
# 실행 파일이 있는 폴더 찾기
if getattr(sys, 'frozen', False):
executable_folder = os.path.dirname(sys.executable)
if sys.executable.endswith(".exe"):
# 콘솔 창을 숨기는 코드
import ctypes
ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0)
else:
executable_folder = os.path.dirname(os.path.abspath(__file__))
# 소스 폴더 지정
source_folders = [
os.path.join(executable_folder, 'TOGLE')
]
# 대상 폴더 경로 설정
destination_folder = os.path.join(executable_folder, 'OLD')
# 파일 이동 후에 파일명 변경하는 함수
def move_and_rename(src, dst, folder_name):
# 파일 이동
shutil.move(src, dst)
# 파일명 변경
base_name, extension = os.path.splitext(dst)
...
# 하위 폴더 내에 2차 "{하위폴더명}_빈파일.xlsx" 파일 이동하지 않음
sub_folder = os.path.dirname(source_file_path)
sub_folder_name = os.path.basename(sub_folder)
exclusion_pattern = f"{sub_folder_name}_빈파일.xlsx"
if exclusion_pattern == file_name:
print(f"이동 금지: {source_file_path} -> {destination_file_path}\n")
continue
# 모든 파일 또는 폴더를 대상 폴더로 이동 및 이름 변경
move_and_rename(source_file_path, destination_file_path, folder_name=os.path.basename(source_folder))
file_count += 1
completed_count += 1
# 이동한 파일 정보 출력
print(f"이동 중: {source_file_path} -> {destination_file_path}\n")
messagebox.showinfo("Move all files or folders v0.8 {완료창}", f"총 {completed_count} 개의 파일을 이동 완료했습니다.")
TOCLE폴더 내에 각각 해당 파일의 년-월-일을 읽어 <년>과 <월>을 폴더에 만들어서 저장합니다.
맷은말
경리 아가씨의 말 한마디 때문에 시작하게 된 것이 이렇게 몇 가지 기능도 넣고 작업이 수월하도록 만들다 보니 점점 좋게 돼 가면서 신이 난 것 같이 작업했습니다. 물론 몇몇은 머리를 줘어짜며 했지만 그래도 결과물이 좋아 고생한 보람은 있네요.