728x90
반응형

이런느낌

Sub a현금흐름정렬a()
    Dim lastRowC As Long
    Dim lastRowD As Long
    Dim cellC As Range
    Dim cellD As Range
    Dim ws As Worksheet
    
    ' 현재 워크시트 설정
    Set ws = ThisWorkbook.Sheets("tmp현금") ' 시트 이름에 맞게 변경
    
    ' C열과 D열의 마지막 행 찾기
    lastRowC = ws.Cells(ws.Rows.Count, 3).End(xlUp).row
    lastRowD = ws.Cells(ws.Rows.Count, 4).End(xlUp).row
    
    ' C열을 순회하면서 D열과 비교
    For Each cellC In ws.Range("C2:C" & lastRowC)
        For Each cellD In ws.Range("D2:D" & lastRowD)
            If cellC.Value = cellD.Value And cellC.Value <> "" Then
                ' 값이 같으면 F열에 D열의 값, G열에 E열의 값을 복사
                cellC.Offset(0, 3).Value = cellD.Value      ' F열에 D열 값 복사
                cellC.Offset(0, 4).Value = cellD.Offset(0, 1).Value  ' G열에 E열 값 복사
                Exit For ' 값을 찾으면 다음 C셀로 이동
            End If
        Next cellD
    Next cellC
    
    MsgBox "F열과 G열에 데이터 정렬이 완료되었습니다!", vbInformation
End Sub


728x90
반응형
728x90
반응형

chatgpt 작성

import tkinter as tk
from tkinter import filedialog, messagebox
import xlwings as xw
import os

# 전역 변수로 파일 목록 저장
selected_files = []


# .xlsx 파일을 .xlsm으로 변환하는 함수
def convert_xlsx_to_xlsm(xlsx_files):
    try:
        for xlsx_file in xlsx_files:
            # xlwings로 엑셀 파일 열기
            wb = xw.Book(xlsx_file)

            # .xlsm 파일명 설정
            xlsm_file = os.path.splitext(xlsx_file)[0] + '.xlsm'

            # .xlsm 파일로 저장
            wb.save(xlsm_file)
            wb.close()  # 저장 후 엑셀 파일 닫기

        # 성공 메시지
        messagebox.showinfo("성공", f"{len(xlsx_files)}개의 파일이 성공적으로 변환되었습니다.")
    except Exception as e:
        messagebox.showerror("오류", f"파일 변환 중 오류가 발생했습니다: {str(e)}")


# 파일 선택하는 함수
def select_files():
    global selected_files
    # 여러 개의 .xlsx 파일을 선택
    selected_files = filedialog.askopenfilenames(
        title="변환할 .xlsx 파일을 선택하세요",
        filetypes=[("Excel 파일", "*.xlsx")],
        multiple=True
    )

    # 파일이 선택되었을 때 UI 업데이트
    if selected_files:
        selected_files_label.config(text=f"{len(selected_files)}개의 파일이 선택되었습니다.")
        convert_button.config(state=tk.NORMAL)  # 변환 버튼 활성화
    else:
        selected_files_label.config(text="파일이 선택되지 않았습니다.")
        convert_button.config(state=tk.DISABLED)  # 변환 버튼 비활성화


# 변환 시작 함수
def start_conversion():
    if selected_files:
        convert_xlsx_to_xlsm(selected_files)
    else:
        messagebox.showwarning("경고", "변환할 파일을 선택하지 않았습니다.")


# GUI 설정
root = tk.Tk()
root.title("XLSX to XLSM 변환기")
root.geometry("400x200")

# 파일 선택 버튼
select_button = tk.Button(root, text="파일 선택", command=select_files)
select_button.pack(pady=20)

# 선택된 파일을 표시할 레이블
selected_files_label = tk.Label(root, text="파일이 선택되지 않았습니다.")
selected_files_label.pack(pady=10)

# 변환 버튼 (초기에는 비활성화)
convert_button = tk.Button(root, text="변환 시작", command=start_conversion, state=tk.DISABLED)
convert_button.pack(pady=20)

# GUI 루프 실행
root.mainloop()
728x90
반응형
728x90
반응형

관세청에서 확인할 내용

개발자 모드(F12) Network에서 retrieveTradeRegion.do 확인
Header에서 general, header등 확인.

중요한건 payload : 검색날짜, 시도 코드, HS코드 길이, HS코드 등 중요

파이썬 코드 작성

def bhi_trade(self): #비에이치아이
    try:
        check_open_file = open("D:\\4.각종INDEX\\★기업별수출입★.xlsx", "+r")
        check_open_file.close()
    except:
        QMessageBox.about(self, "message", "엑셀 close!!")
        return 0
    strdate = self.dateEdit_str.date() #.toString("yyyyMM")
    enddate = self.dateEdit_end.date() #.toString("yyyyMM")

    sido = ['48']  # 경상남도
    sgg =  ['637'] # 함안
    hscode = ['84']  # 라면
    self.ret_value = self.tradeWeb.get_tradeDataWeb(strdate, enddate, sido,sgg,hscode)

    self.error_message("비에이치아이", self.ret_value)
    pass
class TradedataWebPage():
    def __init__(self):
        self.url = 'http://apis.data.go.kr/1220000/sidoitemtrade/getSidoitemtradeList'
        self.strYYmm = {}
        self.endYYmm = {}
        self.sido = {}
        self.sgg = {}
        self.strHS_NumOfDigit = {}
        self.hashcode = {}
        self.url_tradedata_go_kr = 'https://tradedata.go.kr/cts/hmpg/retrieveTradeRegion.do'  # 지역별-품목별-수출입실적(시군구)
        self.headers = {  # 만질필요없는듯
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Host': 'tradedata.go.kr',
            'isAjax': 'true',
            'Origin': 'https://tradedata.go.kr',
            'Referer': 'https://tradedata.go.kr/cts/index.do',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.104 Whale/3.13.131.36 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest',
        }
        self.params = {
            'tradeKind': 'ETS_MNK_1040000A',
            'sidosggKind': 'sgg',
            'priodKind': 'MON',
            'priodFr': f'{self.strYYmm}',
            'priodTo': f'{self.endYYmm}',
            'statsBase': 'acptDd',
            'sidoCd': f'{self.sido}', #도
            'sggCd': f'{self.sgg}', #시군군구
            'imexTpcd': 'EXP_TMPR_CD',
            'showPagingLine': '15',
            'sortColumn': '',
            'sortOrder': '',
            'hsSgnGrpCol': f'{self.strHS_NumOfDigit}', #HS4_SGN HS코드자리수 ex) 19(곡물),1902(파스타),190230(그밖의파스타) //6자리까지
            'hsSgnWhrCol': f'{self.strHS_NumOfDigit}',
            'hsSgn': f'{self.hashcode}',  #
        }
def get_tradeDataWeb(self,strdate,enddate,sido,sgg,hscode):
    strdate = strdate.toString("yyyyMM")
    enddate = enddate.toString("yyyyMM")

    self.df_tradeData = []
    df_hs = pd.DataFrame()

    for hs in range(len(hscode)):
        hsnum = 'HS' + str(len(hscode[hs])) + '_SGN'  # HS4_SGN, HS6_SGN
        df_sido = pd.DataFrame()
        for si in range(len(sido)):
            self.params.update({'priodFr':strdate, 'priodTo':enddate, 'sidoCd':sido[si], 'sggCd':sgg[si],'hsSgnGrpCol':hsnum,'hsSgnWhrCol':hsnum,'hsSgn':hscode[hs]})
            self.df_tradeData = self.sub_get_tradeDataWeb()
            df_sido = df_sido._append(self.df_tradeData)
        df_hs = df_hs._append(df_sido)
def sub_get_tradeDataWeb(self):
    res = requests.post(self.url_tradedata_go_kr, headers=self.headers, params=self.params)
    data = json.loads(res.text)
728x90
반응형
728x90
반응형
re.findall(r"{}', '(.*?)',".format(rcept_no), webpage_dcm)[0] 

re.findall(pattern, string) 함수는 string에서 pattern과 일치하는 모든 부분 문자열을 찾아서 리스트

예를 들어, rcept_no가 "123456"이라면 패턴은 다음과 같이 생성됩니다:

r"{}', '(.*?)',".format(rcept_no)  = 'r"123456', '(.*?)',"  같은의미

 

  • (.*?) : 이 부분은 캡처 그룹입니다. .*?는 비탐욕적(non-greedy) 방식으로 모든 문자를 0번 이상 매칭합니다. 즉, 가능한 짧은 부분 문자열을 매칭합니다.
  • '," : 이 부분도 고정된 문자열 패턴으로, 앞의 비탐욕적 캡처 그룹이 끝난 후 작은 따옴표와 쉼표가 따라옵니다.

뭔말인지 모르겟음.

예시로 보면

12345',  (따음표 쉼표 까지가 찾고자 하는 문자열) -> 이문자열 다음에 나오는 문자열을 찾는것

 

728x90
반응형
728x90
반응형

 

Sub a셀줄나눔셀분리a()
    Dim rng As Range
    Dim cell As Range
    Dim lines() As String
    Dim i As Long
    
    ' 분할할 셀 범위를 지정합니다.
    ' 예를 들어, A1:A10 범위를 분할하려면 다음과 같이 설정합니다.
    Set rng = Selection
    copy_row = 0
    
    For Each cell In rng
        ' 셀의 내용을 줄바꿈을 기준으로 분할합니다.
        lines = Split(cell.Value, Chr(10))
        ' 분할된 각 라인을 인접한 셀에 넣습니다.
        For i = 0 To UBound(lines)
            cell.Offset(copy_row + i, 1).Value = lines(i)
        Next i
        copy_row = copy_row + i - 1
    Next cell
End Sub

728x90
반응형

+ Recent posts