AI건설실무 유튜브 AI건설실무 노션

AI실무 프롬프트

엑셀 설계 변경작업 바이브코딩(엑셀매크로) 활용

곰뚜가리 2026. 5. 8. 13:22

엑셀의 설계변경 작업은 당초내역서를 활용해서 한칸씩 복사해서 활용하게 됩니다.
이때 내역서가 길면 그만큼 일일이 수작업으로 해야할 일이 많게되는데 이것을 바이브코딩을 이용하여 엑셀VBA(매트로)를 자동적으로 생성하여 이것을 엑셀의 매크로시트에 복사하여 한번에 작업이 가능하게 됩니다.

 

 

 

(1. 사용된 프롬프트)

첨부된 3개 파일(당초, 변경, 설계변경)을 사용하여 설계변경 파일의 모든 시트를 작성해줘.
[작업 방법]
1. 대상: 설계변경 파일의 모든 시트
2. 처리 순서 (5행부터 데이터 끝까지): * 변경 파일 해당행 복사 → 설계변경에 붙여넣기 (빨간색) * 당초 파일 해당행 복사 → 설계변경에 붙여넣기 (검은색) * 다음 행으로 이동, 반복
3. 예외: 당초/변경 파일에 시트가 없으면 건너뛰기
4. 수식 행 번호 변환: 행이 2배로 늘어나므로, 수식 내 행 번호를 아래 공식으로 변환할 것 (미변환 시 금액 합계 오류 발생) - 변경 행(빨간): 원본 N행 → 5 + (N-5) × 2 - 당초 행(검은): 원본 N행 → 5 + (N-5) × 2 + 1 - 같은 시트(G5), 다른 시트(내역서!G6), 절대참조($D$8) 모두 적용 - 행 번호 5 미만(헤더 참조)은 변환하지 않음
5. 빈 행이 중간에 있어도 멈추지 말고 max_row까지 처리할 것
6. keep_vba=True로 로드하고 .xlsm으로 저장할 것

도로확포장(당초).xlsx
0.03MB
도로확포장(변경).xlsx
0.02MB
도로확포장(설계변경).xlsx
0.01MB

 

 

(2. 엑셀VBA 사용하기) -> alt키+F11키

설계변경 엑셀화일에 VBA에 기록하고 실행(당초,변경화일은 같은 디렉토리에 위치)

Sub CompareRowByRowDataForBothSheets()
    Dim 설계변경WB As Workbook
    Dim 변경WB As Workbook
    Dim 당초WB As Workbook
    Dim targetSheet1 As Worksheet, targetSheet2 As Worksheet
    Dim 변경Sheet1 As Worksheet, 변경Sheet2 As Worksheet
    Dim 당초Sheet1 As Worksheet, 당초Sheet2 As Worksheet
    Dim pasteRow1 As Long, pasteRow2 As Long
    Dim 변경Row As Long, 당초Row As Long
    Dim sourcePath As String
    Dim lastRow변경1 As Long, lastRow당초1 As Long
    Dim lastRow변경2 As Long, lastRow당초2 As Long
    Dim dataRange As Range
    
    ' 화면 업데이트 중지 및 상태 표시줄 설정
    Application.ScreenUpdating = False
    Application.StatusBar = "작업 진행 중... 잠시만 기다려 주세요."
    
    ' 현재 열려 있는 도로확포장(설계변경) 파일 참조
    On Error Resume Next
    Set 설계변경WB = Workbooks("도로확포장(설계변경).xlsm")
    If 설계변경WB Is Nothing Then
        MsgBox "도로확포장(설계변경) 파일이 열려 있지 않습니다.", vbExclamation
        Application.ScreenUpdating = True
        Exit Sub
    End If
    On Error GoTo 0
    
    ' "내역서"와 "총괄서" 시트 설정
    Set targetSheet1 = 설계변경WB.Sheets("내역서")
    Set targetSheet2 = 설계변경WB.Sheets("총괄서")
    
    ' 파일 경로 설정 (현재 파일과 같은 디렉토리)
    sourcePath = 설계변경WB.Path & "\"
    
    ' 도로확포장(변경) 및 도로확포장공사(당초) 파일 열기
    Set 변경WB = GetWorkbook(sourcePath & "도로확포장(변경).xlsx")
    Set 당초WB = GetWorkbook(sourcePath & "도로확포장(당초).xlsx")
    
    If 변경WB Is Nothing Or 당초WB Is Nothing Then Exit Sub
    
    ' 각 파일의 "내역서" 및 "총괄서" 시트 참조
    Set 변경Sheet1 = 변경WB.Sheets("내역서")
    Set 변경Sheet2 = 변경WB.Sheets("총괄서")
    Set 당초Sheet1 = 당초WB.Sheets("내역서")
    Set 당초Sheet2 = 당초WB.Sheets("총괄서")
    
    ' 마지막 행 찾기
    lastRow변경1 = 변경Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
    lastRow당초1 = 당초Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
    lastRow변경2 = 변경Sheet2.Cells(Rows.Count, 1).End(xlUp).Row
    lastRow당초2 = 당초Sheet2.Cells(Rows.Count, 1).End(xlUp).Row
    
    ' 붙여넣기 시작 행 설정
    pasteRow1 = 5
    pasteRow2 = 5
    변경Row = 5
    당초Row = 5

    ' "내역서" 시트 데이터가 끝날 때까지 행별로 복사 및 붙여넣기
    Do While 변경Row <= lastRow변경1 Or 당초Row <= lastRow당초1
        ' 변경 파일의 내역서 행 복사 및 붙여넣기 (빨간색)
        If 변경Row <= lastRow변경1 Then
            변경Sheet1.Rows(변경Row).Copy
            targetSheet1.Cells(pasteRow1, 1).PasteSpecial xlPasteValues
            targetSheet1.Rows(pasteRow1).Font.Color = RGB(255, 0, 0) ' 빨간색
            pasteRow1 = pasteRow1 + 1
            변경Row = 변경Row + 1
            Application.CutCopyMode = False ' 클립보드 비우기
        End If

        ' 당초 파일의 내역서 행 복사 및 붙여넣기 (검은색)
        If 당초Row <= lastRow당초1 Then
            당초Sheet1.Rows(당초Row).Copy
            targetSheet1.Cells(pasteRow1, 1).PasteSpecial xlPasteValues
            targetSheet1.Rows(pasteRow1).Font.Color = RGB(0, 0, 0) ' 검은색
            pasteRow1 = pasteRow1 + 1
            당초Row = 당초Row + 1
            Application.CutCopyMode = False ' 클립보드 비우기
        End If
    Loop

    ' "총괄서" 시트 데이터가 끝날 때까지 행별로 복사 및 붙여넣기
    변경Row = 5
    당초Row = 5
    Do While 변경Row <= lastRow변경2 Or 당초Row <= lastRow당초2
        ' 변경 파일의 총괄서 행 복사 및 붙여넣기 (빨간색)
        If 변경Row <= lastRow변경2 Then
            변경Sheet2.Rows(변경Row).Copy
            targetSheet2.Cells(pasteRow2, 1).PasteSpecial xlPasteValues
            targetSheet2.Rows(pasteRow2).Font.Color = RGB(255, 0, 0) ' 빨간색
            pasteRow2 = pasteRow2 + 1
            변경Row = 변경Row + 1
            Application.CutCopyMode = False ' 클립보드 비우기
        End If

        ' 당초 파일의 총괄서 행 복사 및 붙여넣기 (검은색)
        If 당초Row <= lastRow당초2 Then
            당초Sheet2.Rows(당초Row).Copy
            targetSheet2.Cells(pasteRow2, 1).PasteSpecial xlPasteValues
            targetSheet2.Rows(pasteRow2).Font.Color = RGB(0, 0, 0) ' 검은색
            pasteRow2 = pasteRow2 + 1
            당초Row = 당초Row + 1
            Application.CutCopyMode = False ' 클립보드 비우기
        End If
    Loop
    
    ' 내역서 시트의 서식 지정
    Set dataRange = targetSheet1.Range("A5", targetSheet1.Cells(pasteRow1 - 1, targetSheet1.Cells(5, Columns.Count).End(xlToLeft).Column))
    ApplyFormatting dataRange

    ' 총괄서 시트의 서식 지정
    Set dataRange = targetSheet2.Range("A5", targetSheet2.Cells(pasteRow2 - 1, targetSheet2.Cells(5, Columns.Count).End(xlToLeft).Column))
    ApplyFormatting dataRange

    ' 닫기
    변경WB.Close SaveChanges:=False
    당초WB.Close SaveChanges:=False
    
    ' 상태 표시줄과 화면 업데이트 설정 복원
    Application.StatusBar = "작업 완료되었습니다."
    Application.ScreenUpdating = True
    Application.CutCopyMode = False ' 클립보드 비우기
    MsgBox "내역서 및 총괄서 데이터 비교 작업이 완료되었습니다.", vbInformation
End Sub

' 서식을 적용하는 서브루틴
Sub ApplyFormatting(rng As Range)
    ' 열 너비 자동 조정
    rng.EntireColumn.AutoFit
    
    ' 테두리 설정
    With rng.Borders
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    
    ' 글자 크기 설정
    rng.Font.Size = 10 ' 원하는 글자 크기로 변경 가능
    
    ' 숫자 서식 및 오른쪽 정렬 적용
    rng.NumberFormat = "#,##0"
    rng.HorizontalAlignment = xlRight
End Sub

' 이미 열린 워크북을 참조하거나 새로 엽니다
Function GetWorkbook(filePath As String) As Workbook
    Dim wb As Workbook
    Dim fileName As String
    fileName = Dir(filePath)
    
    On Error Resume Next
    Set wb = Workbooks(fileName) ' 이미 열려 있는지 확인
    If wb Is Nothing Then
        Set wb = Workbooks.Open(filePath) ' 열려 있지 않으면 새로 열기
    End If
    On Error GoTo 0
    
    Set GetWorkbook = wb
End Function