엑셀에서 API를 쓰는 이유는 결국 시트와 모델을 오가기 위해서입니다. 이 글에서는 응답을 시트에 펼치고, 반대로 시트에 적힌 값을 요청 바디로 바꾸는 함수들을 살펴봅니다.
이 글에서 다루는 것
・ 결과표를 시트에 펼치기
・ 모델 데이터를 시트에 펼치기
・ 시트에 적은 값을 바디로 바꾸기
・ 시트 범위를 목록으로 모으기
・ 번호를 MIDAS 범위 표기로 바꾸기
TableToSheet(jsonText, target, [tableName], [writeHead])
ItemsToSheet(uri, target, [fields])
SheetToAssign(source)
RangeToList(source, [asNumber])
IdsToRangeText(ids)
결과표를 시트에 펼치기
post/TABLE 응답은 { "표 이름": { "HEAD": [...], "DATA": [[...]] } } 모양입니다. TableToSheet 는 이 응답을 받아 지정한 셀부터 머리글과 데이터를 채워 넣고, 쓴 데이터 줄 수를 돌려줍니다. 표를 찾지 못하면 -1입니다.
Sub PutReaction()
Dim resultJson As String
Dim rows As Long
resultJson = CallPost("/post/TABLE", jsonBody)
rows = TableToSheet(resultJson, Sheets("결과").Range("A1"))
If rows < 0 Then
Debug.Print "표를 찾지 못했습니다"
Else
Debug.Print rows & "줄 썼습니다"
End If
End Sub
응답에 표가 여러 개 들어 있으면 tableName 으로 하나를 고릅니다. 머리글 없이 데이터만 덧붙이고 싶다면 writeHead 를 False로 두면 됩니다.
TableToSheet resultJson, Range("A1"), "Reaction", True
TableToSheet resultJson2, Range("A20"), "Reaction", False
모델 데이터를 시트에 펼치기
ItemsToSheet 는 결과표가 아니라 모델 데이터를 펼칩니다. 첫 열에 번호가 들어가고 나머지 열에 필드가 들어갑니다.
' 절점 전체를 A1 부터
ItemsToSheet "db/NODE", Range("A1")
' 원하는 필드만, 원하는 순서로
ItemsToSheet "db/NODE", Range("A1"), "X,Y,Z"
fields 를 비우면 첫 번째 기록에 들어 있는 단순 값 필드를 모두 씁니다. 중첩된 객체가 들어 있는 항목은 필드를 직접 지정하는 편이 깔끔합니다.
시트에 적은 값을 바디로 바꾸기
SheetToAssign 은 시트 범위를 그대로 Assign 바디로 바꿔 줍니다. 표를 채우고 버튼 하나로 모델에 밀어 넣는 흐름의 핵심입니다.
규칙은 세 가지입니다.
・ 첫 줄은 머리글입니다. 첫 칸은 번호 열이고, 나머지가 필드 이름이 됩니다.
・ 둘째 줄부터가 데이터입니다. 번호 칸이 비어 있는 줄은 건너뜁니다.
・ 칸의 값이 [ 나 { 로 시작하면 JSON으로 해석합니다. 배열이나 중첩 객체를 넣을 때 씁니다.
' A B C D
' ID X Y Z
' 1 0 0 0
' 2 10 0 0
' 3 20 0 0
Sub PushNodes()
Dim body As Object
Set body = SheetToAssign(Range("A1:D4"))
Debug.Print JText(body)
Debug.Print CallPut("/db/NODE", JText(body))
End Sub
💡 Tip
밀어 넣기 전에 Debug.Print JText(body) 로 한 번 찍어 보는 습관을 들이면, 머리글 이름이 틀렸거나 빈 줄이 섞인 것을 보내기 전에 발견할 수 있습니다.
시트 범위를 목록으로 모으기
RangeToList 는 한 열(또는 한 행)을 Collection으로 모읍니다. 빈 칸은 건너뜁니다. 하중 조건 이름 목록이나 번호 목록을 만들 때 씁니다.
' 문자열 그대로
Dim names As Collection
Set names = RangeToList(Range("A2:A20"))
' 숫자로 변환해서
Dim ids As Collection
Set ids = RangeToList(Range("B2:B20"), True)
번호를 MIDAS 범위 표기로 바꾸기
결과표 요청에서 대상 번호를 지정할 때 MIDAS는 1to3 7to9 같은 표기를 씁니다. IdsToRangeText 가 번호 목록을 이 표기로 바꿔 줍니다.
Debug.Print IdsToRangeText(Array(1, 2, 3, 7, 8, 9))
' 1to3 7to9
Debug.Print IdsToRangeText(RangeToList(Range("B2:B20"), True))
💡 Tip
붙어 있는 번호는 알아서 묶고 떨어진 번호는 그대로 둡니다. 시트에서 고른 요소 번호를 그대로 넘기면 되므로, 사용자가 몇 번을 골랐는지 신경 쓰지 않아도 됩니다.