본 자료는 현 공유드리는 대상자분들에게만 한해 제공드리며, 부가기능 자료는 이미 공유되어 있는 자료로 공유가 가능하나 실습자료의 경우 외부 공유는 불허합니다.
강의 관련하여 문의사항 있는 경우 연락처로 문의주시거나, 이메일로 문의주시면 2~3일내 답변드리겠습니다:)
업무관련 고민되는 사항 있으시면 편하게 말씀주세요:) 같이 고민하겠습니다.
•
유민균 강사 010-2926-5476
•
이메일 : mkyoo@wedrawbusiness.com
•
홈페이지 : https://litt.ly/swervemk
커리큘럼
구 분 | 내 용 |
AI 기본 원리 및 작동 방식 이해 | |
기본 프롬프트 작성 방법 및 실습 | |
엑셀 및 VBA 스크립트를 활용한 AI 자동화 실습 |
AI 기본 원리 및 작동 방식 이해
LLM AI 3대장
•
Chat GPT https://chatgpt.com/
•
Claude https://claude.ai/chats
•
◦
Google ai studio https://aistudio.google.com/prompts/new_chat
바이브코딩이란?
기본 프롬프트 작성 방법 및 실습
공식가이드
프롬프트 최적화 도구
1.
클로드 프롬프트 최적화 도구 https://console.anthropic.com/dashboard
2.
Chat GPT 프롬프트 최적화 도구 https://platform.openai.com/chat/edit?models=gpt-5&optimize=true
명확하고 직접적이며 상세하게
새로운 AcmeCloud 기능을 위한 마케팅 이메일을 작성해주세요.
JavaScript
복사
분기별 검토를 위해 고객 피드백을 익명화하는 것이 당신의 작업입니다.
지시사항:
1. 모든 고객 이름을 “CUSTOMER_[ID]“로 대체하세요(예: “Jane Doe” → “CUSTOMER_001”).
2. 이메일 주소를 “EMAIL_[ID]@example.com”으로 대체하세요.
3. 전화번호를 “PHONE_[ID]“로 수정하세요.
4. 특정 제품(예: “AcmeCloud”)이 언급된 경우 그대로 두세요.
5. PII가 발견되지 않으면 메시지를 그대로 복사하세요.
6. 처리된 메시지만 출력하고 ”---“로 구분하세요.
처리할 데이터: {{FEEDBACK_DATA}}
JavaScript
복사
예시(멀티샷 프롬프팅)를 사용하여 Claude의 행동 유도하기
이 고객 피드백을 분석하고 문제를 분류하세요. 다음 카테고리를 사용하세요: UI/UX, 성능, 기능 요청, 통합, 가격 책정 및 기타. 또한 감정(긍정/중립/부정)과 우선순위(높음/중간/낮음)를 평가하세요.
피드백은 다음과 같습니다: {{FEEDBACK}}
JavaScript
복사
우리 CS팀이 구조화되지 않은 피드백으로 인해 어려움을 겪고 있습니다. 당신의 임무는 제품 및 엔지니어링 팀을 위해 피드백을 분석하고 문제를 분류하는 것입니다. 다음 카테고리를 사용하세요: UI/UX, 성능, 기능 요청, 통합, 가격 책정 및 기타. 또한 감정(긍정/중립/부정)과 우선순위(높음/중간/낮음)를 평가하세요. 다음은 예시입니다:
<example>
입력: 새로운 대시보드는 엉망입니다! 로드하는 데 너무 오래 걸리고 내보내기 버튼을 찾을 수 없어요. 이것을 빨리 수정해주세요!
카테고리: UI/UX, 성능
감정: 부정
우선순위: 높음</example>
이제 이 피드백을 분석하세요: {{FEEDBACK}}
JavaScript
복사
Claude가 생각하도록 하여(사고 연쇄 프롬프팅) 성능을 향상시키기
당신은 재무 상담사입니다. 고객이 $10,000를 투자하고 싶어합니다. 두 가지 옵션 중 선택할 수 있습니다: A) 연간 12%의 수익률을 기록했지만 변동성이 있는 주식, 또는 B) 연간 6%를 보장하는 채권. 고객은 5년 후 주택 계약금으로 이 돈이 필요합니다. 어떤 옵션을 추천하시겠습니까?
JavaScript
복사
당신은 재무 상담사입니다. 고객이 $10,000를 투자하고 싶어합니다. 두 가지 옵션 중 선택할 수 있습니다: A) 연간 12%의 수익률을 기록했지만 변동성이 있는 주식, 또는 B) 연간 6%를 보장하는 채권. 고객은 5년 후 주택 계약금으로 이 돈이 필요합니다. 어떤 옵션을 추천하시겠습니까?
단계별로 생각하세요.
JavaScript
복사
XML 태그를 사용하여 프롬프트 구조화하기
당신은 AcmeCorp의 재무 분석가입니다. 투자자들을 위한 Q2 재무 보고서를 작성하세요. 작년의 이 예시처럼 수익 성장, 이익률, 현금 흐름 섹션을 포함하세요: {{Q1_REPORT}}. 이 스프레드시트의 데이터 포인트를 사용하세요: {{SPREADSHEET_DATA}}. 보고서는 매우 간결하고, 핵심적이며, 전문적이어야 하고 목록 형식이어야 합니다. 강점과 개선이 필요한 영역 모두를 강조해야 합니다.
JavaScript
복사
당신은 AcmeCorp의 재무 분석가입니다. 투자자들을 위한 Q2 재무 보고서를 작성하세요.
AcmeCorp는 B2B SaaS 기업입니다. 우리 투자자들은 투명성과 실행 가능한 인사이트를 중요시합니다.
보고서에 이 데이터를 사용하세요:<data>{{SPREADSHEET_DATA}}</data>
<instructions>
1. 다음 섹션을 포함하세요: 수익 성장, 이익률, 현금 흐름.
2. 강점과 개선이 필요한 영역을 강조하세요.
</instructions>
간결하고 전문적인 톤을 유지하세요. 다음 구조를 따르세요:
<formatting_example>{{Q1_REPORT}}</formatting_example>
JavaScript
복사
•
개별화된 항목을 채팅에서 입력시에는 아래와 같이 활용
<data>첨부된 스프레드시트 데이터를 분석해서</data>
JavaScript
복사
시스템 프롬프트로 Claude에게 역할 부여하기
우리의 2분기 재무 데이터를 분석하세요:<data>{{FINANCIALS}}</data>주요 트렌드를 강조하고 조치를 권장하세요
JavaScript
복사
귀하는 고성장 B2B SaaS 기업의 CFO입니다. 우리는 이사회에서 2분기 재무를 논의하고 있습니다:<data>{{FINANCIALS}}</data>주요 트렌드를 분석하고, 우려사항을 표시하며, 전략적 조치를 권장하세요. 투자자들은 공격적인 성장을 원하지만 소진율을 우려하고 있습니다.
JavaScript
복사
더 나은 출력 제어를 위한 Claude의 응답 미리 채우기
Extract the name, size, price, and color from this product description as a JSON object:<description>The SmartHome Mini is a compact smart home assistant available in black or white for only $49.99. At just 5 inches wide, it lets you control lights, thermostats, and other connected devices via voice or app—no matter where you place it in your home. This affordable little hub brings convenient hands-free control to your smart devices.</description>
JavaScript
복사
Extract the name, size, price, and color from this product description as a JSON object:<description>The SmartHome Mini is a compact smart home assistant available in black or white for only $49.99. At just 5 inches wide, it lets you control lights, thermostats, and other connected devices via voice or app—no matter where you place it in your home. This affordable little hub brings convenient hands-free control to your smart devices.</description>
{
JavaScript
복사
Tips
•
시작 할 때 형식을 제공하기
•
긴 내용은 앞에 포함하기
요약하면!
내가 원하고자 하는 바를 자세하게 입력하고, 데이터분석에 필요한 예시를 제공하고, 사고모델이 아니여도 기본적으로 사고할수있도록 “단계별로 생각하세요”라고 하며 구조화를 위해 XML 형식을 사용하고 맨처음 시스템프롬프트로 역할을 지정하면서 답변하는 양식에는 바로 시작할 수 있도록 응답을 미리 채운다
만드는 프롬프트 (왼쪽 삼각형을 눌러주세요)
범용 프롬프트 탬플릿 구조
## 🔧 **범용 프롬프트 템플릿 구조**
```xml
<role>
[전문 분야]의 [경력 년수]년 경력 전문가로서, [핵심 역량]에 특화된 솔루션을 제공합니다.
</role>
<task>
[구체적인 작업 목표를 한 문장으로]
</task>
<requirements>
<primary_goal>
[메인 목표 상세 기술]
</primary_goal>
<specific_conditions>
- [조건 1]
- [조건 2]
- [조건 3]
</specific_conditions>
<technical_requirements>
- [기술적 요구사항 1]
- [기술적 요구사항 2]
- [성능/품질 요구사항]
</technical_requirements>
</requirements>
<sample_data>
<input_example>
[실제 입력 데이터 샘플]
</input_example>
<expected_output>
[기대하는 출력 형태]
</expected_output>
</sample_data>
<edge_cases>
<potential_issues>
- [예상되는 문제 상황 1]
- [예상되는 문제 상황 2]
- [처리해야 할 특수 케이스]
</potential_issues>
</edge_cases>
<instructions>
단계별로 생각하세요:
1. [1단계 작업]
2. [2단계 작업]
3. [3단계 작업]
4. [최종 검증]
</instructions>
<response_format>
다음 형식으로 응답해주세요:
[미리 채워진 응답 템플릿]
- [실행 가능한 코드/솔루션 시작 부분]
- [주요 섹션 구조]
- [결과 확인 방법]
</response_format>
JavaScript
복사
엑셀 및 VBA 스크립트를 활용한 AI 자동화 실습
•
(테스트) 새 모듈 입력
Sub HelloWorld()
MsgBox "Hello JB WOORI CAPITAL!"
End Sub
JavaScript
복사
실습 파일 취합과 분배
•
각 부서에서 받은 파일을 쉽게 취합하기
◦
원래 프롬프트
너는 vba코드 개발자로 실무에서 엑셀로 개발하고 있어
<location>
C:\Users\alsrb\Desktop\AI 데이터실습\drive-download-20250824T214001Z-1-001\MAPO_LIB_AIR_2022년(2022.01.03~2023.01.01)
</location>
# 목표
다음 엑셀 파일을 종합하는 VBA 코드를 작성해주세요.
- 위 폴더에 있는 엑셀 데이터를 취합하여 코드를 실행한 Sheet1에 정리할 것
- 열 이름을 기준으로 파일을 종합할 것
- 데이터를 종합한 후 "마포구 공기질현황_{오늘 날짜}" 이름을 가진 엑셀 파일로 저장할 것
- 종합이 완료된 후 완료 메시지를 출력할 것
프롬프트는 한글로 제공
JavaScript
복사
◦
수정 프롬프트
<role>
당신은 20년 경력의 Excel VBA 전문가입니다. 실무에서 대용량 데이터 처리와 자동화 솔루션을 개발해온 경험이 풍부합니다. 사용자의 요구사항을 정확히 파악하고, 안정적이고 효율적인 VBA 코드를 작성하는 것이 당신의 전문 분야입니다.
</role>
<task>
여러 개의 데이터 파일을 하나의 Excel 시트로 통합하는 VBA 코드를 작성해주세요.
</task>
<requirements>
<primary_goal>
지정된 폴더 내의 모든 CSV와 Excel 파일의 데이터를 하나의 워크시트에 통합하여 새로운 파일로 저장
</primary_goal>
<specific_conditions>
- 폴더 경로: C:\Users\alsrb\Desktop\AI 데이터실습\drive-download-20250824T214001Z-1-001\MAPO_LIB_AIR_2022년(2022.01.03~2023.01.01)\
- 첫 번째 파일의 헤더행만 유지, 이후 파일들은 데이터만 추가
- 파일 형식: CSV (EUC-KR 인코딩), Excel (xls, xlsx)
- 저장 파일명: "마포구 공기질현황_YYYY-MM-DD.xlsx" 형식
- 에러 발생 시에도 다른 파일들은 계속 처리
</specific_conditions>
<technical_requirements>
- 메모리 효율적인 셀 단위 복사 방식 사용
- 원본 파일들은 ReadOnly 모드로 열기
- 새 워크북으로 저장하여 원본 보호
- 포괄적인 에러 처리 및 리소스 정리
- 사용자 친화적인 진행 상황 표시 및 완료 메시지
</technical_requirements>
</requirements>
<sample_data>
<file_structure>
폴더 내 파일 예시:
- MAPO_LIB_AIR_2022.01.0301.09.csv (3,356행)
- MAPO_LIB_AIR_2022.01.0310.16.csv (2,847행)
- MAPO_LIB_AIR_2022.01.1723.24.csv (4,123행)
</file_structure>
<csv_header_example>
기관명,모델명,시리얼,데이터관측일시,온도(℃),습도(%),미세먼지(㎍/㎥),소음(㏈),이산화탄소(ppm),휘발성유기화합물(ppb),초미세먼지(㎍/㎥),학습능률지수(%),등록일자
</csv_header_example>
<data_row_example>
"마포구","AirGuard-K","V01G1613544","202201030855","1158","41","112","74","981","185","81","49","2022-01-03 08:59:29","",""
</data_row_example>
</sample_data>
<edge_cases>
<potential_issues>
- CSV 파일의 EUC-KR 인코딩으로 인한 한글 깨짐
- 빈 파일이나 헤더만 있는 파일
- 파일 접근 권한 문제
- 메모리 부족 상황
- 중복되거나 손상된 파일
</potential_issues>
</edge_cases>
<instructions>
단계별로 생각하세요:
1. 먼저 전체 작업 흐름을 분석하고
2. 필요한 변수와 객체들을 정의하며
3. 파일 형식별 처리 방법을 구분하고
4. 데이터 복사 로직을 설계한 후
5. 에러 처리와 리소스 정리 방안을 수립하세요
</instructions>
<response_format>
다음 형식으로 응답을 시작해주세요:
```vba
Sub 마포구_공기질_데이터_통합()
' ============================================
' 마포구 공기질 데이터 통합 프로그램
' 작성일: [날짜]
' 기능: 폴더 내 모든 CSV/Excel 파일을 하나의 시트로 통합
' ============================================
' 1단계: 변수 선언
Dim folderPath As String
Dim fileName As String
' [추가 변수들...]
' 2단계: 초기화 및 환경 설정
On Error GoTo ErrorHandler
' [초기화 코드...]
</response_format>
JavaScript
복사
◦
VBA코드 한 시트에 모든 데이터
Sub 마포구_공기질_데이터_종합_수정()
' 변수 선언
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim ws As Worksheet
Dim sourceWb As Workbook
Dim sourceWs As Worksheet
Dim lastRow As Long
Dim sourceLastRow As Long
Dim sourceLastCol As Long
Dim isFirstFile As Boolean
Dim newFileName As String
Dim todayDate As String
Dim processedFiles As Long
Dim targetRow As Long
Dim i As Long, j As Long
Dim dateCol As Variant ' 등록일자 열 위치(숫자 또는 오류)
' 에러 처리 시작
On Error GoTo ErrorHandler
' 초기화
folderPath = "C:\Users\alsrb\Desktop\AI 데이터실습\drive-download-20250824T214001Z-1-001\MAPO_LIB_AIR_2022년(2022.01.03~2023.01.01)\"
Set wb = ThisWorkbook
Set ws = wb.Sheets("Sheet1")
isFirstFile = True
processedFiles = 0
todayDate = Format(Date, "yyyy-mm-dd")
newFileName = "마포구 공기질현황_" & todayDate & ".xlsx"
' Sheet1 초기화
ws.Cells.Clear
' 화면 업데이트 및 경고 비활성화
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
' CSV 파일 처리
fileName = Dir(folderPath & "*.csv")
Do While fileName <> ""
Application.StatusBar = "처리 중: " & fileName
' CSV 파일 열기 시도
On Error Resume Next
Set sourceWb = Nothing
' CSV 파일 열기
Set sourceWb = Workbooks.Open(folderPath & fileName, _
Format:=6, _
Delimiter:=",", _
Origin:=xlWindows, _
UpdateLinks:=False)
If Err.Number = 0 And Not sourceWb Is Nothing Then
Set sourceWs = sourceWb.Sheets(1)
' 데이터 범위 확인
sourceLastRow = sourceWs.Cells(sourceWs.Rows.Count, 1).End(xlUp).Row
sourceLastCol = sourceWs.Cells(1, sourceWs.Columns.Count).End(xlToLeft).Column
If sourceLastRow > 0 And sourceLastCol > 0 Then
If isFirstFile Then
' 첫 번째 파일: 헤더 포함 전체 복사 (값만)
For i = 1 To sourceLastRow
For j = 1 To sourceLastCol
ws.Cells(i, j).Value = sourceWs.Cells(i, j).Value
Next j
Next i
targetRow = sourceLastRow + 1
isFirstFile = False
processedFiles = processedFiles + 1
' 헤더에서 "등록일자" 열 위치 파악
dateCol = Application.Match("등록일자", ws.Rows(1), 0)
Else
' 두 번째 파일부터: 헤더 제외하고 복사
If sourceLastRow > 1 Then
For i = 2 To sourceLastRow
For j = 1 To sourceLastCol
ws.Cells(targetRow, j).Value = sourceWs.Cells(i, j).Value
Next j
targetRow = targetRow + 1
Next i
processedFiles = processedFiles + 1
End If
End If
End If
' 파일 닫기 (저장하지 않음)
sourceWb.Close SaveChanges:=False
Set sourceWb = Nothing
End If
Err.Clear
On Error GoTo ErrorHandler
fileName = Dir
Loop
' Excel 파일 처리
fileName = Dir(folderPath & "*.xl*")
Do While fileName <> ""
If fileName <> wb.Name Then ' 현재 파일 제외
Application.StatusBar = "처리 중: " & fileName
On Error Resume Next
Set sourceWb = Nothing
Set sourceWb = Workbooks.Open(folderPath & fileName, _
ReadOnly:=True, _
UpdateLinks:=False)
If Err.Number = 0 And Not sourceWb Is Nothing Then
Set sourceWs = sourceWb.Sheets(1)
sourceLastRow = sourceWs.Cells(sourceWs.Rows.Count, 1).End(xlUp).Row
sourceLastCol = sourceWs.Cells(1, sourceWs.Columns.Count).End(xlToLeft).Column
If sourceLastRow > 0 And sourceLastCol > 0 Then
If isFirstFile Then
' 첫 번째 파일: 헤더 포함 전체 복사
For i = 1 To sourceLastRow
For j = 1 To sourceLastCol
ws.Cells(i, j).Value = sourceWs.Cells(i, j).Value
Next j
Next i
targetRow = sourceLastRow + 1
isFirstFile = False
processedFiles = processedFiles + 1
' 헤더에서 "등록일자" 열 위치 파악
dateCol = Application.Match("등록일자", ws.Rows(1), 0)
Else
' 두 번째 파일부터: 헤더 제외하고 복사
If sourceLastRow > 1 Then
For i = 2 To sourceLastRow
For j = 1 To sourceLastCol
ws.Cells(targetRow, j).Value = sourceWs.Cells(i, j).Value
Next j
targetRow = targetRow + 1
Next i
processedFiles = processedFiles + 1
End If
End If
End If
sourceWb.Close SaveChanges:=False
Set sourceWb = Nothing
End If
Err.Clear
On Error GoTo ErrorHandler
End If
fileName = Dir
Loop
' === 등록일자 열 서식 적용 (원본처럼 보여주기) ===
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If Not IsError(dateCol) And lastRow >= 2 Then
With ws.Range(ws.Cells(2, CLng(dateCol)), ws.Cells(lastRow, CLng(dateCol)))
.NumberFormat = "yyyy-mm-dd hh:mm"
End With
End If
' 결과 확인 및 저장
If lastRow > 1 Then
' 간단한 서식 적용
ws.Range("A1").CurrentRegion.Columns.AutoFit
' 새 워크북으로 저장 (현재 워크북과 분리)
Dim newWb As Workbook
Set newWb = Workbooks.Add
' 데이터 복사 (값 붙여넣기)
ws.Range("A1").CurrentRegion.Copy
With newWb.Sheets(1).Range("A1")
.PasteSpecial xlPasteValues
Application.CutCopyMode = False
End With
' 새 통합 파일에서도 등록일자 열 서식 재적용
Dim newDateCol As Variant, newLastRow As Long
newLastRow = newWb.Sheets(1).Cells(newWb.Sheets(1).Rows.Count, 1).End(xlUp).Row
newDateCol = Application.Match("등록일자", newWb.Sheets(1).Rows(1), 0)
If Not IsError(newDateCol) And newLastRow >= 2 Then
With newWb.Sheets(1).Range(newWb.Sheets(1).Cells(2, CLng(newDateCol)), _
newWb.Sheets(1).Cells(newLastRow, CLng(newDateCol)))
.NumberFormat = "yyyy-mm-dd hh:mm"
End With
End If
' 저장
newWb.SaveAs folderPath & newFileName, FileFormat:=xlOpenXMLWorkbook
newWb.Close SaveChanges:=False
MsgBox "작업 완료!" & vbCrLf & _
"처리된 파일: " & processedFiles & "개" & vbCrLf & _
"총 행수: " & (lastRow - 1) & "행" & vbCrLf & _
"저장된 파일: " & newFileName, vbInformation
Else
MsgBox "처리할 데이터가 없습니다." & vbCrLf & _
"폴더 경로를 확인해주세요: " & vbCrLf & folderPath, vbExclamation
End If
GoTo CleanUp
ErrorHandler:
MsgBox "오류 발생: " & Err.Description & vbCrLf & _
"오류 번호: " & Err.Number & vbCrLf & _
"현재 처리 중인 파일: " & fileName, vbCritical
CleanUp:
' 정리
If Not sourceWb Is Nothing Then
sourceWb.Close SaveChanges:=False
Set sourceWb = Nothing
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
Application.StatusBar = False
End Sub
JavaScript
복사
◦
통합된 파일을 다시 월별로 나누기
Sub 월별_시트_분리_등록일자기준()
Const SOURCE_SHEET_NAME As String = "Sheet1" ' 통합 데이터가 있는 시트명
Dim wb As Workbook, wsSrc As Worksheet
Dim lastRow As Long, lastCol As Long
Dim dateCol As Variant
Dim i As Long, m As Long
Dim val As Variant
Dim wsMonth(1 To 12) As Worksheet
Dim nextRow(1 To 12) As Long
Dim hdr As Range
Dim altHeaders As Variant, h As Variant
On Error GoTo ErrH
Set wb = ThisWorkbook
' 소스 시트 참조 (없으면 ActiveSheet 사용)
If SheetExists(SOURCE_SHEET_NAME, wb) Then
Set wsSrc = wb.Worksheets(SOURCE_SHEET_NAME)
Else
Set wsSrc = ActiveSheet
End If
' 데이터 범위
lastRow = wsSrc.Cells(wsSrc.Rows.Count, 1).End(xlUp).Row
lastCol = wsSrc.Cells(1, wsSrc.Columns.Count).End(xlToLeft).Column
If lastRow < 2 Then
MsgBox "데이터가 없습니다(헤더만 존재).", vbExclamation
Exit Sub
End If
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
' 등록일자 열 찾기 (여러 후보 허용)
dateCol = Application.Match("등록일자", wsSrc.Rows(1), 0)
If IsError(dateCol) Then
altHeaders = Array("등록 일자", "측정일시", "일시", "Date", "날짜", "작성일자")
For Each h In altHeaders
dateCol = Application.Match(h, wsSrc.Rows(1), 0)
If Not IsError(dateCol) Then Exit For
Next h
End If
If IsError(dateCol) Then
MsgBox "헤더 행에서 '등록일자' 열을 찾을 수 없습니다." & vbCrLf & _
"헤더명을 확인하거나 코드의 대체 헤더 목록을 수정하세요.", vbCritical
GoTo Clean
End If
' 기존 월 시트 정리(있으면 삭제)
For m = 1 To 12
If SheetExists(CStr(m) & "월", wb) Then
wb.Worksheets(CStr(m) & "월").Delete
End If
Next m
' 월 시트 생성 + 헤더 복사
Set hdr = wsSrc.Range(wsSrc.Cells(1, 1), wsSrc.Cells(1, lastCol))
For m = 1 To 12
Set wsMonth(m) = wb.Worksheets.Add(After:=wsSrc)
wsMonth(m).Name = CStr(m) & "월"
hdr.Copy Destination:=wsMonth(m).Range("A1")
nextRow(m) = 2
Next m
' 본문 행을 월별로 분배
For i = 2 To lastRow
val = wsSrc.Cells(i, CLng(dateCol)).Value
' 날짜 판별 및 월 추출
If IsDate(val) Then
m = Month(CDate(val))
Else
' 표시문자(Text)로 들어온 경우에도 시도
val = wsSrc.Cells(i, CLng(dateCol)).Text
If IsDate(val) Then
m = Month(CDate(val))
Else
' 날짜 인식 안 되면 건너뜀(필요 시 로그 처리)
GoTo ContinueLoop
End If
End If
' 행 전체를 해당 월 시트에 복사(값 기준)
wsMonth(m).Cells(nextRow(m), 1).Resize(1, lastCol).Value = _
wsSrc.Cells(i, 1).Resize(1, lastCol).Value
nextRow(m) = nextRow(m) + 1
ContinueLoop:
Next i
' 서식 및 정리
For m = 1 To 12
With wsMonth(m)
' 등록일자 열 표시형식
On Error Resume Next
.Columns(CLng(dateCol)).NumberFormat = "yyyy-mm-dd hh:mm"
On Error GoTo 0
.Columns.AutoFit
End With
Next m
MsgBox "완료: 등록일자 기준으로 월별 시트를 생성했습니다." & vbCrLf & _
"원본 시트: " & wsSrc.Name, vbInformation
Clean:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
Exit Sub
ErrH:
MsgBox "오류: " & Err.Description, vbCritical
Resume Clean
End Sub
Private Function SheetExists(shtName As String, wb As Workbook) As Boolean
Dim sht As Worksheet
On Error Resume Next
Set sht = wb.Worksheets(shtName)
SheetExists = Not sht Is Nothing
On Error GoTo 0
End Function
JavaScript
복사
◦
1개의 파일을 시트별 나눠서 분배하기
Sub 월별_파일_분리_등록일자기준()
Const SOURCE_SHEET_NAME As String = "Sheet1" ' 통합 데이터 시트
Const DATE_HEADER As String = "등록일자" ' 기준 열 이름(헤더)
Const OUTPUT_PREFIX As String = "마포구 공기질현황_" ' 저장 파일 접두사
Const SPLIT_BY_YEAR As Boolean = False ' True: 연/월로 따로 저장, False: 월만 기준
Const CREATE_EMPTY_FILES As Boolean = False ' True: 해당 월 데이터 없어도 헤더만 파일 생성
Dim wb As Workbook, ws As Worksheet
Dim lastRow As Long, lastCol As Long
Dim dateCol As Variant, altHeaders As Variant, h As Variant
Dim i As Long, m As Long, yr As Long
Dim val As Variant
Dim basePath As String, outDir As String, saveName As String, key As String
Dim fso As Object
Dim dict As Object ' key: "m" 또는 "yyyy-m" → 새 워크북
Dim newWb As Workbook, newWs As Worksheet
Dim nextRow As Object ' key: 위와 동일 → 다음 행 번호(Long)
On Error GoTo ErrH
Set wb = ThisWorkbook
If SheetExists(SOURCE_SHEET_NAME, wb) Then
Set ws = wb.Worksheets(SOURCE_SHEET_NAME)
Else
Set ws = ActiveSheet
End If
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
If lastRow < 2 Then
MsgBox "데이터가 없습니다(헤더만 존재).", vbExclamation
Exit Sub
End If
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
' 등록일자 열 찾기
dateCol = Application.Match(DATE_HEADER, ws.Rows(1), 0)
If IsError(dateCol) Then
altHeaders = Array("등록 일자", "측정일시", "일시", "Date", "날짜", "작성일자")
For Each h In altHeaders
dateCol = Application.Match(h, ws.Rows(1), 0)
If Not IsError(dateCol) Then Exit For
Next h
End If
If IsError(dateCol) Then
MsgBox "헤더에서 '" & DATE_HEADER & "' 열을 찾지 못했습니다.", vbCritical
GoTo Clean
End If
' 출력 폴더 준비
basePath = wb.Path
If Len(basePath) = 0 Then basePath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
outDir = basePath & "\월별_분리_" & Format(Date, "yyyymmdd")
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(outDir) Then fso.CreateFolder outDir
' 월별 워크북/다음행 관리용 딕셔너리
Set dict = CreateObject("Scripting.Dictionary")
Set nextRow = CreateObject("Scripting.Dictionary")
' 헤더 범위(값)
Dim headerArr As Variant
headerArr = ws.Range(ws.Cells(1, 1), ws.Cells(1, lastCol)).Value
' 본문을 한 번만 순회하면서 해당 키(월 또는 연-월) 워크북에 누적
For i = 2 To lastRow
val = ws.Cells(i, CLng(dateCol)).Value
If Not IsDate(val) Then
val = ws.Cells(i, CLng(dateCol)).Text ' 텍스트일 수도 있어 재시도
End If
If IsDate(val) Then
m = Month(CDate(val))
yr = Year(CDate(val))
If SPLIT_BY_YEAR Then
key = CStr(yr) & "-" & CStr(m) ' 예: "2022-1"
Else
key = CStr(m) ' 예: "1"
End If
' 키용 워크북이 없으면 생성하여 헤더 세팅
If Not dict.Exists(key) Then
Set newWb = Workbooks.Add
Set newWs = newWb.Sheets(1)
newWs.Name = "데이터"
newWs.Range("A1").Resize(1, lastCol).Value = headerArr
' 등록일자 열 서식
On Error Resume Next
newWs.Columns(CLng(dateCol)).NumberFormat = "yyyy-mm-dd hh:mm"
On Error GoTo 0
dict.Add key, newWb
nextRow.Add key, 2
End If
' 행 복사(값만)
Set newWb = dict(key)
Set newWs = newWb.Sheets(1)
newWs.Cells(nextRow(key), 1).Resize(1, lastCol).Value = _
ws.Cells(i, 1).Resize(1, lastCol).Value
nextRow(key) = nextRow(key) + 1
End If
Next i
' 저장: 생성된 각 키에 대해 파일 만들기
Dim k As Variant, rowCnt As Long, mon As Long, yearPart As String
For Each k In dict.Keys
Set newWb = dict(k)
Set newWs = newWb.Sheets(1)
rowCnt = newWs.Cells(newWs.Rows.Count, 1).End(xlUp).Row - 1 ' 데이터 행 수(헤더 제외)
If rowCnt = 0 And Not CREATE_EMPTY_FILES Then
newWb.Close SaveChanges:=False
Else
' 파일명 결정
If SPLIT_BY_YEAR Then
yearPart = Split(CStr(k), "-")(0)
mon = CLng(Split(CStr(k), "-")(1))
saveName = OUTPUT_PREFIX & yearPart & "_" & mon & "월.xlsx"
Else
mon = CLng(k)
saveName = OUTPUT_PREFIX & mon & "월.xlsx"
End If
' 너비자동/날짜서식 보정
On Error Resume Next
newWs.Columns(CLng(dateCol)).NumberFormat = "yyyy-mm-dd hh:mm"
On Error GoTo 0
newWs.Columns.AutoFit
newWb.SaveAs Filename:=(outDir & "\" & saveName), _
FileFormat:=xlOpenXMLWorkbook
newWb.Close SaveChanges:=False
End If
Next k
MsgBox "완료: '" & outDir & "' 폴더에 월별 파일 저장이 끝났습니다.", vbInformation
Clean:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
Exit Sub
ErrH:
MsgBox "오류: " & Err.Description, vbCritical
Resume Clean
End Sub
Private Function SheetExists(shtName As String, wb As Workbook) As Boolean
Dim sht As Worksheet
On Error Resume Next
Set sht = wb.Worksheets(shtName)
SheetExists = Not sht Is Nothing
On Error GoTo 0
End Function
JavaScript
복사
실습 피벗테이블, 차트 자동화
•
기존에 내가 잘 활용하던 피벗테이블을 자동화하는 방법
◦
월별 평균 습도, 평균 학습능률지수 피벗테이블과 차트 만들기
피벗데이터 활용할때 먼저 기존 데이터를 표로 만들어주는것!
◦
프롬프트
엑셀 VBA로 다음 조건을 만족하는 전체 코드를 작성해줘.
1. "Sheet1" 시트에 이미 데이터가 있다고 가정할 때,
- 먼저 이 데이터를 표(ListObject)로 만들어줘.
- 표에는 '등록일자'라는 열이 있고, 이 등록일자를 기준으로 연-월("yyyy-mm") 형식의 값을 추가해서 "연월"이라는 새로운 열을 등록일자 열 오른쪽에 삽입해줘.
- 연월 열도 표 범위에 포함되게 해줘.
2. 이후 "피벗" 시트를 새로 생성해서,
- 첫 번째 피벗 테이블은 연월을 행 필드로, '습도(%)'를 평균값으로 계산해서 표시해줘.
- 두 번째 피벗 테이블은 연월을 행 필드로, '학습능률지수(%)'를 평균값으로 계산해서 표시해줘.
- 두 값 모두 소수점 둘째 자리까지 표시되도록 숫자 포맷("#,##0.00")을 설정해줘.
3. "피벗차트"라는 새 시트를 만들고, 다음과 같이 대시보드 스타일로 구성해줘:
- 배경은 흰색
- 왼쪽 상단에는 가로 480, 세로 250 크기의 직사각형을 그리고 그 위에 '연월별 평균 습도(%)'에 대한 **선형 차트(line chart)**를 넣어줘.
- 오른쪽 상단에도 같은 크기의 직사각형을 그리고 그 위에 '연월별 평균 학습능률지수(%)'에 대한 선형 차트를 넣어줘.
- 두 차트 모두 데이터 라벨을 차트 위에 표시되도록 해줘.
4. 처음부터 있던 "피벗" 시트와 "피벗차트" 시트가 이미 존재하면 삭제한 후 새로 생성해줘.
코드 실행 완료 시에는 "대시보드 완성!"이라는 메시지 박스를 보여줘.
JavaScript
복사
◦
코드
Sub 생성_피벗차트_대시보드()
Dim wsData As Worksheet
Dim wsPivot As Worksheet
Dim wsChart As Worksheet
Dim tbl As ListObject
Dim rngData As Range
Dim lastRow As Long, lastCol As Long
Dim pt1 As PivotTable, pt2 As PivotTable
Dim pc1 As PivotCache, pc2 As PivotCache
Dim chart1 As ChartObject, chart2 As ChartObject
Dim shp1 As Shape, shp2 As Shape
Dim pf1 As PivotField, pf2 As PivotField
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' 원본 시트
Set wsData = ThisWorkbook.Sheets("Sheet1")
' 기존 피벗/차트 시트 삭제
On Error Resume Next
ThisWorkbook.Sheets("피벗").Delete
ThisWorkbook.Sheets("피벗차트").Delete
On Error GoTo 0
' 기존 표 삭제
If wsData.ListObjects.Count > 0 Then
wsData.ListObjects(1).Unlist
End If
' 연월 열 추가 (등록일자 우측에 삽입)
lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
lastCol = wsData.Cells(1, Columns.Count).End(xlToLeft).Column
If wsData.Cells(1, lastCol).Value <> "연월" Then
wsData.Cells(1, lastCol + 1).Value = "연월"
wsData.Range(wsData.Cells(2, lastCol + 1), wsData.Cells(lastRow, lastCol + 1)).FormulaR1C1 = "=TEXT(RC[-1],""yyyy-mm"")"
End If
' 표 생성
Set rngData = wsData.Range(wsData.Cells(1, 1), wsData.Cells(lastRow, lastCol + 1))
Set tbl = wsData.ListObjects.Add(xlSrcRange, rngData, , xlYes)
tbl.Name = "데이터표"
' 피벗 시트 생성
Set wsPivot = ThisWorkbook.Sheets.Add(After:=wsData)
wsPivot.Name = "피벗"
' 피벗1 - 평균 습도(%)
Set pc1 = ThisWorkbook.PivotCaches.Create(xlDatabase, tbl.Range)
Set pt1 = pc1.CreatePivotTable(wsPivot.Range("A3"), "피벗습도")
With pt1
.PivotFields("연월").Orientation = xlRowField
Set pf1 = .AddDataField(.PivotFields("습도(%)"), "평균 습도", xlAverage)
pf1.NumberFormat = "#,##0.00"
End With
' 피벗2 - 평균 학습능률지수(%)
Set pc2 = ThisWorkbook.PivotCaches.Create(xlDatabase, tbl.Range)
Set pt2 = pc2.CreatePivotTable(wsPivot.Range("F3"), "피벗학습")
With pt2
.PivotFields("연월").Orientation = xlRowField
Set pf2 = .AddDataField(.PivotFields("학습능률지수(%)"), "평균 학습능률", xlAverage)
pf2.NumberFormat = "#,##0.00"
End With
' 차트 시트 생성
Set wsChart = ThisWorkbook.Sheets.Add(After:=wsPivot)
wsChart.Name = "피벗차트"
wsChart.Cells.Interior.Color = RGB(255, 255, 255)
' 대시보드 직사각형 2개
Set shp1 = wsChart.Shapes.AddShape(msoShapeRectangle, 30, 50, 480, 250)
shp1.Fill.ForeColor.RGB = RGB(230, 230, 230)
shp1.Name = "Chart1"
Set shp2 = wsChart.Shapes.AddShape(msoShapeRectangle, 540, 50, 480, 250)
shp2.Fill.ForeColor.RGB = RGB(230, 230, 230)
shp2.Name = "Chart2"
' 차트1 - 평균 습도 (선형 + 라벨)
Set chart1 = wsChart.ChartObjects.Add(Left:=shp1.Left + 10, Width:=shp1.Width - 20, _
Top:=shp1.Top + 10, Height:=shp1.Height - 20)
With chart1.Chart
.SetSourceData pt1.TableRange1
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Text = "연월별 평균 습도(%)"
.SeriesCollection(1).HasDataLabels = True
End With
' 차트2 - 평균 학습능률지수 (선형 + 라벨)
Set chart2 = wsChart.ChartObjects.Add(Left:=shp2.Left + 10, Width:=shp2.Width - 20, _
Top:=shp2.Top + 10, Height:=shp2.Height - 20)
With chart2.Chart
.SetSourceData pt2.TableRange1
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Text = "연월별 평균 학습능률지수(%)"
.SeriesCollection(1).HasDataLabels = True
End With
MsgBox "대시보드 완성! (선그래프 + 소수점 포맷)", vbInformation
Application.ScreenUpdating = True
End Sub
JavaScript
복사
응용버전 : 대시보드 자동화 하기
🧭 목적
가맹점 현황을 시각적으로 파악할 수 있는 대시보드를 생성하는 것이 목표입니다.
✅ 요청사항
두 개의 데이터를 기반으로, 먼저 각 데이터의 구조를 분석하고,
아래의 # 데이터 구조를 참고하여 데이터를 읽은 후,
해당 데이터를 가장 잘 설명할 수 있는 피벗 테이블과 차트 구성안을 총 8세트 제안해주세요.
각 제안은 다음 항목을 포함해야 합니다:
제안 이유: 이 분석이 왜 중요한지
피벗 테이블 구성: 행(Row), 열(Column), 값(Value), 필터(Filter) 등 정의
추천 차트 유형: 막대형, 선형, 원형, 누적형 등
활용 예시 또는 해석 포인트
📌 추가사항
실제 Excel 또는 Google Sheets 기반으로 구현 가능한 수준으로 제안
중복 없이 다양한 관점의 시각화 구성
비교, 추이, 비율, 분포, 랭킹 등 다양한 인사이트 도출이 가능하도록 제안
⬇️ 참고 데이터
# 데이터 구조는 아래에 첨부되어 있다고 가정합니다.
JavaScript
복사
나만의 에이전트 봇 만들기
Google notebook LM으로 챗봇 만들기
회의 내용을 활용하기
[참고] 전세자금보증상품 추천서비스 오픈API 활용 프로토타입 서비스 제작 하기
일잘러될 수 있는 추가 정보
꿀팁! 이미지 생성 AI 활용하기
이미지 생성 프롬프트 작성 정리!
노코드 프로그램으로 일잘러되기
일잘러 업그레이드 툴
랜딩페이지 역량 업그레이드 툴 : Framer, Dora
브레인스토밍 쉽게 구조화 & 기획 초안 작성하기
•
PPT 초안 만들기
세일즈 보다 스마트 하게 하기
크롬 확장 프로그램으로 업무 비서 만들기 : Sider로 유튜브 요약 등
디지털 리터러시를 위한 학습 꿀 정보 공유 : 퍼블리, 폴인, 추천 뉴스레터 등
Copyright ⓒ 위드로우비즈니스 유민균 All rights reserved.