Search
Duplicate

‘챗GPT와 업무자동화 도서’ review

목차(클릭하세요)
한줄평: 중수이상은 내돈내산 비추천, 초보들에게는 내돈내산 할만함

1. 내돈내산 review

1-1. 인증

1-2.리뷰 한줄평

목차는 매력적이나 책을 풀어가는 방식은 기대만큼 매력적이 않아 아쉬움이 남음.
공감갔던 리뷰

2. 의미있던 부분??

2-1. VBA에 대한 기초적인 내용

1.
여러 엑셀파일을 하나로 다루는 기능을 구현하고자 할때
2.
[프롬프트 예시] 어떤 폴더에 엑셀파일이 여러개 있다. 이파일을 하나씩 열어서 첫번째 시트에 있는 내용을 복사해서 하나로 합치는 VBA코드 만들어줘]
Sub MergeFirstSheetFromAllExcelFiles() ' 1. 변수 선언 Dim FolderPath As String Dim FileName As String Dim SourceWorkbook As Workbook Dim TargetWorkbook As Workbook Dim SourceWorksheet As Worksheet Dim TargetWorksheet As Worksheet Dim LastRow As Long Dim PasteRow As Long Dim FileDialog As FileDialog ' 2. 폴더 선택 대화상자 Set FileDialog = Application.FileDialog(msoFileDialogFolderPicker) If FileDialog.Show <> -1 Then MsgBox "폴더가 선택되지 않았습니다.", vbExclamation Exit Sub End If FolderPath = FileDialog.SelectedItems(1) & "\" ' 3. 대상 통합 문서 설정 Set TargetWorkbook = ThisWorkbook ' 4. 기존 시트가 있으면 삭제하고 새로 생성 On Error Resume Next Application.DisplayAlerts = False TargetWorkbook.Sheets("MergedData").Delete Application.DisplayAlerts = True On Error GoTo 0 Set TargetWorksheet = TargetWorkbook.Sheets.Add TargetWorksheet.Name = "MergedData" PasteRow = 1 ' 5. 폴더 내 모든 엑셀 파일 반복 FileName = Dir(FolderPath & "*.xlsx") Do While FileName <> "" ' 다른 통합 문서 열기 Set SourceWorkbook = Workbooks.Open(FolderPath & FileName, ReadOnly:=True) ' 첫 번째 워크시트 가져오기 Set SourceWorksheet = SourceWorkbook.Sheets(1) ' 복사할 마지막 행과 열 확인 LastRow = SourceWorksheet.Cells(SourceWorksheet.Rows.Count, 1).End(xlUp).Row LastCol = SourceWorksheet.Cells(1, SourceWorksheet.Columns.Count).End(xlToLeft).Column ' 데이터 복사 → 대상 워크시트에 붙여넣기 SourceWorksheet.Range(SourceWorksheet.Cells(1, 1), SourceWorksheet.Cells(LastRow, LastCol)).Copy TargetWorksheet.Cells(PasteRow, 1).PasteSpecial Paste:=xlPasteValues ' 다음 붙여넣기 위치 계산 PasteRow = TargetWorksheet.Cells(TargetWorksheet.Rows.Count, 1).End(xlUp).Row + 1 ' 원본 문서 닫기 SourceWorkbook.Close SaveChanges:=False ' 다음 파일로 이동 FileName = Dir Loop ' 마무리 Application.CutCopyMode = False MsgBox "모든 파일의 첫 시트 내용이 병합되었습니다.", vbInformation End Sub
Visual Basic
복사

2-2.설정 변경 필수

런타임 오류가 발생한다면?
- VBA편집기 도구-참조 클릭후 ‘Microsoft Scripting Runtime’을 활성화
마이크로소프트 스크립팅 런타임(Microsoft Scripting Runtime)": VBA에서 파일 시스템이나 딕셔너리 객체 등을 다룰 때 사용하는 외부 참조 라이브러리
특히 FileSystemObject를 통해 파일, 폴더, 드라이브 등을 탐색하고 조작할 수 있도록 지원함.
이렇게 VBA는 개인PC의 파일을 얼마든지 다루고, 임의로 수정할 수 있기에, 매크로를 포함한 파일을 저장하면 다른 사람의 PC파일을 손상시킬 수 있는 등 예기치 못한 문제가 발생할 수 있음 아하, 그래서 매크로 실행전 항상 경고표시가 나오는군!!

3. 웹 페이지에서 데이터시각화하기(D3)

3-1. D3란?

1.
GPT 답변
데이터를 기반으로 동적인 시각화(그래프, 차트 등)를 만들기 위한 자바스크립트 라이브러리
웹 브라우저에서 SVG, HTML, CSS를 직접 제어하여 복잡하고 상호작용이 풍부한 시각화를 구현할 수 있게 해줌
<!DOCTYPE html> <html> <head> <script src="https://d3js.org/d3.v7.min.js"></script> </head> <body> <svg width="400" height="100"></svg> <script> // 간단한 막대그래프 예제 const dataset = [10, 30, 50]; d3.select("svg") .selectAll("rect") .data(dataset) .enter() .append("rect") .attr("x", (d, i) => i * 60) .attr("y", d => 100 - d) .attr("width", 50) .attr("height", d => d) .attr("fill", "steelblue"); </script> </body> </html>
JavaScript
복사
2.
특이점: SVG방식이라 화면 크기에 상관없이 깔끔한 이미지 제공 가능

3-2.D3로 레이싱차트가 포함된 웹 페이지 만들어보기

1.
실습의 이유: 엑셀에서는 동적인 차트 생성이 불가능
2.
프롬프트 예시: d3.js를 이용해서 bar chart race를 구현하고자 한다. 샘플 html문서를 하나 만들어줘. 외부 스크립트 참조가 아니라 내부에 구현해봐
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>D3.js Bar Chart Race</title> <style> body { font-family: sans-serif; } svg { background-color: #f5f5f5; } .bar { fill: steelblue; } .label { font-size: 12px; fill: black; } .value { fill: black; font-size: 12px; text-anchor: end; } </style> </head> <body> <h2>Bar Chart Race (D3.js Embedded)</h2> <svg width="800" height="400"></svg> <script> // D3.js Core Code (v7 minimal internal) const d3 = { select: (...args) => window.d3.select(...args), scaleLinear: window.d3.scaleLinear, scaleBand: window.d3.scaleBand, max: window.d3.max, axisLeft: window.d3.axisLeft, axisBottom: window.d3.axisBottom, transition: window.d3.transition }; // 샘플 데이터: 연도별 카테고리별 값 const dataset = [ { year: 2020, data: { A: 30, B: 80, C: 45, D: 60 } }, { year: 2021, data: { A: 50, B: 70, C: 60, D: 80 } }, { year: 2022, data: { A: 90, B: 50, C: 70, D: 65 } }, { year: 2023, data: { A: 100, B: 60, C: 85, D: 45 } }, { year: 2024, data: { A: 110, B: 75, C: 90, D: 55 } } ]; const svg = d3.select("svg"); const width = +svg.attr("width"); const height = +svg.attr("height"); const margin = { top: 20, right: 100, bottom: 30, left: 100 }; const chartWidth = width - margin.left - margin.right; const chartHeight = height - margin.top - margin.bottom; const chart = svg.append("g") .attr("transform", `translate(${margin.left},${margin.top})`); const x = d3.scaleLinear().range([0, chartWidth]); const y = d3.scaleBand().range([0, chartHeight]).padding(0.1); const yearLabel = svg.append("text") .attr("x", width - 150) .attr("y", height - 30) .attr("font-size", 24) .attr("fill", "#999"); function render(dataObj) { const data = Object.entries(dataObj.data) .map(([key, value]) => ({ name: key, value })) .sort((a, b) => b.value - a.value); x.domain([0, d3.max(data, d => d.value)]); y.domain(data.map(d => d.name)); // BAR const bars = chart.selectAll(".bar") .data(data, d => d.name); bars.enter() .append("rect") .attr("class", "bar") .attr("x", 0) .attr("y", d => y(d.name)) .attr("height", y.bandwidth()) .attr("width", d => x(d.value)) .merge(bars) .transition().duration(1000) .attr("y", d => y(d.name)) .attr("width", d => x(d.value)); bars.exit().remove(); // LABEL const labels = chart.selectAll(".label") .data(data, d => d.name); labels.enter() .append("text") .attr("class", "label") .attr("x", -5) .attr("y", d => y(d.name) + y.bandwidth() / 2 + 4) .attr("text-anchor", "end") .text(d => d.name) .merge(labels) .transition().duration(1000) .attr("y", d => y(d.name) + y.bandwidth() / 2 + 4); labels.exit().remove(); // VALUE const values = chart.selectAll(".value") .data(data, d => d.name); values.enter() .append("text") .attr("class", "value") .attr("x", d => x(d.value) - 10) .attr("y", d => y(d.name) + y.bandwidth() / 2 + 4) .text(d => d.value) .merge(values) .transition().duration(1000) .attr("x", d => x(d.value) - 10) .attr("y", d => y(d.name) + y.bandwidth() / 2 + 4) .text(d => d.value); values.exit().remove(); // 연도 갱신 yearLabel.text(dataObj.year); } // 애니메이션 실행 let i = 0; render(dataset[i]); setInterval(() => { i = (i + 1) % dataset.length; render(dataset[i]); }, 2000); </script> <!-- D3 v7 전체 내장 (단순한 구현을 위해 window.d3로 참조함) --> <script src="https://d3js.org/d3.v7.min.js" onload=" window.d3 = d3; "></script> </body> </html>
JavaScript
복사