[하나증권_프롬프트를 잘쓰기 위한 전략과 Claude Skills 실무 활용_프롬프트 공유 페이지]
[001] ———————————————————————————————————————————————
[고객 프로필]
이름: 김정호
연령: 63세
상황: 은퇴 예정이며 퇴직금 일부 운용을 검토 중
투자성향: 안정형
투자 경험: 예금 비중이 높고, 일부 채권형 상품 경험이 있음
관심사: 원금손실 가능성, 시장 변동성, 안정적인 현금흐름
우려사항: 최근 증시 변동성이 커져 투자 타이밍을 걱정함
[002] ———————————————————————————————————————————————
엑셀 사용법을 알려줘
# 정보
– 범위: D5:O열의 마지막 행(동적 탐색)
– 행: 국가별 수출입 통계
– 열: Jan. Feb. Mar. Apr. May. Jun. Jul. Aug. Sep. Oct. Nov. Dec.
– 시작 위치: 6행부터 시작
– 타입: 모두 수치형
# 지침
각 행의 최대값에 색칠하는 조건부 서식
0이 4개 이상이ㅣ면 제외
[003] ———————————————————————————————————————————————
엑셀 수식을 만들어 주십시오.
# 데이터
– 품목 : A2:A21(문자열)
– 분류 : F2:F6 (문자열{사과,배,딸기,토마토,복숭아})
# 작업
– ‘분류’의 키워드를 ‘품목’에서 검색해 1 또는 0을 반환한다.
– ‘1’이 반환된 첫 번째 위치의 ‘분류’ 값을 결과로 출력한다.
# 기타
– 키워드가 없는 행은 “기타”를 출력한다.
– 엑셀 2016 기준
[004] ———————————————————————————————————————————————
엑셀 수식을 만들어 주십시오.
# 데이터
– 품목 : A2:A21(문자열)
– 분류 : F2:F6 (문자열{사과,배,딸기,토마토,복숭아})
# 결과 예시
– A2: “브런치 사과 1+1 특가팩 (2kg x 2)” → “사과”
– A3: “신고배 왕특선 혼합세트 7과 (선물포장)” → “배”
– A4: “설향 딸기잼 1+1 초특가 행사” → “딸기”
# 기타
– 키워드가 없는 행은 “기타”를 출력한다.
– 엑셀 2016 기준
[005] ———————————————————————————————————————————————
[지침]에 따라 데이터를 전처리하여 [결과물]을 생성하는 엑셀 VBA 코드를 작성하십시오.
# 결과물: 표{분류,과정코드(오름차순),과정명,수강생,사원번호}
# 지침:
– 분류열은 상위행 값으로 결측 처리
– 결과물은 새로운 워크시트(“결과”)에 생성한다.
## 예시:
수강생 = 김철수
사원번호 = 123456
수강생 = 김영수
사원번호 = 234567
# 전처리 전 데이터 구조
– 표{분류,과정코드,과정명,수강생}
– 각 행은 하나의 교육 과정을 나타낸다.
– 데이터는 “Before” 시트의 A1:D44에 있으며, 첫 행은 머리글이다.
– 분류(A열)은 셀 병합으로 그룹화되어 있다.
– 수강생(D열)은 쉼표(,)로 구분된 1명 이상의 수강생이 하나의 셀에 문자열 형태로 나열되어 있다.
– 수강생(D열)의 각 수강생은 ‘수강생(사원번호)’ 형식으로 표기되어 있다.
– 수강생(D열) 예시: “엄창준(790016), 이숙희(920144), 유윤준(940017)”
[006] ———————————————————————————————————————————————
엑셀 사용자 정의 함수를 만드는 VBA 코드를 작성해주십시오.
함수
- 형태: =my_fruit(품목,분류)
- 기능: ‘품목’에 있는 텍스트에 ‘분류’에 있는 항목이 포함되어 있다면, 해당 항목들을 추출한다.
- 출력: 쉼표로 구분
지침
- ‘분류’는 2차원 배열이 될 수 있으므로 각 셀을 반복 비교한다.
- 중복된 단어는 한 번만 출력한다.
- 대소문자를 무시한다.
[007] ———————————————————————————————————————————————
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
[008] ———————————————————————————————————————————————
첨부한 보고서를 바탕으로, 고객에게 설명할 수 있는 맞춤형 요약 자료를 작성하십시오.
# 입력 자료
## 고객 기본 정보
– 고객명: {{고객명}}
– 연령: {{연령}}
– 직업/상황: {{직업_또는_상황}}
## 투자 프로파일
– 투자 성향: {{투자성향}}
– 투자 경험: {{투자경험}}
– 투자 기간: {{투자기간}}
– 자산 상황: {{자산상황}}
– 보유 여부: {{보유여부}}
– 현재 보유자산 또는 관심상품: {{현재_보유자산_또는_관심상품}}
## 상담 맥락
– 관심사: {{관심사}}
– 우려 사항: {{우려사항}}
– 상담 목적: {{상담목적}}
## 출력 제어
– 적합 산출물: {{적합산출물}}
– 설명 난이도: {{설명_난이도}}
– 출력 분량: {{출력_분량}}
– 금지 또는 주의 표현: {{금지_또는_주의표현}}
# 기본 작성 원칙
– 리포트에 명시된 내용만 근거로 요약한다.
– 리포트에 없는 사실, 전망, 수치, 투자 판단을 추가하지 않는다.
– 장점과 리스크를 균형 있게 설명해야 한다.
– 특정 종목, 상품, 시장에 대해 매수·매도·보유를 단정하지 않는다.
– 수익률을 보장하거나 손실 가능성을 축소하는 표현을 사용하지 않는다.
– 투자 권유보다 리포트 이해, 리스크 확인, 포트폴리오 점검에 도움이 되도록 작성한다.
– 고객이 이해하기 쉬운 표현을 사용하되, 리포트의 핵심 의미를 단순화해 왜곡하지 않는다.
– {{금지_또는_주의표현}}에 포함된 표현은 사용하지 않는다.
# 고객 맞춤 반영 방식
아래 고객 정보를 기준으로 리포트 내용의 우선순위와 설명 방식을 조정한다.
## 투자 성향 반영
– {{투자성향}}이 안정형이면 원금 손실 가능성, 변동성, 현금흐름, 분산 투자, 방어적 관점을 우선 설명한다.
– {{투자성향}}이 중립형이면 기대 요인과 리스크를 균형 있게 제시하고, 판단 기준을 중심으로 설명한다.
– {{투자성향}}이 적극형이면 성장 가능성, 시장 기회, 투자 포인트를 설명하되, 관련 리스크도 함께 제시한다.
## 생애주기 및 자산 상황 반영
– {{직업_또는_상황}}이 은퇴 예정 또는 은퇴 고객이면 현금흐름, 손실 회복 기간, 투자 기간, 유동성, 과도한 변동성 여부를 우선 고려한다.
– {{직업_또는_상황}}상 소득이 불안정하거나 {{자산상황}}상 유동성 필요가 큰 고객이면 단기 손실 가능성과 자금 회수 가능성을 강조한다.
– {{자산상황}} 또는 {{현재_보유자산_또는_관심상품}}이 특정 자산, 종목, 섹터, 국가, 통화에 집중되어 있으면 분산 관점에서 확인할 사항을 제시한다..
– {{투자기간}}이 단기이면 단기 변동성, 이벤트 리스크, 손실 가능성을 우선 설명한다.
– {{투자기간}}이 중장기이면 리포트의 핵심 전제, 구조적 성장 요인, 장기 리스크를 함께 설명한다.
## 투자 경험 반영
– {{투자경험}}이 낮음이면 전문용어를 줄이고, 필요한 용어는 괄호 안에서 짧게 풀어 설명한다.
– {{투자경험}}이 보통이면 핵심 개념과 투자 판단 기준을 함께 설명한다.
– {{투자경험}}이 높음이면 핵심 수치, 밸류에이션, 리포트의 전제 조건, 민감도, 리스크 요인을 명확히 제시한다.
## 관심사 및 우려 사항 반영
– {{관심사}}와 직접 관련된 리포트 내용을 우선 선별한다.
– {{우려사항}}과 관련된 리스크는 반드시 포함하되, 불안을 키우는 방식이 아니라 확인할 사항과 대응 방향 중심으로 설명한다.
– {{상담목적}}과 관련성이 낮은 내용은 핵심에서 제외하거나 짧게 처리한다.
## 상담 목적 반영
– {{상담목적}}이 신규 투자 검토이면 투자 매력과 진입 전 확인사항을 중심으로 작성한다.
– {{상담목적}}이 보유 자산 점검이면 기존 보유 비중, 리스크, 대응 방향을 중심으로 작성한다.
– {{상담목적}}이 시장 이해이면 시장 흐름, 주요 변수, 향후 확인할 지표를 중심으로 작성한다.
– {{상담목적}}이 포트폴리오 조정이면 해당 리포트 내용이 기존 자산 배분에 미치는 영향과 점검할 비중을 중심으로 작성한다.
## 보유 여부 반영
– {{보유여부}}가 보유 중이면 추가 매수 관점보다 보유 비중, 리스크 관리, 점검 포인트를 중심으로 설명한다.
– {{보유여부}}가 미보유이면 신규 진입 전 확인해야 할 조건, 가격 변동성, 투자 기간 적합성을 중심으로 설명한다.
– {{보유여부}}가 검토 중이면 투자 매력, 리스크, 고객 상황과의 적합성을 균형 있게 설명한다.
# 조건부 반영 규칙
아래 조건에 해당하는 경우, 해당 내용을 우선 반영한다.
– {{우려사항}}이 손실 가능성이면 하락 요인, 변동성, 대응 방향을 우선 설명한다.
– {{우려사항}}이 유동성이면 자금 회수 가능성, 투자 기간, 단기 변동성을 우선 설명한다.
– {{우려사항}}이 특정 자산 집중이면 분산 관점에서 확인할 사항을 제시한다.
– {{우려사항}}이 고점 매수이면 가격 부담, 밸류에이션, 분할 접근 가능성, 확인할 조건을 설명한다.
– {{우려사항}}이 환율이면 환율 변동이 수익률에 미칠 수 있는 영향을 설명한다.
– {{우려사항}}이 금리이면 금리 변화가 해당 자산, 업종, 시장에 미칠 수 있는 영향을 설명한다.
– {{관심사}}가 배당 또는 현금흐름이면 배당 지속성, 현금창출력, 금리 영향, 지급 안정성을 중심으로 설명한다.
– {{관심사}}가 성장주이면 성장 동력, 실적 전망, 밸류에이션 부담, 변동성을 함께 설명한다.
– {{관심사}}가 AI, 반도체, 2차전지, 바이오 등 특정 테마이면 테마의 성장 가능성과 과열 리스크를 함께 설명한다.
– {{관심사}}가 해외투자이면 환율, 국가별 정책, 세금, 시장 변동성을 함께 설명한다.
– {{관심사}}가 절세이면 리포트 내용과 직접 관련된 범위 안에서 세금 관련 확인 필요성을 언급하되, 리포트에 없는 세부 세법 판단은 추가하지 않는다.
# 출력 형식
아래 형식으로 작성하십시오.
## 1. 핵심 요약 3줄
– 고객에게 가장 중요한 내용을 3문장으로 요약한다.
– 각 문장은 짧고 명확하게 작성한다..
– {{관심사}}, {{우려사항}}, {{상담목적}}을 반영한다.
## 2. 중요한 투자 포인트 3가지
– 리포트에서 고객에게 직접 관련성이 높은 투자 포인트를 3가지 제시한다.
– 각 포인트마다 “왜 중요한지”를 한 문장으로 설명한다.
– 단정적 투자 권유가 아니라 판단 기준으로 표현한다.
## 3. 반드시 설명해야 할 리스크 3가지
– {{투자성향}}, {{자산상황}}, {{투자기간}}, {{우려사항}}을 고려해 반드시 설명해야 할 리스크를 3가지 제시한다.
– 각 리스크마다 확인할 사항 또는 대응 방향을 함께 제시한다.
– 리스크를 축소하거나 과장하지 않는다.
## 4. 고객에게 던질 후속 질문 또는 상담 유도 문장
– {{상담목적}}과 {{우려사항}}에 맞춘 후속 질문 또는 상담 유도 문장을 2~3개 작성한다.
– 고객이 다음 상담에서 본인의 상황을 더 구체적으로 이야기할 수 있도록 자연스럽게 작성한다.
– 질문은 투자 권유가 아니라 고객 상황 확인과 리스크 점검을 위한 방식으로 작성한다.
# 문체 조건
– 전체 문장은 고객에게 직접 설명할 수 있는 상담 자료 톤으로 작성한다.
– 지나치게 딱딱한 보고서체보다, PB 또는 상담자가 고객에게 설명하는 자연스러운 문장으로 작성한다.
– 각 항목은 짧고 명확하게 작성한다.
– 전문용어는 필요한 경우 괄호 안에서 간단히 설명한다.
– “반드시 오른다”, “매수해야 한다”, “안전하다”, “확실하다”, “걱정하지 않아도 된다”와 같은 단정적 표현은 사용하지 않는다.
– 리포트의 의견을 전달할 때는 “리포트는 ~로 보고 있습니다”, “리포트에서는 ~를 주요 변수로 제시합니다”, “확인할 부분은 ~입니다”와 같은 표현을 사용한다.
# 7. 최종 점검 기준
작성 후 아래 기준을 스스로 점검하고, 기준에 맞지 않는 문장은 수정하십시오.
– 리포트에 없는 내용을 추가하지 않았는가?
– 고객의 {{관심사}}, {{우려사항}}, {{상담목적}}이 반영되었는가?
– 투자 권유나 매수·매도 단정으로 보일 수 있는 표현은 없는가?
– 장점과 리스크가 균형 있게 제시되었는가?
– 고객의 {{투자경험}}과 {{설명_난이도}}에 맞는 표현을 사용했는가?
– 리스크 설명에 확인할 사항 또는 대응 방향이 포함되었는가?
– 후속 질문이 고객 상황 확인과 상담 연결에 도움이 되는가?
[009] ———————————————————————————————————————————————
Option Explicit
Private Const OPENAI_API_URL As String = “https://api.openai.com/v1/chat/completions”
Private Const OPENAI_MODEL As String = “gpt-4.1-mini”
Private Const TIMEOUT_MS As Long = 30000
Private Const OPENAI_API_KEY As String = “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”
Public Function AI_ASK(ByVal promptInput As Variant, Optional ByVal dataInput As Variant) As String
On Error GoTo EH
Dim promptText As String
Dim dataText As String
Dim finalPrompt As String
Dim hasDataArg As Boolean
promptText = Trim$(VariantToText(promptInput))
If Len(promptText) = 0 Then
AI_ASK = “오류: prompt가 비어 있습니다.”
Exit Function
End If
hasDataArg = Not IsMissing(dataInput)
If hasDataArg Then
dataText = BuildDataText(dataInput)
If IsObject(dataInput) Then
If TypeName(dataInput) = “Range” Then
If Len(dataText) = 0 Then
AI_ASK = “안내: data 범위에 비어 있지 않은 셀이 없습니다.”
Exit Function
End If
End If
End If
If Len(dataText) > 0 Then
finalPrompt = promptText & vbLf & vbLf & dataText
Else
finalPrompt = promptText
End If
Else
finalPrompt = promptText
End If
AI_ASK = CallOpenAI(finalPrompt)
Exit Function
EH:
AI_ASK = “오류: ” & Err.Description
End Function
Private Function CallOpenAI(ByVal finalPrompt As String) As String
On Error GoTo EH
Dim apiKey As String
Dim requestJson As String
Dim http As Object
Dim responseBytes() As Byte
Dim responseText As String
Dim contentText As String
Dim errMsg As String
apiKey = OPENAI_API_KEY
requestJson = BuildRequestJson(finalPrompt)
Set http = CreateObject(“WinHttp.WinHttpRequest.5.1”)
http.SetTimeouts TIMEOUT_MS, TIMEOUT_MS, TIMEOUT_MS, TIMEOUT_MS
http.Open “POST”, OPENAI_API_URL, False
http.SetRequestHeader “Authorization”, “Bearer ” & apiKey
http.SetRequestHeader “Content-Type”, “application/json”
http.SetRequestHeader “Accept”, “application/json”
‘ 중요: 바이트 배열 전송 대신 JSON 문자열을 그대로 전송
http.Send requestJson
responseBytes = http.ResponseBody
responseText = Utf8BytesToString(responseBytes)
If CLng(http.Status) < 200 Or CLng(http.Status) >= 300 Then
errMsg = ExtractJsonErrorMessage(responseText)
CallOpenAI = “API 호출 실패: HTTP ” & CStr(http.Status) & ” ” & CStr(http.StatusText)
If Len(errMsg) > 0 Then
CallOpenAI = CallOpenAI & ” | ” & errMsg
ElseIf Len(responseText) > 0 Then
CallOpenAI = CallOpenAI & ” | ” & Left$(responseText, 500)
End If
Exit Function
End If
contentText = ExtractMessageContent(responseText)
If Len(contentText) = 0 Then
CallOpenAI = “오류: 응답에서 텍스트 추출에 실패했습니다. 원본 일부: ” & Left$(responseText, 500)
Exit Function
End If
CallOpenAI = contentText
Exit Function
EH:
CallOpenAI = “오류: API 요청 중 예외 발생 – ” & Err.Description
End Function
Private Function BuildRequestJson(ByVal userPrompt As String) As String
Dim q As String
q = Chr$(34)
BuildRequestJson = _
“{” & _
q & “model” & q & “:” & q & OPENAI_MODEL & q & “,” & _
q & “messages” & q & “:[” & _
“{” & q & “role” & q & “:” & q & “user” & q & “,” & _
q & “content” & q & “:” & q & JsonEscape(userPrompt) & q & “}” & _
“]” & _
“}”
End Function
Private Function BuildDataText(ByVal v As Variant) As String
On Error GoTo SingleValue
Dim rng As Range
Dim cell As Range
Dim s As String
Dim piece As String
If IsObject(v) Then
If TypeName(v) = “Range” Then
Set rng = v
For Each cell In rng.Cells
piece = Trim$(VariantToText(cell.Value))
If Len(piece) > 0 Then
If Len(s) > 0 Then s = s & vbLf
s = s & piece
End If
Next cell
BuildDataText = s
Exit Function
End If
End If
SingleValue:
BuildDataText = Trim$(VariantToText(v))
End Function
Private Function VariantToText(ByVal v As Variant) As String
On Error GoTo EH
If IsObject(v) Then
If TypeName(v) = “Range” Then
VariantToText = Trim$(CStr(v.Value))
Exit Function
End If
End If
If IsError(v) Then
VariantToText = “”
ElseIf IsNull(v) Or IsEmpty(v) Then
VariantToText = “”
Else
VariantToText = Trim$(CStr(v))
End If
Exit Function
EH:
VariantToText = “”
End Function
Private Function Utf8BytesToString(ByRef bytes() As Byte) As String
On Error GoTo EH
Dim stm As Object
Set stm = CreateObject(“ADODB.Stream”)
stm.Type = 1
stm.Open
stm.Write bytes
stm.Position = 0
stm.Type = 2
stm.Charset = “utf-8”
Utf8BytesToString = stm.ReadText
stm.Close
Exit Function
EH:
Utf8BytesToString = “”
End Function
Private Function JsonEscape(ByVal s As String) As String
s = Replace(s, “\”, “\\”)
s = Replace(s, Chr$(34), “\” & Chr$(34))
s = Replace(s, “/”, “\/”)
s = Replace(s, vbBack, “\b”)
s = Replace(s, vbCrLf, “\n”)
s = Replace(s, vbCr, “\n”)
s = Replace(s, vbLf, “\n”)
s = Replace(s, vbTab, “\t”)
JsonEscape = s
End Function
Private Function ExtractMessageContent(ByVal jsonText As String) As String
On Error GoTo EH
Dim pChoices As Long
Dim pMessage As Long
Dim pContentKey As Long
Dim pColon As Long
Dim pQuoteStart As Long
Dim i As Long
Dim ch As String
Dim escaped As Boolean
Dim rawValue As String
pChoices = InStr(1, jsonText, Chr$(34) & “choices” & Chr$(34), vbTextCompare)
If pChoices = 0 Then Exit Function
pMessage = InStr(pChoices, jsonText, Chr$(34) & “message” & Chr$(34), vbTextCompare)
If pMessage = 0 Then Exit Function
pContentKey = InStr(pMessage, jsonText, Chr$(34) & “content” & Chr$(34), vbTextCompare)
If pContentKey = 0 Then Exit Function
pColon = InStr(pContentKey + 9, jsonText, “:”)
If pColon = 0 Then Exit Function
pQuoteStart = pColon + 1
Do While pQuoteStart <= Len(jsonText)
ch = Mid$(jsonText, pQuoteStart, 1)
If ch <> ” ” And ch <> vbTab And ch <> vbCr And ch <> vbLf Then Exit Do
pQuoteStart = pQuoteStart + 1
Loop
If Mid$(jsonText, pQuoteStart, 1) <> Chr$(34) Then Exit Function
escaped = False
rawValue = “”
For i = pQuoteStart + 1 To Len(jsonText)
ch = Mid$(jsonText, i, 1)
If escaped Then
rawValue = rawValue & “\” & ch
escaped = False
ElseIf ch = “\” Then
escaped = True
ElseIf ch = Chr$(34) Then
Exit For
Else
rawValue = rawValue & ch
End If
Next i
ExtractMessageContent = JsonUnescape(rawValue)
Exit Function
EH:
ExtractMessageContent = “”
End Function
Private Function JsonUnescape(ByVal s As String) As String
Dim i As Long
Dim ch As String
Dim nextCh As String
Dim hexCode As String
Dim outText As String
i = 1
Do While i <= Len(s)
ch = Mid$(s, i, 1)
If ch = "\" And i < Len(s) Then
nextCh = Mid$(s, i + 1, 1)
Select Case nextCh
Case Chr$(34): outText = outText & Chr$(34): i = i + 2
Case "\": outText = outText & "\": i = i + 2
Case "/": outText = outText & "/": i = i + 2
Case "b": outText = outText & vbBack: i = i + 2
Case "f": outText = outText & vbFormFeed: i = i + 2
Case "n": outText = outText & vbLf: i = i + 2
Case "r": outText = outText & vbCr: i = i + 2
Case "t": outText = outText & vbTab: i = i + 2
Case "u"
If i + 5 <= Len(s) Then
hexCode = Mid$(s, i + 2, 4)
If IsHex4(hexCode) Then
outText = outText & ChrW$(CLng("&H" & hexCode))
i = i + 6
Else
outText = outText & ch
i = i + 1
End If
Else
outText = outText & ch
i = i + 1
End If
Case Else
outText = outText & nextCh
i = i + 2
End Select
Else
outText = outText & ch
i = i + 1
End If
Loop
JsonUnescape = outText
End Function
Private Function IsHex4(ByVal s As String) As Boolean
Dim i As Long
Dim c As String
If Len(s) <> 4 Then
IsHex4 = False
Exit Function
End If
For i = 1 To 4
c = Mid$(s, i, 1)
If InStr(1, “0123456789ABCDEFabcdef”, c, vbBinaryCompare) = 0 Then
IsHex4 = False
Exit Function
End If
Next i
IsHex4 = True
End Function
Private Function ExtractJsonErrorMessage(ByVal jsonText As String) As String
On Error GoTo EH
Dim pErr As Long
Dim pMsg As Long
Dim pColon As Long
Dim pQuoteStart As Long
Dim i As Long
Dim ch As String
Dim escaped As Boolean
Dim rawValue As String
pErr = InStr(1, jsonText, Chr$(34) & “error” & Chr$(34), vbTextCompare)
If pErr = 0 Then Exit Function
pMsg = InStr(pErr, jsonText, Chr$(34) & “message” & Chr$(34), vbTextCompare)
If pMsg = 0 Then Exit Function
pColon = InStr(pMsg + 9, jsonText, “:”)
If pColon = 0 Then Exit Function
pQuoteStart = pColon + 1
Do While pQuoteStart <= Len(jsonText)
ch = Mid$(jsonText, pQuoteStart, 1)
If ch <> ” ” And ch <> vbTab And ch <> vbCr And ch <> vbLf Then Exit Do
pQuoteStart = pQuoteStart + 1
Loop
If Mid$(jsonText, pQuoteStart, 1) <> Chr$(34) Then Exit Function
escaped = False
rawValue = “”
For i = pQuoteStart + 1 To Len(jsonText)
ch = Mid$(jsonText, i, 1)
If escaped Then
rawValue = rawValue & “\” & ch
escaped = False
ElseIf ch = “\” Then
escaped = True
ElseIf ch = Chr$(34) Then
Exit For
Else
rawValue = rawValue & ch
End If
Next i
ExtractJsonErrorMessage = JsonUnescape(rawValue)
Exit Function
EH:
ExtractJsonErrorMessage = “”
End Function

