우수 졸업생 완강 노트 및 후기를 여러분께 소개합니다!
ywkoc / 윤코비치 / Mo_Grimb / 무지개쨈아찌 / 김원중 / 당신을축복하는올빼미 / 초코우유 / WWW / Bae-Um / juic**** / 블루라이언 / 넘사르 / 듈리동훈 / 내꺼야 / 욕심없는성공v / Domico / 플매 / DanP / 앨리스 / 쌈닭 / 블링블링
/ 더블유에이 / 오빠두악셀 / 불량감자 / GYsDaddy / 사과맛 / 끝판대장 / 사나이박 박승철 / 제로윈드 / 스윗고구마 / 룰룰랄랄 / hrd / data-miner / fabikim / 헌원 / 폴라리스 / 생강크림 / 무거운걸 / 누쿠 / Gladiolus / 랄라곰 / 스윙키즈 / 이은지 / 은혜사랑 / 애니몽 / Gisele / 할미손 / 오빠두엑셀러 / 근육토끼 / 파란망아지 / 릴라릴라 / 연유사랑 / 달구름 / Aidan / 재미나게 / 김태우 | Kim Taewoo / 두리둥 / M.J. / aqwsd**** / laeti / 매탱매탱 / 개나리 / 로이 / 에스제이에스제이 / Rieul / 레몬키위 / 유노지노 / excelself / HappyCreamSet / 앗싸라삐야 / 슈슈 / 진진 / Google / 연자매 / JeromeK / hw / 權 / ppoc**** / 기다 / 쪼꼬미061 / 럭키세븐 / Winsome / yuni / cynicalH / asd**** / 맛집사랑 / 하하 / 림정 / hellong / 행전s / 이밍밍밍 / 안녕안녕 / bio / 쩡 / 포로리 / 뱀띠쀼 / n/a / 꼬마과학자 / Jeje / 예감좋은날 / 에드몽 / miso_ / Kyung / 키스케 / 지미노 / 코울슬로 / 송슾 / 한프로 / 엑스트라림 / 나니나니나니 / 룰루란 / kalois / 소울민트 / usagi / 꽁시 / 라쎄 / 황용일 / 꽃 받고싶다 ^^ / GGpark / poeonly / 홍슬 / IDK / 태성 / dmb0**** / 씽주 / 쁑 / 넉낙 / 솔롱고스
정말 열심히 참여해주셔서, 우수 졸업생을 추가 선발하였습니다!
챌린지가 앞으로 여러분의 업무에 작은 도움이 되길 희망합니다.
API 6분 이해 끝
RESTful API는 생성, 읽기, 업데이트, 삭제 작업을 위해 HTTP와 고유한 URI를 사용하여 소프트웨어가 요청과 응답을 교환하는 방법을 정의합니다.
RESTful API 이해: 원칙 및 예제
•
•
•
•
•
코얼리, 유튜브 속 핵심 내용을 10초 만에! - https://corely.ai/content/rest-api-meaning-usage-benefits
API는 소프트웨어가 통신하고 상호 작용할 수 있는 수단으로, 요청을 보내고 응답을 받을 수 있도록 합니다.
API 이해하기: 기본 사항 및 실제 사례
•
•
•
•
•
코얼리, 유튜브 속 핵심 내용을 10초 만에! - https://corely.ai/content/application-programming-interface-communication
전체 일정
# 1주차 | 1월 14일(토)~1월 20일(금)
•
회사에서 엑셀로 고통받는 이유는, 바로 "이것"! - 데이터 구조 이해하기
•
# 2주차 | 1월 21일(토)~1월 27일(금)
•
초보자도 만들기 쌉가능?! 엑셀-QR코드 자동화 서식 만들기
•
# 3주차 | 1월 28일(토)~2월 3일(금)
•
API, 이제 걱정하지 마세요! - 엑셀+카카오 API 연동 실습
•
1주: 올바른 데이터 구조의 이해
개인 블로그(네이버, 티스토리) 또는 오빠두 홈페이지에 작성한 게시글 링크를 제출합니다. 제출 기한 : ~ 01월 20일(금) 자정 까지 제출 기한 내에는 링크를 자유롭게 수정할 수 있습니다.
미션 목표 :
이번 챌린지의 미션 목표는 자료를 효율적으로 관리하기 위한 '올바른 데이터 구조'를 이해하는 겁니다.
작성 방법 :
•
엑셀에서 올바른 구조로 데이터를 관리하기 위해 지켜야 할 3가지 중요 규칙과 간략한 설명을 작성합니다.(머릿글은 ○○로 관리하기, ○○○ 절대 하지 않기, ○○데이터 제외하기)
•
"세로방향 블록쌓기" 규칙에 대한 간략한 설명과 예시를 작성합니다.
•
파워쿼리의 주요 기능인 "열 피벗 해제"의 어원(왜 이름이 '피벗 해제'인지?)과 기능에 대한 설명을 작성합니다.
예제 파일
최종 파일
1. 엑셀에서 올바른 구조로 데이터를 관리하기 위해 지켜야 할 3가지 중요 규칙과 간략한 설명을 작성합니다.(머릿글은 ○○로 관리하기, ○○○ 절대 하지 않기, ○○데이터 제외하기)
가. 머릿글은 반드시 ‘한 줄’로 관리하기
나. 원본데이터에는 셀 병합 절대 사용 금지
다. 집계 데이터는 원본에서 제외하기
2. 세로방향 블록쌓기" 규칙에 대한 간략한 설명과 예시를 작성합니다.
가. 데이터 구조가 잘못되면 일단 피벗테이블 사용이 거의 불가함
나. 데이터를 세로방향으로 쌓으면 데이터가 추가되어도 데이터 구조 변경 없이 피벗테이블, 슬라이서 등을 이용해서 반대의 상황과 비교했을 때보다 훨씬 시간을 절약하고 효율적으로 보고서 작성이 가능함
3. 파워쿼리의 주요 기능인 "열 피벗 해제"의 어원(왜 이름이 '피벗 해제'인지?)과 기능에 대한 설명을 작성합니다.
가. 열 피벗 해제의 의미는 우리가 피벗 테이블(보고서 형태)로 구현해야할 원본 데이터가 피벗 테이블 형태(보고서 형태)로 구현되어 있을 때, 세로 쌓기 구조의 원본 데이터로 변환하기 위한 기능임.
나. 세로 쌓기 데이터 구조로 원본 데이터를 구성하고 이를 피벗 테이블 형태로 다양하게 보고서를 만들 수 있음. 따라서 원본 데이터는 보고서 형태로 구조로 만들면 데이터를 수정하거나 추가하기 어려움.
배운점
원본 데이터 구조가 정말 중요하다는 것을 느낌.
원본 데이터 구조가 세로 쌓기 구조여야 보고서 작성 등의 활용이 쉽다는 것을 느낌.
파워쿼리를 통해 머릿글을 한 줄로 만들고, 병합을 해제하며, 원본 데이터를 가공할 수 있다는 것을 느낌.
이번 챌린지를 통해 가장 잘 이해하고 싶었던 파워쿼리 사용법을 복습하고자 한다.
데이터 구조가 잘못된 원본을 바람직한 데이터 구조로 변환하는 과정을 살펴보자.
데이터 구조가 잘못된 원본의 예
바람직한 데이터 구조로 만든 원본의 예
원본데이터를 테이블로 변환한 뒤에 데이터 메뉴의 테이블 범위에서 가져오기 기능을 통해 파워쿼리로 불러오자.
불러올 때 머릿글이 병합된 형태이므로 머리글을 포함하지 않고 불러오는 것이 중요하다. 머릿글은 반드시 한 줄로 구성되어야 한다.
병합된 영역은 null로 표시가 된다. 변환의 채우기를 통해 아래로 또는 위로 채우면 병합 전의 모습으로 머리글을 바꿀 수 있다.
아래로 채우면 널 표시가 없어지고 위의 행 정보가 채워진다.
변환에서 행/열 바꾸기 기능을 사용해서 남은 null들을 아래로 채운다.
null표시를 모두 없앴다면 나뉜 2개의 열을 합친다. 합칠 때에는 머릿글에 포함된 기호는 생략하고 다른 기호를 추가해야 한다.
병합이 끝나면 다시 변환의 행/열 바꾸기를 실행하여 머릿글을 원상복귀 시킨다.
머릿글 준비가 되었으니 첫 행을 머릿글로 사용하는 기능을 실행한다.
이름, 성별, 연령대의 경우에는 피벗해제가 필요 없지만 그 외의 열은 피벗해제가 필요하므로 이름, 성별, 연령대 열을 모두 선택하고 다른 열 피벗해제 기능을 실행한다.
구분 기호인 세미콜론에 따라 열 분할 기능을 실행한다.
마지막으로 이름을 정확하게 바꾸면 모든 작업이 끝난다.
2주: 초보자도 만들기 쌉가능?! 엑셀-QR코드 자동화 서식 만들기
https://www.oppadu.com/excel-api-basic-challenge/각 회차별 미션은 기한내에 꼭 제출해주세요!
개인 블로그(네이버, 티스토리) 또는 오빠두 홈페이지에 작성한 게시글 링크를 제출합니다. 제출 기한 : ~ 01월 27일(금) 자정 까지 제출 기한 내에는 링크를 자유롭게 수정할 수 있습니다.
미션 목표 :
이번 챌린지의 미션 목표는 앞으로 API를 잘 활용하는 것이 중요한 이유를 이해한 후, 엑셀과 구글 QR코드 API를 연동하는 방법을 실습합니다.
작성 방법 :
•
앞으로 실무에서 API를 잘 활용하는 것이 중요한 이유는 무엇인가요?URL 방식으로 서버에 요청 시, 꼭 알아야 할 기호인 "?" 와 "&" 기호의 사용법을 간략히 작성해보세요.
•
URL 방식 외에 JSON, XML 방식이 필요한 이유는 무엇인가요?JSON 데이터 구조에 사용되는 "3가지 중요 기호"와 사용법을 간략하게 정리해보세요.
•
(M365 버전 사용자) IMAGE 함수로 구글 QR 코드 API를 활용해 원하는 QR코드를 만드는 방법을 단계별로 정리합니다.
•
(M365 이전 버전 사용자) VBA로 xImage 함수를 등록하고 사용하는 방법을 단계별로 정리합니다.
•
(선택) 현재 내 업무에 적용가능한 API는 무엇이 있을까요? 구글 또는 네이버에 검색 후, 어떻게 적용할 수 있을지 생각해보세요. 
예제 파일
최종 파일
구글 QR코드 API 설명 링크
1. 앞으로 실무에서 API를 잘 활용하는 것이 중요한 이유는 무엇인가요?URL 방식으로 서버에 요청 시, 꼭 알아야 할 기호인 "?" 와 "&" 기호의 사용법을 간략히 작성해보세요.
API를 사용하지 않는 서비스나 앱 또는 프로그램을 찾기 어렵다. 우리가 생활하면서 늘 만나는 것이 API이기 때문에 이것을 잘 활용하는 것이 실무에서 자신에게 생산성을 높일 것이다.
API는 원격배달시스템이다. ‘?’ 와 ‘&’ 만 알면 끝~
*참고 문서
‘?’: 기준으로 앞에 있는 것인 기본 주소(기본 Url), 뒤에 있는 것이 질의 내용(query) → 기본 URL?질의 내용
‘&’: 요청할 때 필요한 자세한 항목들을 연결하는 접속사
간략한 설명: 치킨집 사이트?메뉴=허니콤보&인분=1인분&소스=매콤소스
실제 설명: https://search.naver.com/search.naver?where=news&query=삼성전자
2. URL 방식 외에 JSON, XML 방식이 필요한 이유는 무엇인가요?JSON 데이터 구조에 사용되는 "3가지 중요 기호"와 사용법을 간략하게 정리해보세요.
복잡하게 검색하고 복잡한 검색 결과가 필요할 때, JSON이 필요함. 체계적으로 그룹화할 때 필요함
3가지 중요한 기호는 { }, [ ], :
3. (M365 버전 사용자) IMAGE 함수로 구글 QR 코드 API를 활용해 원하는 QR코드를 만드는 방법을 단계별로 정리합니다.
가. 구글 qr api 검색해서 사용 방법 익히기
예를 들면 이렇게 API를 구성해서 브라우져 주소창에 입력 (기본주소?큐알코드&크기&링크 주소)
https://chart.googleapis.com/chart?cht=qr&chs=100x100&chl=https://edufly.notion.site/API-3-8dcb585ec1f34d0dace10826f5c54163
나. 오빠두 예제 파일에서 3행에 수식 입력
=A1&A2
Visual Basic
복사
다. 오빠두 예제 파일에서 6행에 수식 입력
=A5&A3
Visual Basic
복사
라. 큐알코드 이미지를 출력하길 원하는 셀에 수식 입력
=IMAGE(A6)
Visual Basic
복사
마. 큐알코드 이미지가 들어있는 셀을 선택(초록색 표시)하고 복사한 후, 명함 만들기 시트에 그림연결로 붙여넣기
4. (M365 이전 버전 사용자) VBA로 xImage 함수를 등록하고 사용하는 방법을 단계별로 정리합니다.
가. 엑셀에서 VBA 메크로 입력창 단축키
ALT + F11
나. 삽입-모듈 순서로 클릭하기
다. 아래의 함수 코드를 입력하기
365 이전 버전 사용자 - xImage 함수 코드
Function xIMAGE(Link, Optional Margin As Long = 0, Optional UpdateImage As Boolean = True)
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'수정 및 배포 시 출처를 반드시 명시해야 합니다.
'■ xIMAGE 함수
'■ 인터넷 URL 또는 특정 파일 경로의 이미지를 삽입합니다.
'■ 사용방법
'=xImage("https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png")
'■ 인수 설명
'_____________Link : 웹 URL 또는 파일 경로입니다. 웹 URL일 경우 링크는 반드시 https:// 또는 http:// 로 시작해야 합니다.
'_____________Margin : 셀 안에 삽입할 그림에 여백을 줍니다. 픽셀 단위로 입력합니다. 기본값은 0(=여백없음)입니다.
'_____________UpdateImage : TRUE 일 경우 기존 셀 안에 삽입되어 있던 그림을 삭제하고 새로운 그림으로 갱신합니다. 기본값은 TRUE 입니다.
'###############################################################
Dim aRng As Range: Dim aWS As Worksheet
Dim shpImg As Shape
On Error Resume Next
Set aRng = Application.Caller
Set aWS = aRng.Parent
Application.EnableEvents = False
If IsEmpty(Link) Then xIMAGE = CVErr(xlValue): Exit Function
For Each shpImg In aWS.Shapes
If shpImg.TopLeftCell.Address = aRng.Address Then
If UpdateImage = True Then
shpImg.Delete
Else
xIMAGE = True
GoTo Final
Exit Function
End If
End If
Next
Set shpImg = aWS.Shapes.AddPicture(Link, msoFalse, msoTrue, _
aRng.Left + Margin, aRng.Top + Margin, _
aRng.MergeArea.Width - Margin * 2, aRng.MergeArea.Height - Margin * 2)
shpImg.Placement = xlMoveAndSize
If shpImg Is Nothing Then
xIMAGE = CVErr(xlValue)
Else
xIMAGE = True
End If
Final:
Set shpImg = Nothing: Set aRng = Nothing: Set aWS = Nothing
Application.EnableEvents = True
End Function
Visual Basic
복사
라. 큐알코드 이미지 출력을 원하는 셀에 입력
=xIMAGE(A6)
Visual Basic
복사
xImage 함수와 Image 함수의 결정적인 차이점은
xImage 함수는 결과값으로 이미지를 가져오지만
Image 함수는 해당 셀 안에 이미지를 데이터로 가져온다는 점
5. (선택) 현재 내 업무에 적용가능한 API는 무엇이 있을까요? 구글 또는 네이버에 검색 후, 어떻게 적용할 수 있을지 생각해보세요.
현재 업무 특성상 구글 설문지를 통해서 받은 설문 내용이 구글 시트에 담겨 있어서 구글 시트 내용을 활용하는 업무가 많습니다.
따라서 구글 시트 API를 이용할 수 있다면 오빠두님께서 알려주신 엑셀에 API 적용하는 방법과 유사한 방법으로 업무에 유용하게 적용할 수 있을 것 같습니다.
배운점
가. 한글 띄어쓰기 문제가 해결되지 않는다면 한글 검색어를 ENCODEURL(원하는 한글 검색어)와 같이 ENCODEURL() 함수로 씌어서 query에 넣어주면 해결할 수 있음.
나. 가로 텍스트 상자를 삽입하고 직접 텍스트를 입력하기 보다는 그림과 같이 함수입력창에 원하는 텍스트가 입력된 셀을 넣으면 텍스트 변경 사항이 자동 반영되기 때문에 업데이트가 용이함.
삽입-텍스트-텍스트상자-가로텍스트상자그리기
다. 큐알코드 등의 이미지 크기를 조정하고 싶다면 그림 서식의 자르기 기능을 통해 가능함.
3주: API, 이제 걱정하지 마세요! - 엑셀+카카오 API 연동 실습
https://www.oppadu.com/excel-api-basic-challenge/각 회차별 미션은 기한내에 꼭 제출해주세요!
개인 블로그(네이버, 티스토리) 또는 오빠두 홈페이지에 작성한 게시글 링크를 제출합니다. 제출 기한 : ~ 02월 03일(금) 자정 까지 제출 기한 내에는 링크를 자유롭게 수정할 수 있습니다.
미션 목표 :
오늘은 지금까지 알아본 API 기본기를 활용하여, 나만의 실시간 주소 검색기를 제작합니다.
엑셀에서 API를 호출하기 위한 VBA 코드가 필요하지만, 복사/붙여넣기로 누구나 쉽게 나만의 주소 검색기를 만들 수 있습니다.
작성 방법 :
•
API로 서버와 소통하는 방식에는 여러가지가 있지만, 대표적으로 사용되는 2가지 방식에 대한 간단한 설명을 정리합니다.
① GET 요청 ② POST 요청
•
브라우저의 개발자 도구로 특정 페이지의 네트워크 분석 시, 가장 먼저 살펴봐야 할 2가지 항목에 대한 설명을 간략히 정리합니다.
① Fetch/XHR ② Docs(문서)
•
API 요청 시, 서버에 전달할 부가정보를 담는 "Request Header(요청헤더)"의 주요 목적 2가지에 대한 간단한 설명을 작성합니다.
① Authorization② Content-Type
•
3주간 API 기초 챌린지를 진행하며, 가장 기억에 남는 내용/인상깊었던 내용 등을 자유 양식으로 정리합니다.
예제 파일
최종 파일
1. API로 서버와 소통하는 방식에는 여러가지가 있지만, 대표적으로 사용되는 2가지 방식
① GET 요청: 사용자가 단순하게 서버에 들어있는 정보를 가져올 때 필요한 방식
② POST 요청: 사용자 측에서 서버에 정보를 보내 필요한 정보를 가져올 때 필요한 방식
API는 서버와 소통하는 도구임
우리가 소통할 때, Give and Take하듯이, API를 통해 우리가 서버의 정보를 Get and Post함
일반적으로는 Get(Take)가 빈번하고, 로그인과 같이 아이디와 비번을 서버에 json형태로 보내야하는 경우 Post(Give)를 사용함
** 참고로 Push는 Update 성격이 강함
서버에서 잘 처리되면 200, 오류가 발생하면 400과 같은 오류 코드가 발생함
가. Get 요청 방식
나. Post 요청 방식
2. 브라우저의 개발자 도구로 특정 페이지의 네트워크 분석 시, 가장 먼저 살펴봐야 할 2가지 항목
① Fetch/XHR: 취득한 정보를 보고 싶을 때 사용하는 메뉴임. 주로 취득한 json 정보를 확인할 때 필요한 메뉴
② Docs(문서): 취득한 문서 정보를 볼 때 필요한 메뉴
가. 개발자 도구 활용 (단축키)
F12 또는 Ctrl+Shift+i
나. 브라우저의 개발자 도구로 네이버 네트워크 분석 화면
다. Fetch/XHR: 취득한 정보를 보고 싶을 때 사용하는 메뉴임. 주로 취득한 json 정보를 확인할 때 필요한 메뉴
라. Docs(문서): 취득한 문서 정보를 볼 때 필요한 메뉴
마. 네이버 로그인할 때 개발자 도구에서 네트워크 분석 (Post 방식)
3. API 요청 시, 서버에 전달할 부가정보를 담는 "Request Header(요청헤더)"의 주요 목적 2가지
① Authorization: API 인증 정보 (누가)
② Content-Type: 데이터 전송 방식 (어떻게)
API로 서버와 일반적인 소통을 할 때, ‘언제+어디로+무엇을+왜’에 해당하는 정보를 전달함
그러나 ‘누가+어떻게’에 해당하는 정보는 추가로 전달해야 함
Header의 종류
API 요청할 때, 누가&어떻게 쓰는지를 담는 곳이 Request Header
따라서 Request Header에 API 인증 정보(누가)와 테이터를 어떻게 보내는지(어떻게)에 대한 부분만 신경써서 보내주면 됨
Request Header에 담긴 2개의 정보
4. 3주간 API 기초 챌린지를 진행하며, 가장 기억에 남는 내용/인상깊었던 내용
실습을 통해 API를 완전하게 익힐 수 있었음
완전 공개된 API의 경우에는 Header의 Authorization이 필요 없음을 알게 됨
카카오 API를 사용하기 위한 방법을 알게 됨
완전 공개된 API가 아니기 때문에 Authoization이 필요
배운점
API에 한글을 보내는 경우에는 한글을 URL 형태로 보내기 위해 ENCODEURL() 함수로 묶어서 보내야 함
sURL = "https://dapi.kakao.com/v2/local/search/address.json?query=" & ENCODEURL(sAddress)
VBA 코드를 작성하고 GetKakaoAddress() 함수를 이용하여 검색할 주소에 대한 자세한 값을 가져올 수 있었음
엑셀 개발 도구의 VBA 코드를 이해할 수 있었음
Function GetKakaoAddress()
'카카오 로컬 API 개발문서
'https://developers.kakao.com/docs/latest/ko/local/dev-guide
'● 기본 변수 선언
Dim sAddress As String
Dim sURL As String: Dim APIKey As String
Dim vHeader As Variant: Dim sResult As String
Dim vResult As Variant: ReDim vHeader(0 To 1)
'● 변수 입력
'1. APIKey: 카카오 디벨로퍼 Rest API 키
'APIKey = "API키"
'2. sAddress: 검색할 주소
'sAdddress = "서울시 구로구 구로동"
'3. sURL: API로 요청할 URL
'sURL = "https://dapi.kakao.com/v2/local/search/address.json?query=" & ENCODEURL(sAddress)
'4. vHeader: API 요청에 사용할 Request Header
'vHeader(0) = Array("Content-Type", "application/json")
'vHeader(1) = Array("Authorization", "KakaoAK " & APIKey)
APIKey = ""
sAddress = ""
sURL = ""
vHeader(0) = Array("Content-Type", "application/json")
vHeader(1) = Array("Authorization", "KakaoAK " & APIKey)
'● HTTP 요청 및 결과 받아오기
'GetHTTP 함수를 사용합니다.
'사용예제:
'sResult = GetHttp(sURL,RequestHeader:=vHeader).Body.InnerHtml
'MsgBox sResult
'● 주소 추출 후 배열로 출력하기
'미리 완성해드린 GetAddress 예제 코드를 사용합니다.
'vResult = GetAddress(sResult)
'GetKakaoAddress = vResult
End Function
Function GetAddress(sResult)
'###############################################################
'API 기초 챌린지 강의용 VBA 코드입니다.
'▶ GetAddress 함수
'▶ 카카오 로컬 API 결과값에서 지번주소/도로명주소(첫번째 항목)을 배열로 반환합니다.
'###############################################################
Dim sOldAddress As String: Dim vOldAddress As Variant: Dim OldCount As Long
Dim sNewAddress As String: Dim vNewAddress As Variant: Dim NewCount As Long
Dim vResult As Variant
Dim i As Long
On Error Resume Next
sOldAddress = Splitter(sResult, """address"":{", "}")
sNewAddress = Splitter(sResult, """road_address"":{", "}")
vOldAddress = Split(sOldAddress, ",")
OldCount = UBound(vOldAddress)
If Len(sNewAddress) > 0 Then
vNewAddress = Split(sNewAddress, ",")
NewCount = UBound(vNewAddress)
End If
ReDim vResult(0 To OldCount + NewCount, 0 To 2)
For i = 0 To OldCount
vResult(i, 0) = "지번주소"
vResult(i, 1) = Replace(Split(vOldAddress(i), ":")(0), """", "")
vResult(i, 2) = Replace(Split(vOldAddress(i), ":")(1), """", "")
Next
If Len(sNewAddress) > 0 Then
For i = 0 To NewCount
vResult(i + OldCount, 0) = "도로명주소"
vResult(i + OldCount, 1) = Replace(Split(vNewAddress(i), ":")(0), """", "")
vResult(i + OldCount, 2) = Replace(Split(vNewAddress(i), ":")(1), """", "")
Next
End If
GetAddress = vResult
End Function
Function GetHttp(URL As String, Optional formText As String, _
Optional isWinHttp As Boolean = False, _
Optional RequestHeader As Variant, _
Optional includeMeta As Boolean = False, _
Optional RequestType As String = "GET") As Object
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ GetHttp 함수
'▶ 웹에서 데이터를 받아옵니다.
'▶ 인수 설명
'_____________URL : 데이터를 스크랩할 웹 페이지 주소입니다.
'_____________formText : Encoding 된 FormText 형식으로 보내야 할 경우, Send String에 쿼리문을 추가합니다.
'_____________isWinHttp : WinHTTP 로 요청할지 여부입니다. Redirect가 필요할 경우 True로 입력하여 WinHttp 요청을 전송합니다.
'_____________RequestHeader : RequestHeader를 배열로 입력합니다. 반드시 짝수(한 쌍씩 이루어진) 개수로 입력되어야 합니다.
'_____________includeMeta : TRUE 일 경우 HTML 문서위로 ResponseText를 강제 입력합니다. Meta값이 포함되어 HTML이 작성되며 innerText를 사용할 수 없습니다. 기본값은 False 입니다.
'_____________RequestType : 요청방식입니다. 기본값은 "GET"입니다.
'▶ 사용 예제
'Dim HtmlResult As Object
'Set htmlResult = GetHttp("https://www.naver.com")
'msgbox htmlResult.body.innerHTML
'###############################################################
Dim oHTMLDoc As Object: Dim objHTTP As Object
Dim HTMLDoc As Object
Dim i As Long: Dim blnAgent As Boolean: blnAgent = False
Dim sUserAgent As String: sUserAgent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Mobile Safari/537.36"
Application.DisplayAlerts = False
If Left(URL, 4) <> "http" Then URL = "http://" & URL
Set oHTMLDoc = CreateObject("HtmlFile")
Set HTMLDoc = CreateObject("HtmlFile")
If isWinHttp = False Then
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
Else
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
End If
objHTTP.setTimeouts 3000, 3000, 3000, 3000
objHTTP.Open RequestType, URL, False
If Not IsMissing(RequestHeader) Then
Dim vRequestHeader As Variant
For Each vRequestHeader In RequestHeader
Dim uHeader As Long: Dim Lheader As Long: Dim steps As Long
uHeader = UBound(vRequestHeader): Lheader = LBound(vRequestHeader)
If (uHeader - Lheader) Mod 2 = 0 Then GetHttp = CVErr(xlValue): Exit Function
For i = Lheader To uHeader Step 2
If vRequestHeader(i) = "User-Agent" Then blnAgent = True
objHTTP.setRequestHeader vRequestHeader(i), vRequestHeader(i + 1)
Next
Next
End If
If blnAgent = False Then objHTTP.setRequestHeader "User-Agent", sUserAgent
objHTTP.send formText
If includeMeta = False Then
With oHTMLDoc
.Open
.Write objHTTP.responseText
.Close
End With
Else
oHTMLDoc.Body.InnerHtml = objHTTP.responseText
End If
Set GetHttp = oHTMLDoc
Set oHTMLDoc = Nothing
Set objHTTP = Nothing
Application.DisplayAlerts = True
End Function
Function ENCODEURL(varText As Variant, Optional blnEncode = True)
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ EncodeURL 함수
'▶ 한글/영문, 특수기호가 포함된 문자열을 웹 URL 표준 주소로 변환합니다.
'▶ 인수 설명
'_____________varTest : 표준 URL 주소로 변환할 문자열입니다.
'_____________blnEncode : TRUE 일 경우 결과값을 출력합니다.
'▶ 사용 예제
's = "http://www.google.com/search=사과"
's = ENCODEURL(s)
'MsgBox s
'###############################################################
Static objHtmlfile As Object
If objHtmlfile Is Nothing Then
Set objHtmlfile = CreateObject("htmlfile")
With objHtmlfile.parentWindow
.execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"
End With
End If
If blnEncode Then
ENCODEURL = objHtmlfile.parentWindow.encode(varText)
End If
End Function
Function Splitter(v As Variant, Cutter As String, Optional Trimmer As String)
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ Splitter 함수
'▶ Cutter ~ Timmer 사이의 문자를 추출합니다. (Timmer가 빈칸일 경우 Cutter 이후 문자열을 추출합니다.)
'▶ 인수 설명
'_____________v : 문자열입니다.
'_________Cutter : 문자열 절삭을 시작할 텍스트입니다.
'_________Trimmer : 문자열 절삭을 종료할 텍스트입니다. (선택인수)
'▶ 사용 예제
'Dim s As String
's = "{sa;b132@drama#weekend;aabbcc"
's = Splitter(s, "@", "#")
'msgbox s '--> "drama"를 반환합니다.
'###############################################################
Dim vaArr As Variant
On Error GoTo EH:
vaArr = Split(v, Cutter)(1)
If Not IsMissing(Trimmer) Then vaArr = Split(vaArr, Trimmer)(0)
Splitter = vaArr
Exit Function
EH:
Splitter = ""
End Function
Sub ExportText(InnerStrings As String, Optional fileName As String = "텍스트추출", Optional Path As String)
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ Export_Text 함수
'▶ 문자열을 텍스트파일로 추출합니다.
'▶ 인수 설명
'_____________InnerStrings : 텍스트파일로 추출할 문자열입니다.
'_____________fileName : 텍스트 파일 이름입니다. 기본값은 "텍스트추출" 입니다. (선택인수)
'_____________path : 텍스트 파일을 생성할 경로입니다. 기본값은 바탕화면입니다. (선택인수)
'▶ 사용 예제
'ExportText "추출할 텍스트"
'###############################################################
Dim TextFile As Integer
Dim FilePath As String
If Path = "" Then Path = Environ("USERPROFILE") & "\Desktop\"
If Right(Path, 1) <> "\" Then Path = Path & "\"
FilePath = Path & fileName & ".txt"
TextFile = FreeFile
Open FilePath For Output As TextFile
Print #TextFile, InnerStrings
Close TextFile
End Sub
Sub ArrayToRng(startRng As Range, Arr As Variant, Optional ColumnNo As String = "", Optional LinkColumnNo As String = "")
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ ArrayToRng 함수
'▶ 배열을 범위 위로 반환합니다.
'▶ 인수 설명
'_____________startRng : 배열을 반환할 기준 범위(셀) 입니다.
'_____________Arr : 반환할 배열입니다.
'_____________ColumnNo : [선택인수] 배열의 특정 열을 선택하여 범위로 반환합니다. 여러개 열을 반환할 경우 열 번호를 쉼표로 구분하여 입력합니다.
' 값으로 공란을 입력하면 열을 건너뜁니다.
'_____________LinkColumNo : [선택인수] 하이퍼링크로 출력할 열 번호입니다. 쉼표로 구분하여 입력합니다.
'▶ 사용 예제
'Dim v As Variant
'ReDim v(0 to 1)
''v(0) = "a" : v(1) = "b"
'ArrayToRng Sheet1.Range("A1"), v
'▶ 사용된 보조 명령문
'Extract_Column 함수
'##############################################################
On Error GoTo SingleDimension:
Dim Cols As Variant: Dim Col As Variant
Dim LinkCols As Variant: Dim LinkCol As Variant
Dim i As Long: Dim X As Long: X = 1
Dim colNo As Long
If ColumnNo = "" Then
startRng.Cells(1, 1).Resize(UBound(Arr, 1) - LBound(Arr, 1) + 1, UBound(Arr, 2) - LBound(Arr, 2) + 1) = Arr
If LinkColumnNo <> "" Then
LinkCols = Split(LinkColumnNo, ",")
For Each LinkCol In LinkCols
For i = 1 To UBound(Arr, 1) - LBound(Arr, 1) + 1
colNo = CLng(Trim(LinkCol))
startRng.Parent.Hyperlinks.Add startRng.Cells(i, colNo), startRng.Cells(i, colNo).Value
Next
Next
End If
Else
Cols = Split(ColumnNo, ",")
LinkCols = Split(LinkColumnNo, ",")
For Each Col In Cols
If Trim(Col) <> "" Then
startRng.Cells(1, X).Resize(UBound(Arr, 1) - LBound(Arr, 1) + 1) = Extract_Column(Arr, CLng(Trim(Col)))
For Each LinkCol In LinkCols
If Trim(LinkCol) = Trim(Col) Then
For i = 1 To UBound(Arr, 1) - LBound(Arr, 1) + 1
startRng.Parent.Hyperlinks.Add startRng.Cells(i, X), startRng.Cells(i, X).Value
Next
End If
Next
End If
X = X + 1
Next
End If
Exit Sub
SingleDimension:
Dim tempArr As Variant
ReDim tempArr(LBound(Arr, 1) To UBound(Arr, 1), 1 To 1)
For i = LBound(Arr, 1) To UBound(Arr, 1)
tempArr(i, 1) = Arr(i)
Next
startRng.Cells(1, 1).Resize(UBound(Arr, 1) - LBound(Arr, 1) + 1, 1) = tempArr
End Sub
'########################
' 배열에서 특정 열 데이터만 추출합니다.
' Array = Extract_Column(Array, 1)
'########################
Function Extract_Column(DB As Variant, Col As Long) As Variant
Dim i As Long
Dim vArr As Variant
ReDim vArr(LBound(DB) To UBound(DB), 1 To 1)
For i = LBound(DB) To UBound(DB)
vArr(i, 1) = DB(i, Col)
Next
Extract_Column = vArr
End Function
Visual Basic
복사