주 콘텐츠로 건너뛰기
프로젝트 설정 생성 편집

시트와 주고받기

엑셀에서 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

붙어 있는 번호는 알아서 묶고 떨어진 번호는 그대로 둡니다. 시트에서 고른 요소 번호를 그대로 넘기면 되므로, 사용자가 몇 번을 골랐는지 신경 쓰지 않아도 됩니다.

 

0
컨텐츠가 도움이 되셨나요?