Power Query 5분 · 코드 0줄 · 매크로 권한 무관

Excel 에서 시세 직접 조회

M 코드 한 번 복붙으로 본인 plan 의 RTMS office 매매 cohort 가 단일 테이블로 30초만에 로드. Starter 1권역 · Pro 4권역 (+ dong precision) · Team 14권역 (전국). 매크로 권한 무관, 기관 IT 보안 정책 통과.

Power Query 셋업 데모

통합 방식 3가지

기관 IT 정책에 맞춰 선택하세요. 같은 데이터, 다른 셋업.

★ 추천 · 매크로 권한 무관

Power Query

5분. 데이터 → 웹에서 가져오기 → URL + X-API-Key 헤더. CSV 테이블 자동 갱신, 기관 IT 정책 친화.

  • Excel 2019+ / Microsoft 365 (Power Query 내장)
  • 매크로 정책 무관. IT 보안팀 검수 통과.
  • 자체 새로고침 (수동 또는 자동 schedule)
  • Mac · Windows · Web 모두 동작
셋업 가이드
개인 워크스테이션 전용 · v0.1.1 unsigned

VBA 모듈

=VEACON_MEDIAN() 같은 셀 함수. 개인 PC 에서 매크로 허용 시 사용 가능. 기관 IT 정책 unsigned 차단 시 대안은 Power Query.

  • Windows 데스크톱 Excel 2016+ / Microsoft 365
  • 셀 함수 형태 (=VEACON_MEDIAN, =VEACON_CAP_RATE 등)
  • ⚠ unsigned. IT 보안 정책에 따라 차단될 수 있음.
  • v0.2 Authenticode 코드 서명 트랙 진행 중 (Q2 2026)
셋업 가이드
Q3 2026 · 진행 중

Office.js Add-in

크로스 플랫폼 (Windows / Mac / Web). AppSource 등록 후 1-click 설치, Microsoft 서명.

  • Win / Mac / Excel for Web 전부 작동
  • AppSource 등록 (Microsoft 검수 + 서명)
  • 셀 함수 + Task Pane (UI)
  • 예상 출시: 2026년 3분기
등록 시 알림 받기
Power Query · 30초 (7권역 한 번에)

M 코드 한 번 복붙으로 끝

7권역 RTMS office 매매 cohort (median / p25 / p75 / 표본수 / confidence) 가 단일 테이블 7행으로 자동 로드. 분기마다 모두 새로 고침 한 번이면 갱신. 매크로 권한 무관, 기관 IT 보안 정책 통과.

  1. 1

    Excel 에서 빈 쿼리 만들기

    메뉴: 데이터 → 데이터 가져오기 → 다른 원본에서 → 빈 쿼리. Power Query 편집기 자동 열림.

  2. 2

    고급 편집기 열기

    편집기 메뉴: 홈 → 고급 편집기 클릭. 기본 스니펫 (let ... in ...) 이 보임.

  3. 3

    본인 plan 에 맞는 M 코드 통째로 붙여넣기

    기본 코드 모두 지우고 아래 본인 plan 코드 붙여넣기. 첫 줄 apiKey 를 본인 키로 수정 (다른 곳 건드릴 필요 없음).

    let
        apiKey = "veacon_pk_live_여러분의키_여기수정",
    
        // Starter plan — 1 권역 선택 (GBD/CBD/YBD/BBD 중 본인 운용 권역 1개)
        // 다른 권역 변경 예: [id="CBD", label="도심권", sigungu="11140"]
        Regions = {
            [id="GBD", label="강남권", sigungu="11680"]
        },
    
        // Fetch 함수: 403 (Region tier insufficient) / 404 / 5xx 모두 try/otherwise
        // 로 catch — 한 권역 fail 이 전체 query 를 abort 시키지 않음. fail 권역은
        // access_status="tier_insufficient_or_error" placeholder row 로 표시.
        Fetch = (region as record) as table =>
            let
                attempt = try
                    let
                        response = Web.Contents(
                            "https://veacon.io",
                            [
                                RelativePath = "/api/v1/real-estate/pulse",
                                Query = [
                                    sigungu_code = region[sigungu],
                                    property_type = "office",
                                    transaction_type = "sale",
                                    period = "last_6m",
                                    format = "csv"
                                ],
                                Headers = [
                                    #"X-API-Key" = apiKey,
                                    #"Accept" = "text/csv"
                                ]
                            ]
                        ),
                        csv = Csv.Document(response, [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.Csv]),
                        withHeaders = Table.PromoteHeaders(csv, [PromoteAllScalars=true]),
                        withRegionId = Table.AddColumn(withHeaders, "region_id", each region[id]),
                        withRegionLabel = Table.AddColumn(withRegionId, "region_label", each region[label]),
                        withStatus = Table.AddColumn(withRegionLabel, "access_status", each "ok")
                    in
                        withStatus,
                result = if attempt[HasError] then
                    Table.FromRecords({[
                        region_id = region[id],
                        region_label = region[label] & " (접근 제한 — 상위 plan 필요)",
                        access_status = "tier_insufficient_or_error"
                    ]})
                else
                    attempt[Value]
            in
                result,
    
        rows = List.Transform(Regions, Fetch),
        Combined = Table.Combine(rows),
    
        // gu (sigungu 쿼리에서 항상 빔) + monthly_rent (sale cohort 무관) 제거.
        // dong / access_status 는 유지 — UX 의미 있음.
        Cleaned = Table.RemoveColumns(
            Combined,
            {"gu", "avg_monthly_rent", "p25_monthly_rent", "median_monthly_rent", "p75_monthly_rent"},
            MissingField.Ignore
        )
    in
        Cleaned

    Starter plan · 1 권역 선택 (GBD/CBD/YBD/BBD 중 운용 권역 1개). Pro / Team 코드는 아래 ⊕ 펼치기. 키 발급: veacon.io/dashboard · Starter 월 10,000 콜.

  4. ⊕ Pro plan · 4 권역 + dong precision M 코드

    Starter 1권역 제한 해제 → 4 권역 모두 + Pro 전용 geo_precision=dong 활용. 예제는 4 sigungu cohort + 강남구를 역삼동 / 삼성동으로 쪼갠 dong cohort 2 개 (총 6 row). Fetch 함수가 dong 필드 유무 자동 감지. Regions 배열에 dong 만 추가하면 분기.

    let
        apiKey = "veacon_pk_live_여러분의키_여기수정",
    
        // Pro plan — 4 권역 (서울 핵심) + dong precision 지원
        // dong 필드 추가 시 geo_precision="dong" 자동 박힘. 예: 강남구 역삼동 / 삼성동
        Regions = {
            [id="GBD",      label="강남권",     sigungu="11680"],
            [id="CBD",      label="도심권",     sigungu="11140"],
            [id="YBD",      label="여의도/마포", sigungu="11560"],
            [id="BBD",      label="분당/판교",   sigungu="41135"],
    
            // Pro 의 dong precision 활용 — 단지 단위 cohort
            [id="GBD-역삼", label="강남구 역삼동", sigungu="11680", dong="역삼동"],
            [id="GBD-삼성", label="강남구 삼성동", sigungu="11680", dong="삼성동"]
        },
    
        // try/otherwise — 한 권역 403 fail 이 전체 query abort 안 시킴.
        Fetch = (region as record) as table =>
            let
                hasDong = List.Contains(Record.FieldNames(region), "dong"),
                baseQuery = [
                    sigungu_code = region[sigungu],
                    property_type = "office",
                    transaction_type = "sale",
                    period = "last_6m",
                    format = "csv"
                ],
                query = if hasDong
                    then baseQuery & [geo_precision = "dong", dong = region[dong]]
                    else baseQuery,
                attempt = try
                    let
                        response = Web.Contents(
                            "https://veacon.io",
                            [
                                RelativePath = "/api/v1/real-estate/pulse",
                                Query = query,
                                Headers = [
                                    #"X-API-Key" = apiKey,
                                    #"Accept" = "text/csv"
                                ]
                            ]
                        ),
                        csv = Csv.Document(response, [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.Csv]),
                        withHeaders = Table.PromoteHeaders(csv, [PromoteAllScalars=true]),
                        withRegionId = Table.AddColumn(withHeaders, "region_id", each region[id]),
                        withRegionLabel = Table.AddColumn(withRegionId, "region_label", each region[label]),
                        withStatus = Table.AddColumn(withRegionLabel, "access_status", each "ok")
                    in
                        withStatus,
                result = if attempt[HasError] then
                    Table.FromRecords({[
                        region_id = region[id],
                        region_label = region[label] & " (접근 제한 — 상위 plan 필요)",
                        access_status = "tier_insufficient_or_error"
                    ]})
                else
                    attempt[Value]
            in
                result,
    
        rows = List.Transform(Regions, Fetch),
        Combined = Table.Combine(rows),
    
        Cleaned = Table.RemoveColumns(
            Combined,
            {"gu", "avg_monthly_rent", "p25_monthly_rent", "median_monthly_rent", "p75_monthly_rent"},
            MissingField.Ignore
        )
    in
        Cleaned
    ⊕ Team plan · 전국 14권역 M 코드

    Starter 4권역 + Tier 1 신생 3 (MBD 마곡 / SBD 성수 / JBD 잠실) + Tier 2 광역 7 (IBD 송도 / BIFC 부산 문현 / 센텀 / 용산 / 과천 / G-Valley / 광명). 콜 수: refresh 1회 = 14 콜 (Team 월 300,000 콜 한도 0.005% 수준).

    let
        apiKey = "veacon_pk_live_여러분의키_여기수정",
    
        // Team plan — 전국 14권역 (서울 핵심 4 + Tier 1 신생 3 + Tier 2 광역 7)
        Regions = {
            // Tier 1 핵심 (Starter 동일)
            [id="GBD",      label="강남권",       sigungu="11680"],
            [id="CBD",      label="도심권",       sigungu="11140"],
            [id="YBD",      label="여의도/마포",  sigungu="11560"],
            [id="BBD",      label="분당/판교",    sigungu="41135"],
    
            // Tier 1 신생
            [id="MBD",      label="마곡",         sigungu="11500"],
            [id="SBD",      label="성수",         sigungu="11200"],
            [id="JBD",      label="잠실",         sigungu="11710"],
    
            // Tier 2 광역
            [id="IBD",      label="송도",         sigungu="28185"],
            [id="BIFC",     label="부산 문현",    sigungu="26290"],
            [id="센텀",     label="부산 센텀",    sigungu="26350"],
            [id="용산",     label="용산",         sigungu="11170"],
            [id="과천",     label="과천",         sigungu="41290"],
            [id="G-Valley", label="G밸리",        sigungu="11530"],
            [id="광명",     label="광명",         sigungu="41210"]
        },
    
        // try/otherwise — 한 권역 403 fail 이 전체 query abort 안 시킴. Starter
        // 가 이 14권역 코드 paste 해도 4권역만 정상 row, 10권역은 placeholder.
        Fetch = (region as record) as table =>
            let
                attempt = try
                    let
                        response = Web.Contents(
                            "https://veacon.io",
                            [
                                RelativePath = "/api/v1/real-estate/pulse",
                                Query = [
                                    sigungu_code = region[sigungu],
                                    property_type = "office",
                                    transaction_type = "sale",
                                    period = "last_6m",
                                    format = "csv"
                                ],
                                Headers = [
                                    #"X-API-Key" = apiKey,
                                    #"Accept" = "text/csv"
                                ]
                            ]
                        ),
                        csv = Csv.Document(response, [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.Csv]),
                        withHeaders = Table.PromoteHeaders(csv, [PromoteAllScalars=true]),
                        withRegionId = Table.AddColumn(withHeaders, "region_id", each region[id]),
                        withRegionLabel = Table.AddColumn(withRegionId, "region_label", each region[label]),
                        withStatus = Table.AddColumn(withRegionLabel, "access_status", each "ok")
                    in
                        withStatus,
                result = if attempt[HasError] then
                    Table.FromRecords({[
                        region_id = region[id],
                        region_label = region[label] & " (접근 제한 — 상위 plan 필요)",
                        access_status = "tier_insufficient_or_error"
                    ]})
                else
                    attempt[Value]
            in
                result,
    
        rows = List.Transform(Regions, Fetch),
        Combined = Table.Combine(rows),
    
        Cleaned = Table.RemoveColumns(
            Combined,
            {"gu", "avg_monthly_rent", "p25_monthly_rent", "median_monthly_rent", "p75_monthly_rent"},
            MissingField.Ignore
        )
    in
        Cleaned
    ⊕ Enterprise · 14권역 + dong drill-down (PKBD 판교 백현 / DMC 상암)

    Team 14권역에 sub-region 2개 (판교 백현동 / 상암 디지털미디어시티) 가 dong-단위로 추가. geo_precision=dong + dong=백현동 같은 query 가 추가로 필요해 M 코드 분기 처리.

    현재는 cohort 1 트라이얼 단계에 맞춰 custom 작성 으로 제공. hello@veacon.io 로 요청 시 deal-specific dong list 반영한 M 코드 회신.

  5. 4

    완료 → 시트에 로드

    완료 버튼 → Power Query 가 7번 fetch + 7행 결합한 미리보기 표시. 편집기 메뉴 홈 → 닫기 및 로드 → 시트에 테이블 (예: Query1) 형태로 표시. 분기마다 데이터 → 모두 새로 고침 한 번이면 갱신.

⊕ 단일 권역만 빠르게 (M 코드 안 쓰고 URL 직접)

특정 sigungu_code 1개만 필요하면 M 코드 대신 데이터 → 웹에서 → 고급 옵션 사용:

https://veacon.io/api/v1/real-estate/pulse?sigungu_code=11680&property_type=office&transaction_type=sale&period=last_6m&format=csv

HTTP 요청 헤더 매개변수 영역에:

  • X-API-Key: veacon_pk_live_...
  • Accept: text/csv

확인 → 인증 dialog 에서 익명 + https://veacon.io/ 최상위 scope 선택 → 연결. 1행 결과.

VBA 모듈 · v0.1.1 (unsigned) · 개인 워크스테이션 전용

=VEACON_MEDIAN() 셀 함수

  1. 1

    veacon.bas 다운로드

    veacon.bas · 약 250줄, 외부 라이브러리 의존성 없음. 코드는 GitHub 에서 공개 검토 가능.

  2. 2

    Excel 에 import

    Excel 열고 Alt + F11 으로 VBA 편집기 열기. 메뉴: File → Import File → 다운로드한 veacon.bas 선택.

    매크로가 차단된다면: File → Options → Trust Center → Trust Center Settings → Macro Settings → “매크로 포함 모든 파일에 대해 알림 표시” 선택.

  3. 3

    API key 등록 (한 번만)

    VBA 편집기에서 Ctrl + G 로 Immediate window 열기. 다음 한 줄 실행:

    VEACON_SET_KEY "veacon_pk_live_xxxxx..."

    키 발급: veacon.io/dashboard (무료 Starter 월 10,000 콜). 키는 Workbook 의 CustomDocumentProperty 에 저장. 파일 저장 시 함께 보존.

  4. 4

    셀에서 사용

    아무 셀에 입력하고 Enter:

    =VEACON_PING()                                ' "OK — connected ..."
    =VEACON_MEDIAN("11680","office","sale")        ' RTMS median price (₩)
    =VEACON_P75("11680","office","sale")           ' RTMS p75
    =VEACON_SAMPLE_COUNT("11680","office","sale")  ' 표본 수
    =VEACON_CAP_RATE("11680","office")             ' R-ONE 연환산 cap rate (%)
    =VEACON_VACANCY_RATE("11680","office")         ' R-ONE 공실률 (%)
VBA function reference · 개인 워크스테이션 전용

VBA 셀 함수 목록

VBA 모듈 import 한 경우 사용. 인자 기본값: period 는 pulse 함수 = last_6m, index 함수 = last_4q.
ⓘ Power Query 사용자는 이 표 무시. 위 섹션의 VLOOKUP / INDEX-MATCH 패턴 사용.

함수반환설명
VEACON_PING()"OK — ..."연결 + 키 + 쿼터 확인
VEACON_MEDIAN(sigungu, property, transaction, [period])₩ (Long)RTMS 거래 median 가격
VEACON_P25(sigungu, property, transaction, [period])₩ (Long)RTMS p25
VEACON_P75(sigungu, property, transaction, [period])₩ (Long)RTMS p75
VEACON_SAMPLE_COUNT(sigungu, property, transaction, [period])Long표본 거래 건수
VEACON_CONFIDENCE(sigungu, property, transaction, [period])low/medium/high신뢰도 라벨
VEACON_CAP_RATE(sigungu, property, [period])% (Double)R-ONE 연환산 cap rate
VEACON_VACANCY_RATE(sigungu, property, [period])% (Double)R-ONE 공실률
VEACON_SET_KEY(key)StringAPI key 저장 (Workbook property)
VEACON_CLEAR_CACHE()String세션 캐시 비움

자주 묻는 질문

Mac Excel 에서도 작동하나요?+

WinHttp 의존으로 현재 VBA 모듈은 Windows Excel 한정. Power Query 경로는 Mac 도 작동. Office.js Add-in (Q3 2026) 가 본격적인 cross-platform 답.

회사 보안 정책이 매크로를 차단합니다.+

Power Query 경로 사용 권장. 매크로 비활성 상태에서도 작동하며 IT 보안팀이 일반적으로 허용하는 표준 Excel 기능.

셀 100개에 함수를 박으면 API 100회 호출되나요?+

동일 (sigungu, property, transaction, period) 조합은 세션 캐시. 다른 cohort 100개 = 100회. Pro 월 10,000 / Team 월 300,000 콜 한도. /dashboard/usage 에서 실시간 확인.

키 노출이 걱정됩니다.+

Workbook 의 CustomDocumentProperty 에 저장. 파일 안에 보관됩니다. 파일 공유 시 키도 같이 전달됨에 주의. 리서처 1인 1키 발급 권장 (Team plan).

dong 단위 (예: 역삼동) 조회는요?+

Pro tier 이상에서 가능. 현 v0.1.0 셀 함수는 sigungu 단위만 지원. dong 인자 추가는 v0.2 follow-up. Power Query 는 URL 에 &geo_precision=dong&dong=역삼동 직접 추가하면 동작.