Excel 에서 시세 직접 조회
M 코드 한 번 복붙으로 본인 plan 의 RTMS office 매매 cohort 가 단일 테이블로 30초만에 로드. Starter 1권역 · Pro 4권역 (+ dong precision) · Team 14권역 (전국). 매크로 권한 무관, 기관 IT 보안 정책 통과.
통합 방식 3가지
기관 IT 정책에 맞춰 선택하세요. 같은 데이터, 다른 셋업.
Power Query
5분. 데이터 → 웹에서 가져오기 → URL + X-API-Key 헤더. CSV 테이블 자동 갱신, 기관 IT 정책 친화.
- Excel 2019+ / Microsoft 365 (Power Query 내장)
- 매크로 정책 무관. IT 보안팀 검수 통과.
- 자체 새로고침 (수동 또는 자동 schedule)
- Mac · Windows · Web 모두 동작
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)
Office.js Add-in
크로스 플랫폼 (Windows / Mac / Web). AppSource 등록 후 1-click 설치, Microsoft 서명.
- Win / Mac / Excel for Web 전부 작동
- AppSource 등록 (Microsoft 검수 + 서명)
- 셀 함수 + Task Pane (UI)
- 예상 출시: 2026년 3분기
M 코드 한 번 복붙으로 끝
7권역 RTMS office 매매 cohort (median / p25 / p75 / 표본수 / confidence) 가 단일 테이블 7행으로 자동 로드. 분기마다 모두 새로 고침 한 번이면 갱신. 매크로 권한 무관, 기관 IT 보안 정책 통과.
- 1
Excel 에서 빈 쿼리 만들기
메뉴: 데이터 → 데이터 가져오기 → 다른 원본에서 → 빈 쿼리. Power Query 편집기 자동 열림.
- 2
고급 편집기 열기
편집기 메뉴: 홈 → 고급 편집기 클릭. 기본 스니펫 (let ... in ...) 이 보임.
- 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
완료 → 시트에 로드
완료 버튼 → Power Query 가 7번 fetch + 7행 결합한 미리보기 표시. 편집기 메뉴 홈 → 닫기 및 로드 → 시트에 테이블 (예:
Query1) 형태로 표시. 분기마다 데이터 → 모두 새로 고침 한 번이면 갱신.
⊕ 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 코드 회신.
⊕ 단일 권역만 빠르게 (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행 결과.
=VEACON_MEDIAN() 셀 함수
- 1
veacon.bas 다운로드
veacon.bas · 약 250줄, 외부 라이브러리 의존성 없음. 코드는 GitHub 에서 공개 검토 가능.
- 2
Excel 에 import
Excel 열고 Alt + F11 으로 VBA 편집기 열기. 메뉴: File → Import File → 다운로드한
veacon.bas선택.매크로가 차단된다면: File → Options → Trust Center → Trust Center Settings → Macro Settings → “매크로 포함 모든 파일에 대해 알림 표시” 선택.
- 3
API key 등록 (한 번만)
VBA 편집기에서 Ctrl + G 로 Immediate window 열기. 다음 한 줄 실행:
VEACON_SET_KEY "veacon_pk_live_xxxxx..."키 발급: veacon.io/dashboard (무료 Starter 월 10,000 콜). 키는 Workbook 의 CustomDocumentProperty 에 저장. 파일 저장 시 함께 보존.
- 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 셀 함수 목록
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) | String | API 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=역삼동 직접 추가하면 동작.