1
2
3
1
2
3
1
2
3
Alt + F8 : 매크로의 메뉴의 실행
Alt + F11 : Visual Basic 편집기를 기동한다
Alt + F11 : Excel을 기동한다
Alt + Q : 종료하고 Excle로 돌아간다
Ctrl + → : 오른쪽 단어로 이동한다
Ctrl + ← : 왼쪽 단어로 이동한다
Ctrl + ↑ : 앞 프로시저
Ctrl + ↓ : 다음 프로시저
Ctrl + A : 모두 선택
Ctrl + Alt + A : 입력 후보
Ctrl + Break : 중단
Ctrl + Delete : 단어의 끝까지 삭제한다
Ctrl + E : 파일의 내보내기
Ctrl + End : 모듈의 끝으로 이동한다
Ctrl + F : 찾기(검색)
Ctrl + F2 : 북 마크를 바꾸다
Ctrl + F8 : 커서의 앞까지 실행
Ctrl + H : 이미디에이트 윈도
Ctrl + G : 교체
Ctrl + Home : 모듈의 처음으로 이동한다
Ctrl + I : 퀵 세트
Ctrl + J : 속성/메서드의 일람
Ctrl + N : 파일 가져오기
Ctrl + P : 인쇄
Ctrl + PgDn : 한 화면 아래로
Ctrl + PgUp : 한 화면 위로
Ctrl + Q : 반복한다
Ctrl + R : 프로젝트 탐색기
Ctrl + S : 저장
Ctrl+Shift+F2 : 원래의 위치로 이동
Ctrl+Shift+F9 : 모든 브레이크 포인트 해체
Ctrl+Shift+F8 : 스텝 아웃
Ctrl+Shift+I : 피라미터 힌트
Ctrl+Shift+J : 상수의 일람
Ctrl+Spacebar : 입력 후보
Ctrl + V : 붙이기
Ctrl + W : 조사식의 편집
Ctrl + Y : 현재 행을 삭제한다
Ctrl + Z : 원래대로 돌아간다
Dim 변수이름 As 데이터 형식
Sub 처음만드는SUB프로시저()
Dim 변수1 As String
변수1 = "홍길동"
MsgBox "안녕하세요? " & 변수1 & "님"
MsgBox "안녕하세요? " + 변수1 + "님"
End Sub
Sub variableFirstDemo()
Dim 변수1 As Long
Dim 변수2 As String
Dim 변수3 As String
변수1 = 20
변수2 = "홍길동"
변수3 = 변수2 & "님의 나이는 " & 변수1 & "세 입니다"
MsgBox 변수3
End Sub
Sub variableSecondDemo()
Dim 변수1 As Long
변수1 = 20
Dim 변수2 As String
변수2 = "홍길동"
Dim 변수3 As String
변수3 = 변수2 & "님의 나이는 " & 변수1 & "세 입니다"
MsgBox 변수3
End Sub
Sub 상수예제()
Const 상수1 As String = "홍길동"
MsgBox "안녕하세요? " & 상수1 & "님"
End Sub
Sub 상수미사용()
원주 = 3.141592654 * 10 * 2
원넓이 = 3.141592654 * 10 * 10
End Sub
Sub 상수사용()
Const 파이 As Double = 3.141592654
원주 = 파이 * 10 * 2
원넓이 = 파이 * 10 * 10
End Sub
Sub 상수사용()
Const 파이 As Double = 3.141592654
원주 = 파이 * 10 * 2
원넓이 = 파이 * 10 * 10
파이 = 3.14
End Sub
Public Const 파이 As Double = 3.141592654
Sub 상수사용()
Dim 원주 As Double
Dim 원넓이 As Double
원주 = 파이 * 10 * 2
원넓이 = 파이 * 10 * 10
End Sub
'전역변수/Const가 붙으면 전역상수
Public 파이 As Double
Sub 상수사용3()
'파이 = 3.14
Debug.Print "상수사용3"
Debug.Print 파이
End Sub
Sub 상수사용4()
파이 = 3.14
Debug.Print "상수사용4"
Debug.Print 파이
End Sub
Sub letDemo()
ActiveCell.Value = "안녕하세요?"
Let ActiveCell.Value = "안녕하세요?"
End Sub
```vba
Dim wb As Workbook
Set wb = Workbooks("Book1.xlsx")
Dim wb As Workbook
Dim sht As WorkSheet
Set wb = Workbooks("Book1.xlsx")
Set sht = wb.Sheets("Sheet1")
Dim wb As Workbook
Dim sht As WorkSheet
Dim rngDb As Range
Set wb = Workbooks("Book1.xlsx")
Set sht = wb.Sheets("Sheet1")
Set rngDb = sht.Range("A1:A10")
Set wb = Nothing
Set sht = Nothing
Set rngDb = Nothing
Sub SetExample()
' Worksheet 객체를 변수에 할당
' 여기서 우리는 'Sheet1'과 'Sheet2'를 선택해서 ws와 ws2라는 변수에 저장할 거예요.
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim ws2 As Worksheet
Set ws2 = ThisWorkbook.Sheets("Sheet2")
' 변수 ws를 사용하여 셀 A1의 값을 변경
' ws는 'Sheet1'을 가리키니까, 'Sheet1'의 A1 셀에 "Hello, World!"라고 쓸 거예요.
ws.Range("A1").Value = "Hello, World!"
' 다른 셀의 값을 변경
' 이번에는 'Sheet1'의 B1 셀에 "VBA Set Example"이라고 쓸 거예요.
ws.Range("B1").Value = "VBA Set Example"
' 변수 ws2를 사용하여 셀 A1의 값을 변경
' ws2는 'Sheet2'를 가리키니까, 'Sheet2'의 A1 셀에 "Hello, World!"라고 쓸 거예요.
ws2.Range("A1").Value = "Hello, World!"
' 다른 셀의 값을 변경
' 이번에는 'Sheet2'의 B1 셀에 "VBA Set Example"이라고 쓸 거예요.
ws2.Range("B1").Value = "VBA Set Example"
' 객체 해제 (Optional, 권장)
' 마지막으로, 우리가 사용한 ws와 ws2를 더 이상 사용하지 않겠다고 선언하는 거예요.
Set ws = Nothing
Set ws2 = Nothing
End Sub
# VBA 조건문 예제
## 1. If-Then 구문 (단일 조건 처리)
Sub IfThenExample()
Dim number As Integer
number = 10
If number > 5 Then
MsgBox "숫자가 5보다 큽니다."
End If
End Sub
Sub IfThenElseExample()
Dim score As Integer
score = 75
If score >= 60 Then
MsgBox "합격입니다."
Else
MsgBox "불합격입니다."
End If
End Sub
Sub ElseIfExample()
Dim grade As String
grade = "B"
If grade = "A" Then
MsgBox "우수한 성적입니다."
ElseIf grade = "B" Then
MsgBox "좋은 성적입니다."
ElseIf grade = "C" Then
MsgBox "평균적인 성적입니다."
Else
MsgBox "노력이 필요합니다."
End If
End Sub
Sub 성적평가()
Dim 점수 As Integer
Dim 등급 As String
점수 = CInt(InputBox("점수를 입력하세요 (0-100):"))
Select Case 점수
Case 90 To 100
등급 = "A"
Case 80 To 89
등급 = "B"
Case 70 To 79
등급 = "C"
Case 60 To 69
등급 = "D"
Case Else
등급 = "F"
End Select
MsgBox "당신의 등급은 " & 등급 & "입니다."
End Sub
Sub 요일메시지()
Dim 요일 As Integer
Dim 메시지 As String
요일 = Weekday(Date)
Select Case 요일
Case 1
메시지 = "일요일입니다. 편안한 주말 보내세요."
Case 2 To 6
메시지 = "평일입니다. 열심히 일하세요!"
Case 7
메시지 = "토요일입니다. 즐거운 주말 되세요."
End Select
MsgBox 메시지
End Sub
Sub 계절확인()
Dim 월 As Integer
Dim 계절 As String
월 = Month(Date)
Select Case 월
Case 3 To 5
계절 = "봄"
Case 6 To 8
계절 = "여름"
Case 9 To 11
계절 = "가을"
Case Else
계절 = "겨울"
End Select
MsgBox "현재 계절은 " & 계절 & "입니다."
End Sub
# VBA 반복문 예제
## 1. For Next 루프 (지정된 횟수만큼 반복)
```vba
Sub ForNextExample()
Dim i As Integer
For i = 1 To 5
Debug.Print "반복 횟수: " & i
Next i
' 결과:
' 반복 횟수: 1
' 반복 횟수: 2
' 반복 횟수: 3
' 반복 횟수: 4
' 반복 횟수: 5
End Sub
Sub DoWhileExample()
Dim counter As Integer
counter = 1
Do While counter <= 5
Debug.Print "현재 카운터: " & counter
counter = counter + 1
Loop
' 결과:
' 현재 카운터: 1
' 현재 카운터: 2
' 현재 카운터: 3
' 현재 카운터: 4
' 현재 카운터: 5
End Sub
Sub ProcessCells()
' 셀을 가리키는 변수 cell을 선언합니다.
Dim cell As Range
' 합계를 저장할 변수를 선언합니다. 초기값은 0입니다.
Dim total As Double
' A1부터 A10까지의 범위 내 각 셀을 순회하며 합계를 계산합니다.
For Each cell In Range("A1:A10")
' 셀의 값이 숫자인지 확인합니다.
If IsNumeric(cell.Value) Then
' 셀의 값이 숫자라면, total에 그 값을 더합니다.
total = total + cell.Value
End If
Next cell
' 계산된 합계를 메시지 박스로 보여줍니다.
MsgBox "A1:A10 범위의 숫자 합계: " & total
End Sub
Sub MsgBoxExample()
Dim result As VbMsgBoxResult
' 기본 메시지 박스
MsgBox "안녕하세요, VBA 입니다!"
' 제목이 있는 메시지 박스
MsgBox "작업이 완료되었습니다.", vbInformation, "작업 완료"
' 선택 옵션이 있는 메시지 박스
result = MsgBox("계속하시겠습니까?", vbYesNo + vbQuestion, "확인")
If result = vbYes Then
MsgBox "예를 선택하셨습니다."
Else
MsgBox "아니오를 선택하셨습니다."
End If
End Sub
Sub InputBoxExample()
Dim userInput As String
' 기본 입력 박스
userInput = InputBox("이름을 입력하세요:")
If userInput <> "" Then
MsgBox "안녕하세요, " & userInput & "님!"
Else
MsgBox "이름을 입력하지 않으셨습니다."
End If
End Sub
Sub ProcessUserInput()
Dim age As Integer
Dim inputStr As String
' 사용자로부터 나이 입력 받기
inputStr = InputBox("나이를 입력하세요:", "나이 입력")
' 입력값이 숫자인지 확인
If IsNumeric(inputStr) Then
age = CInt(inputStr) ' 문자열을 정수로 변환
' 나이에 따른 메시지 출력
If age < 20 Then
MsgBox "당신은 청소년입니다.", vbInformation, "나이 확인"
ElseIf age >= 20 And age < 60 Then
MsgBox "당신은 성인입니다.", vbInformation, "나이 확인"
Else
MsgBox "당신은 어르신입니다.", vbInformation, "나이 확인"
End If
Else
MsgBox "올바른 나이를 입력하지 않았습니다.", vbExclamation, "오류"
End If
End Sub
1
2
3
1
2
3
Sub RangeExample()
' 단일 셀 참조
Range("A1").Value = "Hello"
' 여러 셀 범위 참조
Range("B1:B5").Value = 10
' 비연속 범위 참조
Range("A1,C3,E5").Interior.Color = vbYellow
' 전체 행 또는 열 참조
Range("A:A").Font.Bold = True
Range("1:1").Font.Italic = True
' 수식 사용
Range("D1").Formula = "=SUM(B1:B5)"
End Sub
Sub CellsExample()
Dim i As Integer
' 개별 셀 참조 (행, 열)
Cells(1, 1).Value = "ID"
Cells(1, 2).Value = "Name"
' 루프를 사용한 셀 채우기
For i = 2 To 10
Cells(i, 1).Value = i - 1 ' ID
Cells(i, 2).Value = "Person " & (i - 1) ' Name
Next i
' Cells와 Range 조합
Range(Cells(1, 1), Cells(10, 2)).Borders.LineStyle = xlContinuous
End Sub
Sub SimpleWorksheetsExample()
' 1. 새 워크시트 추가하기
Worksheets.Add
MsgBox "새 워크시트가 추가되었습니다."
' 2. 워크시트 이름 변경하기
ActiveSheet.Name = "내 첫 번째 시트"
MsgBox "새 워크시트의 이름이 '내 첫 번째 시트'로 변경되었습니다."
' 3. 특정 워크시트 선택하기
Worksheets("Sheet1").Select
MsgBox "Sheet1이 선택되었습니다."
' 4. 선택된 워크시트에 데이터 입력하기
Range("A1").Value = "안녕하세요!"
Range("A2").Value = "VBA 배우기"
MsgBox "A1과 A2 셀에 텍스트가 입력되었습니다."
' 5. 모든 워크시트 이름 보여주기
Dim sheetNames As String
Dim ws As Worksheet
For Each ws In Worksheets
sheetNames = sheetNames & ws.Name & vbNewLine
Next ws
MsgBox "현재 워크북의 모든 워크시트:" & vbNewLine & sheetNames
' 6. 마지막 워크시트 선택하기
Worksheets(Worksheets.Count).Select
MsgBox "마지막 워크시트가 선택되었습니다."
End Sub
1
2
3
Function 덧셈(a As Integer, b As Integer) As Integer
덧셈 = a + b
End Function
Function 인사말(이름 As String) As String
인사말 = "안녕하세요, " & 이름 & "님!"
End Function
Function 원의넓이(반지름 As Double) As Double
원의넓이 = 3.14 * 반지름 * 반지름
End Function
Function 합격여부(점수 As Integer) As String
If 점수 >= 60 Then
합격여부 = "합격"
Else
합격여부 = "불합격"
End If
End Function
Sub 함수테스트()
' 덧셈 함수 테스트
MsgBox "5 + 3 = " & 덧셈(5, 3)
' 인사말 함수 테스트
MsgBox 인사말("홍길동")
' 원의넓이 함수 테스트
MsgBox "반지름이 5인 원의 넓이: " & Round(원의넓이(5), 2) & " 제곱단위"
' 합격여부 함수 테스트
MsgBox "75점은 " & 합격여부(75)
MsgBox "45점은 " & 합격여부(45)
End Sub
1
2
3
Sub 간단한오류무시()
On Error Resume Next
Dim 결과 As Integer
결과 = 10 / 0 ' 0으로 나누기 오류
If Err.Number <> 0 Then
MsgBox "오류 발생: " & Err.Description
Else
MsgBox "결과: " & 결과
End If
End Sub
Sub 오류시이동()
On Error GoTo 오류처리
Dim 숫자 As Integer
숫자 = CInt("ABC") ' 문자를 숫자로 변환 시도
MsgBox "변환 성공: " & 숫자
Exit Sub
오류처리:
MsgBox "숫자 변환 실패!"
End Sub
Sub 시트접근오류()
On Error Resume Next
Dim 시트 As Worksheet
Set 시트 = ThisWorkbook.Sheets("존재하지않는시트")
If 시트 Is Nothing Then
MsgBox "시트를 찾을 수 없습니다."
Else
MsgBox "시트를 찾았습니다."
End If
End Sub
Sub 사용자정의오류()
On Error GoTo 오류처리
Dim 나이 As Integer
나이 = InputBox("나이를 입력하세요:")
If 나이 < 0 Then
Err.Raise Number:=1000, Description:="나이는 음수일 수 없습니다."
End If
MsgBox "입력한 나이: " & 나이
Exit Sub
오류처리:
MsgBox "오류 발생: " & Err.Description
End Sub
Sub ExcelFunctionsInVBA()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
' SUM 함수 사용
Dim total As Double
total = Application.WorksheetFunction.Sum(ws.Range("A1:A10"))
' AVERAGE 함수 사용
Dim avg As Double
avg = Application.WorksheetFunction.Average(ws.Range("B1:B10"))
' VLOOKUP 함수 사용
Dim lookupValue As Variant
lookupValue = Application.WorksheetFunction.VLookup("Cherry", ws.Range("D1:E5"), 2, False)
' 결과 출력
MsgBox "A열 합계: " & total & vbNewLine & _
"B열 평균: " & avg & vbNewLine & _
"Cherry의 색상: " & lookupValue
End Sub
SUM
함수: A1부터 A10까지의 숫자를 모두 더합니다. (예상 결과: 325)AVERAGE
함수: B1부터 B10까지 숫자의 평균을 계산합니다. (예상 결과: 42.5)VLOOKUP
함수: D1:E5 범위에서 "Cherry"를 찾아 해당 행의 두 번째 열(E열) 값을 반환합니다. (예상 결과: "보라")A열 합계: 325
B열 평균: 42.5
Cherry의 색상: 보라
1
2
3
{}
로 묶인 키/값 쌍의 모음.[]
로 묶인 값의 순서 있는 목록.true
, false
, 또는 null
일 수 있습니다.{
"name": "John",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zipcode": "10001"
}
}
JSON.parse()
: JSON 문자열을 JavaScript 객체로 변환.JSON.stringify()
: JavaScript 객체를 JSON 문자열로 변환.const jsonString = '{"name": "John", "age": 30}';
const jsonObject = JSON.parse(jsonString);
console.log(jsonObject.name); // 출력: John
Option Explicit
' API 키와 URL을 상수로 정의
Private Const API_KEY As String = "APIKEY 입력" '<= APIKEY 입력
Private Const API_URL As String = "https://api.openai.com/v1/chat/completions"
Private Const DEFAULT_MODEL As String = "gpt-3.5-turbo"
Private Const DEFAULT_MAX_TOKENS As Long = 2000
Public Function CallGPT(prompt As String, Optional temperature As Double = 0, Optional maxTokens As Long = DEFAULT_MAX_TOKENS) As String
On Error GoTo ErrorHandler
If Trim(prompt) = "" Then
CallGPT = ""
Exit Function
End If
Dim headers As Variant
headers = Array( _
Array("Content-Type", "application/json"), _
Array("Authorization", "Bearer " & API_KEY) _
)
Dim requestBody As String
requestBody = CreateRequestBody(prompt, temperature, maxTokens)
Dim response As String
response = SendHttpRequest(API_URL, requestBody, headers, "POST")
If InStr(1, response, """error"":") = 0 Then
Dim convertedText As String
convertedText = ExtractContentFromJSON(response)
' JSON 이스케이프 문자 처리
convertedText = Replace(convertedText, "\""", """") ' 큰따옴표
convertedText = Replace(convertedText, "\n", vbNewLine) ' 줄바꿈
convertedText = Replace(convertedText, "\r", vbNewLine) ' 캐리지 리턴
convertedText = Replace(convertedText, "\t", vbTab) ' 탭
convertedText = Replace(convertedText, "\/", "/") ' 슬래시
'Debug.Print "convertedText: " & convertedText
CallGPT = convertedText
Else
CallGPT = "#Error: " & ExtractErrorMessage(response)
End If
Exit Function
ErrorHandler:
CallGPT = "#Error: " & Err.Description
End Function
' 셀 서식을 지정하는 별도의 서브루틴
Public Sub FormatGPTResultCell(cell As Range)
With cell
.Font.Italic = True
.Font.Size = 10
.WrapText = True ' 텍스트 줄바꿈 설정
End With
' AutoFit 적용
cell.EntireRow.AutoFit
cell.EntireColumn.AutoFit
End Sub
Public Function CallGPTList(prompt As String, Optional temperature As Double = 0, Optional maxTokens As Long = DEFAULT_MAX_TOKENS) As Variant
Dim response As String
Dim lines() As String
Dim result() As Variant
Dim i As Long
' CallGPT 함수를 사용하여 응답 얻기
response = CallGPT(prompt, temperature, maxTokens)
' 응답을 줄 단위로 분리
lines = Split(response, vbLf)
' 결과 배열 크기 설정
ReDim result(1 To UBound(lines) + 1, 1 To 1)
' 각 줄을 배열에 입력
For i = LBound(lines) To UBound(lines)
result(i + 1, 1) = Trim(lines(i))
Next i
' 결과 반환
CallGPTList = result
End Function
' HTTP 요청을 보내는 함수
Private Function SendHttpRequest(url As String, body As String, headers As Variant, method As String) As String
Dim http As Object
Set http = CreateObject("MSXML2.ServerXMLHTTP")
http.Open method, url, False
Dim header As Variant
For Each header In headers
http.setRequestHeader header(0), header(1)
Next header
http.send body
SendHttpRequest = http.responseText
End Function
' 요청 본문(JSON) 생성 함수
Private Function CreateRequestBody(prompt As String, temperature As Double, maxTokens As Long) As String
prompt = Replace(Replace(Replace(Replace(prompt, Chr(10), "\n"), Chr(13), "\n"), Chr(9), "\t"), """", "\""")
CreateRequestBody = "{"
CreateRequestBody = CreateRequestBody & """model"": """ & DEFAULT_MODEL & """, "
CreateRequestBody = CreateRequestBody & """messages"": [{""role"": ""user"", ""content"": """ & prompt & """}], "
CreateRequestBody = CreateRequestBody & """temperature"": " & temperature & ", "
CreateRequestBody = CreateRequestBody & """max_tokens"": " & maxTokens
CreateRequestBody = CreateRequestBody & "}"
End Function
' 에러 메시지 추출 함수
Private Function ExtractErrorMessage(response As String) As String
Dim jsonObject As Object
Set jsonObject = ParseJsonResponse(response)
If Not jsonObject Is Nothing Then
If jsonObject.Exists("error") Then
If jsonObject("error").Exists("message") Then
ExtractErrorMessage = jsonObject("error")("message")
Exit Function
End If
End If
End If
ExtractErrorMessage = "에러 메시지를 추출할 수 없습니다."
End Function
Function ExtractContentFromJSON(jsonText As String) As String
Dim contentStart As Long
Dim contentEnd As Long
Dim nestLevel As Long
Dim i As Long
Dim char As String
If Trim(jsonText) = "" Then
ExtractContentFromJSON = "Error: Empty JSON string"
Exit Function
End If
contentStart = InStr(1, jsonText, """content""", vbTextCompare)
If contentStart = 0 Then
ExtractContentFromJSON = "Error: 'content' key not found in JSON"
Exit Function
End If
contentStart = InStr(contentStart + 8, jsonText, ":") + 1
' Skip whitespace
Do While Mid(jsonText, contentStart, 1) = " "
contentStart = contentStart + 1
Loop
If Mid(jsonText, contentStart, 1) = """" Then
' Content is a simple string
contentStart = contentStart + 1
contentEnd = InStr(contentStart, jsonText, """")
If contentEnd = 0 Then
ExtractContentFromJSON = "Error: Closing quote for 'content' not found"
Else
ExtractContentFromJSON = Mid(jsonText, contentStart, contentEnd - contentStart)
End If
Else
' Content might be an object or array
nestLevel = 1
For i = contentStart To Len(jsonText)
char = Mid(jsonText, i, 1)
If char = "{" Or char = "[" Then
nestLevel = nestLevel + 1
ElseIf char = "}" Or char = "]" Then
nestLevel = nestLevel - 1
If nestLevel = 0 Then
contentEnd = i
Exit For
End If
End If
Next i
If contentEnd = 0 Then
ExtractContentFromJSON = "Error: Closing bracket for 'content' not found"
Else
ExtractContentFromJSON = Mid(jsonText, contentStart, contentEnd - contentStart)
End If
End If
End Function
' 새로운 함수: Range를 JSON으로 변환하여 GPT에 전송
Public Function CallGPTWithRange(rng As Range, prompt As String, Optional temperature As Double = 0, Optional maxTokens As Long = DEFAULT_MAX_TOKENS) As String
On Error GoTo ErrorHandler
Application.EnableEvents = False
Dim jsonData As String
jsonData = RangeToJSON(rng)
Dim fullPrompt As String
fullPrompt = prompt & vbNewLine & "데이터:" & vbNewLine & jsonData
'Debug.Print fullPrompt
CallGPTWithRange = CallGPT(fullPrompt, temperature, maxTokens)
'Debug.Print "CallGPTWithRange: " & CallGPTWithRange
Application.EnableEvents = True
Exit Function
ErrorHandler:
CallGPTWithRange = "#Error: " & Err.Description
Application.EnableEvents = True
End Function
' Range를 JSON으로 변환하는 함수
Private Function RangeToJSON(rng As Range) As String
Dim row As Range, cell As Range
Dim i As Long, j As Long
Dim result As String
Dim headers() As String
' 헤더 추출
ReDim headers(1 To rng.Columns.Count)
For j = 1 To rng.Columns.Count
headers(j) = rng.Cells(1, j).value
Next j
result = "["
' 데이터 행 처리
For i = 2 To rng.Rows.Count
If i > 2 Then result = result & ","
result = result & "{"
For j = 1 To rng.Columns.Count
If j > 1 Then result = result & ","
result = result & """" & headers(j) & """:""" & Replace(rng.Cells(i, j).value, """", "\""") & """"
Next j
result = result & "}"
Next i
result = result & "]"
RangeToJSON = result
End Function
Sub AnalyzeSelectedData()
On Error GoTo ErrorHandler
'Debug.Print "AnalyzeSelectedData"
Dim sht As Worksheet
Dim shtResult As Worksheet
Dim rngDb As Range
Dim lastRow As Long
Dim prompt As String
Dim result As String
' 구입목록 시트 설정
Set sht = ThisWorkbook.Sheets("구입목록")
' A열의 마지막 데이터가 있는 행 찾기
lastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).row
' A3부터 H열까지, 마지막 데이터가 있는 행까지의 범위 설정
Set rngDb = sht.Range("A3:H" & lastRow)
' GPT 분석 결과 시트 설정 (없으면 새로 만듦)
On Error Resume Next
Set shtResult = ThisWorkbook.Sheets("GPT 분석 결과")
On Error GoTo 0
If shtResult Is Nothing Then
Set shtResult = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
shtResult.Name = "GPT 분석 결과"
End If
' 프롬프트 가져오기
prompt = shtResult.Range("B3").value
'Debug.Print "Prompt: " & prompt
' GPT 분석 실행
result = CallGPTWithRange(rngDb, prompt)
'Debug.Print "Result: " & result
' 결과 출력
shtResult.Range("B6").value = result
MsgBox "분석이 완료되었습니다. 'GPT 분석 결과' 시트를 확인해 주세요.", vbInformation
Exit Sub
ErrorHandler:
MsgBox "오류 발생: " & Err.Description, vbCritical
End Sub
Sub RunGPTList()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim prompt As String
Dim temperature As Double
Dim result As Variant
' B3 셀에서 프롬프트를 가져옵니다
prompt = ws.Range("B3").value
' B4 셀에서 temperature를 가져옵니다 (옵션)
temperature = ws.Range("B4").value
' CallGPTList 함수를 호출합니다
result = CallGPTList(prompt, temperature)
' 결과를 B6 셀부터 출력합니다
ws.Range("B6").Resize(UBound(result), 1).value = result
' 결과 셀의 서식을 지정합니다
Dim resultRange As Range
Set resultRange = ws.Range("B6").Resize(UBound(result), 1)
Dim cell As Range
For Each cell In resultRange
FormatGPTResultCell cell
Next cell
MsgBox "GPT 응답이 B6에 출력되었습니다.", vbInformation
End Sub
Sub CallGPTButton()
On Error GoTo ErrorHandler
Dim ws As Worksheet
Dim prompt As String
Dim temperature As Double
Dim result As String
' 현재 활성 워크시트 설정
Set ws = ActiveSheet
' B3 셀에서 프롬프트 가져오기
prompt = ws.Range("B3").value
' 프롬프트가 비어있는지 확인
If Trim(prompt) = "" Then
MsgBox "프롬프트를 B3 셀에 입력해주세요.", vbExclamation
Exit Sub
End If
' B4 셀에서 temperature 값 가져오기 (옵션)
If IsNumeric(ws.Range("B4").value) Then
temperature = CDbl(ws.Range("B4").value)
Else
temperature = 0 ' 기본값 설정
End If
' CallGPT 함수 호출
result = CallGPT(prompt, temperature)
' 결과 확인
If Left(result, 6) = "#Error" Then
MsgBox "GPT 분석 중 오류가 발생했습니다: " & result, vbCritical
Else
' 결과를 B6 셀에 출력
ws.Range("B6").value = result
MsgBox "GPT 분석이 완료되었습니다. B6 셀에서 결과를 확인하세요.", vbInformation
End If
Exit Sub
ErrorHandler:
MsgBox "오류 발생: " & Err.Description, vbCritical
End Sub
'pip install jupyter'
jupyter notebook --notebook-dir='C:\jupyter'