먼저 본인의 프로젝트는 스마트폰에서 구독한 RSS를 TTS기능으로 보이스로 읽어주는 프로젝트입니다. 4시간 만에 어떻게 할 프로젝트도 아니고 아무런 준비도 없었기에 자포자기하며 버스에 올라 탔습니다.
버스에서 곰곰이 생각해 보았습니다. 아주 간단하고 신선하고 놀라운 게 무엇이 있을까??
잠시 고민 하다가 엑셀! OpenAPI하고 엑셀의 VBA하고 연결해 보자! 라는 아이디어가 떠올랐습니다. 누가 생각이나 해봤을까요? 훗훗
문서작업에 키워드를 이용하여 그림으로 변환시키는 매크로를 OpenAPI를 사용하는 프로젝트로서 함수 하나만 만들면 되겠지 하며 버스의 창 밖을 입 꼬리 올린 썩소를 지으며 향했습니다. (그러다 푹 자고..)
자 이젠 도착하고! 자기 소개와 팀 결성을 한 후 본격적으로 타이핑이 시작되었습니다.
코딩에 물이 오를 찰나에 점심시간이 되었고 역시나 아웃백에 가서 스테이크를 뜯었습니다. 그러나 윤석찬님께서 양이 줄지 않았냐는 물음에 왠지 그런 거 같았습니다. 별로 배부르지 않았기에 혹시 물가로 양이 줄지 않았을까 생각이 들었지만 머릿속은 코딩으로 꽉 차 있어서 다른 음식으로 배를 채울 생각이 없었습니다.
더군다나앞에단 2명으로소중하신여성분들과마주보고있어서즐거웠
역시 코딩에 집중을 가하면 시간이 쏜 살 같이 가는 듯 합니다. 어느덧 종료시간이 다 되어 가고 있었으며 완성되지 못한 채 발표를 하게 되었지요.
안타깝게도 멋지게 그림이 슝슝 나오는 장면을 보여 드리고 싶었지만...정말 안타까웠습니다. 2시간만더연장되었으면
제가 처음 시간에 소개하며 말한 내용이 생각 나네요.
"프로젝트의결과보다서로연결되는그런장소가되었으면좋겠습니다"
연결..., 저는 뜻하지 않는 몇 분과 많은 대화를 나누었습니다. 제 얘기만 주르륵 한 거 같아서 죄송지만요.
많은 데이터를 변환할 때 직접 프로그래밍을 하거나 일일이 작업하는 것을 봐왔습니다. 하지만 본인은 엑셀의 VBA를 사용하여 한번에 간편하게 처리를 하게 됩니다.
사실 일일이 작업하는 시간과 VBA를 구현하는 시간이 동일 할 순 있습니다. 하지만 요구사항 변경시에는 몇 배의 효과가 나타나게 되며 VBA의 잦은 구현으로 노하우가 생기게 되어 더 빠른 구현이 가능하게 됩니다.
아주 강력한 VBA 기능에 조금 아쉬운 것은 다양한 예제가 없고 도움말도 많은 도움이 되지 못한다는 것입니다. 그리고 프레임웍의 기능이 약해서 웹 서비스나 현 기술에 걸맞은 작업 시 찝찝한 편법을 구사해야 한다는 것이죠.
이번 Daum 데브데이 프로젝트는 OpenAPI를이용하여엑셀문서에키워드를그림으로표현한다는 것입니다. 이 프로젝트는 카이스트의 심규진님과 함께 하였습니다.
일반 자바나 C# 같은 고급언어는 주소를 요청하고 받은 XML을 파싱하여 원하는 데이터만 끌어 쓰면 그만입니다. 하지만 VBA는 도저히 그런 쉬운 방법이 없었습니다. XML을 웹에서 바로 받는 것은 없으며 XML을 엑셀에 통합하려는 기능은 있었습니다.
저는 XML을 바로 요청하고 파싱하는 예제나 방법을 열심히 찾았고 심규진님은 편법을 이용한 방법을 구현하였습니다. 결국 시간상, 기능상 심규진님의 방법을 사용하였으며 의외로 아주 잘 돌아갔습니다.(심규진님 아니었으면....ㄷㄷㄷ)
심규진님의 방법은 XML을 새로운 엑셀 시트에 매핑하고 매핑된 시트에 행과 열을 찾아 중요데이터를 긁어 오는 방법이었습니다.
그런데 매핑된 시트는 중요데이터의 위치가 키워드마다 달라 열에 있는 데이터가 진짜 데이터인지 검사하는 모듈을 삽입 하여야 했습니다. 편법도 아주 뺑 돌아서 구현된 결과이지요. 사실 더 빠르고 간단하게도 할 수 있었을 것이지만 시간의 문제로 오로지 결과를 위해 달려야 했습니다.
구현한 코드를 보겠습니다.
Public Sub RequestTest()
Dim urlApi As String Dim wb As Workbook Dim getImageURL As String Dim getImageURL2 As String Dim oneCell As Range Dim pic As PictureFormat For Each oneCell In Selection Dim se As Object
Set se = ActiveSheet urlApi = http://apis.daum.net/search/image?q= & oneCell.Value & --여기에 현재 선택된 키워드 삽입 "&result=10&start=1&output=xml&apikey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
-새로운 시트를 만들고 XML을 매핑한다 Set wb = Workbooks.Open(urlApi, IgnoreReadOnlyRecommended:=True, ReadOnly:=True)
For I = 10 To 15 -새로 만들어진 시트에 "/item/thumbnail" 값을 찾고 바로 아래 행 정보 얻기 If wb.Sheets("image").Cells(2, I) = "/item/thumbnail" Then getImageURL = wb.Sheets("image").Cells(3, I) getImageURL2 = wb.Sheets("image").Cells(3, I - 3) 'Set p = se.Pictures.Insert("http://static.naver.com/kin/ending/btn_reply_metoo.gif") Exit For End If Next I -키워드 1칸 옆에 썸네일사진주소와 2칸 옆에 링크주소를 넣는다 oneCell.Offset(0, 1).Value = getImageURL oneCell.Offset(0, 2).Value = getImageURL2
-XML과 매핑된 새로운 시트를 저장하지 않고 종료한다. wb.Close (False)
Next oneCell
End Sub
먼저 VBA의 능숙한 실력이 아니라 문법도 힘들어 For문 조차도 도움말을 보면서 작성을 하였습니다. 여러 가지 우여곡절 끝에 결국 사진은 시트에 표현을 못하고 링크 주소만 출력하였는데 그럴 수밖에 없는 이유는 엑셀은 이미지를 URL을 사용하여 올릴 수 있지만 내부는 이미지를 다운받고 시트에 삽입하게 되어 있습니다. 이 방법을 코드로 구현 하려면 웹 이미지를 로컬메모리에 올리고 시트에 삽입을 해야 하는 것이죠.
링크주소의 이미지를 다운받고 삽입한다는 건 쉬운 기능이겠지만 아직 능숙한 실력이 아니고 또한 시간은 촉박했기에 못내 아쉽지만 주소만 출력하기로 결정하였습니다.
가능성
우리 팀은 큰 가능성을 보였습니다. OpenAPI를 통해 웹이든 로컬이든 여러 서비스를 할 수 있지만 문서작성에서도 적용 할 수 있다는 것이죠.
이 기능을 사용한다면 많은 기업이나 제품이름을 선택만 하고 매크로를 실행만 하면 됩니다. 그럼 문서는 단지 매크로 실행으로 이미지가 삽입이 되고 문서는 이해하기 쉬운 멋진 문서가 될 것입니다.
마지막으로 같은 팀으로 작업한 심규진님에게 감사를 드립니다. 심규진님이 아니었다면 아마 저 혼자 끙끙 되었을 것입니다.