rand(life)

[vba] 다른 시트에 있는 그림 랜덤으로 불러오기(이미지컨트롤) 본문

컴퓨터/엑셀

[vba] 다른 시트에 있는 그림 랜덤으로 불러오기(이미지컨트롤)

flogsta 2017. 8. 15. 22:09

사용자 정의 폼은 아직 익숙하지 않다

원래는 "어떤 시트에 있는 그림 중 랜덤으로 다른 시트에 불러오고 싶다"는 지식인 질문이 있어서 거기에 대한 답을 하려고했다.

그림 자체만 불러오는 것은 쉽다


 Set ws = Sheets("sheet2")
    For Each pic In ws.Pictures
        ReDim Preserve arr(1, i)
        arr(0, i) = pic.Name
        arr(1, i) = pic.TopLeftCell.Address
        i = i + 1
    Next pic


이런 식으로 Sheet2에 있는 그림의 이름을 배열로 받은 다음, 배열의 인수를 랜덤으로 돌려서

그 인수를 가진 배열에서 그림의 이름을 받아와서 시트에 불러오면 된다. (복사 - 붙여넣기)


그런데, 조건이 하나 있었던 것이 "이미지 틀"에 불러오고 싶다는 것이었다.

이 부분이 좀 어려웠다. 대개 이미지 컨트롤에 불러올 때는 URL이나 하드디스크의 경로에서 불러오는 것이지

같은 파일의 다른 시트에 있는 그림을 불러오는 방법은 잘 쓰지 않기 때문이다


구글링을 해보니 두 가지 방법이 나왔다.


1. 시트에 있는 그림을 HDD에 저장했다가, LoadPicture로 불러오면서 해당 그림의 경로를 지정하고,

불러온뒤에는 HDD에 저장했던 이미지를 삭제하는 방법

(예를 들어, 이렇게 할 수 있다)


2. 윈도우 API를 이용하는 방법

2번의 방법은 첨부화일에 있다. 역시 출처는 구글링을 통해 얻었다.

randpic.xlsm


마지막에, 그림 옆에 해당 그림이 있는 셀의 주소를 표시해주는 데서 또 삽질 반복.

처음에는 TextBox를 만들고 거기에 텍스트를 표시하려고 했는데, TextBox는 텍스트의 "입력"을 받는 컨트롤이라는 것을 뒤늦게 알고

Label을 이용하기로 했다.


   Controls("Label1").Caption = CStr(arr(1, lpic))

arr은 위에서 그림파일의 이름과 셀주소를 받은 배열이고

lpic은 랜덤으로 뽑은 숫자이다.