나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내
작성자:  

 조삿갓 (choga21)

추천:  2
파일:     셀버튼[2].xlsm (38KB) 조회:  2398
제목:   [Tip] 셀참조를 활용한 컨트롤 배열 흉내내기
     
  [Tip] 셀참조를 활용한 컨트롤 배열 흉내내기

앞에 답변과 같이
MS Visual Studio에 포함된 VB 원형에서는
컨트롤 배열을 사용할 수 있어서 효율적인 코딩이 가능하지만

MS-Office에 포함된 VBA에서는 그 편리한 컨트롤 배열을
원천적으로 지원하지 않습니다.
이는 경우에 따라 엄청난 노가다 코딩이 필요하다는 의미이기도 합니다.

다만, 엑셀의 경우 사용자 정의 폼 뿐만 아니라
워크시트에 직접 배치하는 양식 컨트롤과 ActiveX 컨트롤이라는
두 가지 종류의 입력 양식을 제공하므로
그 나름대로의 특징을 잘 이용하면
마치 컨트롤 배열처럼 코딩의 효율화를 꾀할 수 있는 방법이 생깁니다.

뭐 더 찾아보면 다른 다양하고 창의적인 방법이 있을 수도 있겠지만
일단 현재까지 제가 찾아 본 방법에 의하면

명령단추(CommandButton)의 경우는 앞에 소개한 바와 같이
셀 자체를 장식에 의해 단추처럼 보이게 하고
Worksheet_SelectionChange 이벤트를 가로채서
버튼처럼 동작하게 코딩할 수 있고

확인란(CheckBox)이나 옵션단추(OptionButton = RadioButto)의 경우는
양식 컨트롤을 사용할 경우
그 선택 여부를 특정 셀의 값으로 연결하며
그 특정 셀은 사용자가 지정해 줄 수 있다는 특징을 이용하면
가능성이 생깁니다.

양식 컨트롤의 경우에는 Change 이벤트를 처리할 수 없고
매크로 연결에 의해서 Click 이벤트에만 반응하는 코딩이 가능합니다.
그리고 양식 컨트롤에 연결하는 매크로 프로시저는
일반 모듈에 코딩해야 합니다.(워크시트 개체 모듈에 있는 프로시저는 연결 불가)

따라서, 규칙적으로 배열된 양식 체크박스(확인란)에
모두 동일한 프로시저를 매크로로 연결하고
그 프로시저 안에서 각 체크박스에 연결된 셀들의
행번호나 열번호를 참조하여 배열처럼 확인하고 처리하면
마치 컨트롤 배열처럼 일관되고 간편한 코딩을 하고
동작하게 할 수 있겠지요.

----------------------------------------

첨부한 파일의 CellButton 모듈에는

여러 개의 체크박스나 옵션버튼을 규칙적으로 자동 생성해 주되
셀을 기반으로 그 위치나 크기를 규칙적으로 지정할 수 있고
셀 연결이나 매크로 연결 역시 규칙적 또는 일률적으로 지정할 수 있는
프로시저를 제공합니다.

AddCheckBox(Optional ByVal PositionRow As Long, Optional PositionCol As Long, _
            Optional ByVal LinkedRow As Long, Optional ByVal LinkedCol As Long, _
            Optional ByRef uname As String, Optional ByRef Caption As String, _
            Optional ByVal Disp3D As Boolean, Optional ByVal Action As String)

AddOptionButton(Optional ByVal PositionRow As Long, Optional PositionCol As Long, _
            Optional ByVal LinkedRow As Long, Optional ByVal LinkedCol As Long, _
            Optional ByRef uname As String, Optional ByRef Caption As String, _
            Optional ByVal Disp3D As Boolean, Optional ByVal Action As String)

Cells(PositionRow, PositionCol) 셀 안에 꼭 들어맞는 크기로
체크박스 또는 옵션버튼을 생성합니다.
PositionRow나 PositionCol이 생략되면, ActiveCell의 행번호나 열번호를 기준으로 합니다.
그리고 컨트롤의 값은 Cells(LinkedRow, LinkedCol) 셀에 연결됩니다.
LinkedRow나 LinkedCol이 생략되면, PositionRow나 PositionCol을 기준으로 합니다.
컨트롤의 이름(인스턴스)은 uname으로,
캡션(표시 텍스트)은 Caption으로 지정할 수 있는데
생략할 경우에는 시스템이 내정치로 설정하는 이름이나 캡션으로 지정되고
그 값이 반환됩니다.
Disp3D는 3차원 음영 여부
Action은 매크로 연결할 프로시저 이름을 지정합니다.

옵션버튼은 그룹상자(프레임) 안에 넣어야 하므로
AddOptionButton 프로시저를 호출하기 전에 먼저
AddGroupBox 프로시저를 호출해야 합니다.

AddGroupBox(Optional ByVal PositionRow As Long, Optional PositionCol As Long, _
            Optional ByVal WidthCells As Long, Optional ByVal HeightCells As Long, _
            Optional ByRef uname As String, Optional ByRef Caption As String, _
            Optional ByVal Disp3D As Boolean)

Cells(PositionRow, PositionCol) 셀로부터
우측으로 WidthCells 칸, 아래로 HeightCells 줄만큼의 영역에 옵션버튼을 넣을 수 있도록
그룹상자를 만들어줍니다.
실제 그룹상자의 프레임은 Cells(PositionRow-1, PositionCol-1)로부터
Cells(PositionRow+WidthCells, PositionCol+HeightCells) 영역에 걸치게 됩니다.
uname, Caption, Disp3D 등의 파라메터는 AddOptionButton의 경우와 같습니다.
 
[불량 게시물 신고]  
        
  

작성일 : 2018-05-19(21:28)
최종수정일 : 2018-05-19(21:30)
 


 ◎ 관련글

  제 목   작성자   날짜
매크로 실행 버튼 위치 참조 및 체크박스 위치 참조. 봄봄 2018-05-14
[RE]매크로 실행 버튼 위치 참조 및 체크박스 위치 참조. 조삿갓 2018-05-16
[Tip] 셀참조를 활용한 컨트롤 배열 흉내내기 조삿갓 2018-05-19