ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Excel 매크로 (VBA) - 021. 인풋박스 (InputBox) 사용 방법
    Excel/Excel 매크로 2022. 9. 14. 21:56
    728x90

    전체 목차

     - 001. 특정 행을 복사하여 삽입하기

     - 002. 선택하여 붙여 넣기 기능 정리

     - 003. 변수/Assignment/Loop/비교

     - 004. 데이터가 있는 셀의 범위 알아내기

     - 005. 데이터 시트(쉘) 순회하기

     - 006. 셀 병합 하기

     - 007. 변수에 저장되어 있는 데이터 확인하기 (디버그 기능) 

     - 008. 정렬하기 (Sort)

     - 009. 버튼 컨트롤 (Excel Form vs. ActiveX)

     - 010. 콤보 상자 컨트롤 (Excel Form vs. ActiveX)

     - 011. 확인란/옵션단추 컨트롤(Excel Form vs. ActiveX)

     - 012. 스핀단추 컨트롤(스피너, Excel Form vs. ActiveX)

     - 013. 자동필터(Auto Filter)

     - 014. 함수(function) (전편)

     - 015. 함수(function) (후편)

     - 016. 중복 데이터 제거하기 

     - 017. 텍스트 나누기 (공백, 특수문자)

     - 018. Vlookup으로 데이터 조회하기(주식 종목 코드 조회)

     - 019. 런타임 에러 처리 (1)

     - 020. 런타임 에러 처리 (2)

     

    포스트 목차.

    01. 인풋 박스란.

    02. 인풋 박스 사용 방법

    03. 예제 및 설명

     

    01. 인풋 박스란.

     

    매크로 실행 도중에 사용자의 입력을 받을 일이 필요한 경우가 있다.  특정 값을 입력받을 필요가 있을 수도 있고, 셀의 범위(Range)를 입력 받을 필요가 있을 수도 있다. 

     

    이런 경우에 활용할 수 있는 것이 인풋박스이다.

     

    다음 그림과 같은 창이 팝업되며, 사용자의 입력을 기다리게 된다.

    경우에 따라 입력되는 값의 종류에 대한 제어를 할 수 있다. 다음 그림은 숫자를 입력받기를 원하는데, 문자를 입력할 경우에 나오는 경고 메시지이다.

     

    02. 인풋 박스 사용 방법

     

    Application.InputBox 메소드를 이용하여 인풋박스를 사용자에게 노출 시킬 수 있다. 

     

    InputBox 메소드는 다음과 같은 파라미터를 갖는다.

    이름 필수여부 타입 설명
    Prompt 필수 String 최대 255 문자의 문자열(디스플레이될 때 자동으로 문자로 변환)
    위 그림에서의 Prompt 부분에 나오는 문자열이다.
    Title 생략가능 Variant 위 그림의 Title 부분에 해당, 생략 시 "입력"
    Default 생략가능 Variant 위 그림의 Default 부분에 해당하며, 사용자 입력이 없을 경우 자동으로 채워지는 값을 의미한다. 사용자 입력 시 바로 지워질 수 있게 선택된 상태로 노출된다.
    Left 생략가능 Variant 스크린의 좌상단을 기준으로 대화상자의 X축 좌표를 의미 (포인트)
    * Excel 2007이후에는 동작 안한다는 이야기가 있으며, Excel 2016에서도 안되는 것으로 보인다.
    Top 생략가능 Variant 스크린의 좌상단으 기준으로 대화상자의 Y출 좌표를 의미 (포인트)
    * Excel 2007이후에는 동작 안한다는 이야기가 있으며, Excel 2016에서도 안되는 것으로 보인다.
    HelpFile 생략가능 Variant Help 파일의 경로
    HelpContextID 생략가능 Variant Help 주제의 context ID 
    Type 생략가능 Variant 메소드가 반환하는 반환 값의 타입, 생략시 문자열

    Type을 지정하면 사용자 입력 부분에 대해 유효성 검사를 자체적으로 수행한다. 다음과 같은 값으로 타입을 지정할 수 있으며, 여러가지 타입을 동시에 수용하고 싶을 때는 아래 Type의 값을 더하여 사용하면 된다.

     

    설명
    0 수식
    1 숫자
    2 문자열(String)
    4 논리값 (True or False)
    8 셀 참조 (Range 객체)
    16 에러 값 (#N/A)
    64 배열 (eg . {11,22,33})

     

    본격적인 예제를 다루기전에 간단한 예제를 통해 사용방법을 익혀보자

     

    1
    2
    3
    4
    5
    6
    7
    Sub popupInputBoxReturnNumber()
        num1 = Application.InputBox(Prompt:="숫자1 입력", Title:="숫자1", Type:=1)
        num2 = Application.InputBox(Prompt:="숫자2 입력", Title:="숫자2", Type:=1)
        
        Set dataRng = Application.InputBox(Prompt:="셀을 선택하시오", Title:="결과를 표기할 셀 선택", Type:=8)
        dataRng(1).Value = num1 + num2
    End Sub
    cs

    위의 예제는 총 3개의 인풋박스를 띄운다. 

    2: 첫번째 인풋박스, Prompt 부분에 "숫자1 입력", Title 부분에 "숫자1"을 지정했다. Type는 1로 정해서 숫자만 수용가능하도록 설정했다.

    3: 두번째 인풋박스, Prompt 부분에 "숫자2 입력", Title 부분에 "숫자2"을 지정했다. Type는 1로 정해서 숫자만 수용가능하도록 설정했다.

    5: 세번째 인풋박스, Prompt 부분에 "셀을 선택하시오", Title 부분에 "결과를 표기할 셀 선택"을 지정했다. Type는 8로 정해서 셀 참조(Range)를 입력 받을 수 있게 했다.

    6: 세번째 인풋박스에서 입력받은 Range 중에서 첫번째 셀에, 첫번째 인풋박스에서 받은 값과  두번째 인풋박스에서 받은 값을 더한 값을 저장한다.

     

    위의 Sub 프로시저를 실행한 결과는 다음과 같다.

    첫번째 인풋박스 실행 & 사용자 입력 3

     

    두번째 인풋박스 실행 & 사용자 입력 5

     

    세번째 인풋박스 실행 & 사용자 입력(셀 A1을 클릭하여 A1입력)

     

    셀 A1에 3+5의 결과값 출력

    03. 예제 및 설명

     

    다음과 같은 예제 코드를 작성해보자.

     

    (1) 사용자에게 셀 참조(Range 객체)를 입력 받은 후, 해당 셀들에 있는 내용을 텍스트 형태로 결합

    (2) 단, 결합 시에는 셀과 셀에 있는 내용 구분을 위해 공백 문자(" ") 삽입

    (3) 사용자에게 셀 참조(Range 객체)를 입력 받은 후, 해당 범위의 첫번째 셀에 (1)-(2)에서 연산한 결과(텍스트 결합)를 출력

     

    위의 문제를 해결하기 위해, 두개의 Sub 프로시저를 작성하려고 한다.

    (1) Sub 프로시저 1

       - 사용자에게 문자결합을 할 셀 참조를 입력받는다

       - Sub 프로시저2를 호출하면서 사용자에게 입력받은 셀 참조를 파라미터로 넘긴다.

     

    1
    2
    3
    4
    5
    6
    Sub popupInputBoxReturnRange()
     Dim rng As Range
     Set rng = Application.InputBox(Prompt:="셀(범위)을 선택하시오", Title:="내용 병합할 셀 선택", Type:=8)
     Call concatenateAll(rng)
     
    End Sub
    cs

    2: 인풋박스로 입력받을 Range를 저장하기 위한 변수 선언

    3: 인풋박스(Prompt = "셀(범위)을 선택하시오", Title="내용 병합할 셀 선택", Type(8: 셀주소)) 실행 후, 사용자가 입력한 값을 rng 변수에 저장
    4: Sub 프로시저2 (concatenateAll 호출, rng 를 파라미터로 넘김)

     

    (2) Sub 프로시저 2

      -  Range 객체를 입력받해당 Range에 있는 모든 셀의 데이터를 텍스트 형태로 결합한다.

      - 사용자에게  결합한 데이터를 출력할 셀 참조를 입력받는다.

      - 사용자가 입력한 셀에 텍스트 결합 결과물을 출력한다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub concatenateAll(rng As Range)
        Dim myText As String
        myText = ""
        For Each Item In rng.Cells
            If myText = "" Then
                myText = Item.Value
            Else
                myText = myText & " " & Item.Value
            End If
        Next Item
          
        Set dataRng = Application.InputBox(Prompt:="셀을 선택하시오", Title:="결과를 표기할 셀 선택", Type:=8)
        
        dataRng(1).Value = myText
    End Sub
    cs

    2: 결과값(결합된 텍스트)가 저장될 변수 선언

    3: 결과값을 빈 문자열로 초기화

    4-10: 파라미터로 전달받은 rng (range객체)에 있는 모든 셀을 순회하며 텍스트 결합

       - &: 텍스트 결합 연산자

       - 첫 데이터의 경우 공백문자를 삽입하지 않는다.

    12: 인풋박스를 출력하여, 결과값이 표기될 셀을 입력받는다.

    14: 입력받은 범위 중에서 첫번째 셀(Range의 좌상단 셀)에 계산한 텍스트 데이터를 삽입한다.

     

    위의 코드를 실행해보자.

    (1) 실행 결과 1

    내용을 병합할 셀 선택 (A1:A12)

     

     

    결과를 표기할 셀 선택 (B1)

     

    B1에 결과값 표기

    (2) 실행 결과 2

     

    이번에는 Range 객체 입력 시에 결과를 여러 개로 끊어서 입력해보자. 컨트롤 키를 누른상태로 여러 범위를 입력하는 것이 가능하다.

    내용을 병합할 셀 선택 (A1:A3, A4:A6, A7:A9, A10:A12)

    그림에서는 공간때문에 데이터가 짤려있지만 실제로는 A1:A3, A4:A6, A7:A9, A10:A12 영역이 선택되었다.

     

    결과를 표기할 셀 선택 (B2)

     

    B2에 결과값 표기

     

    셀 참조(Range 객체를 입력받을 때는 여러개로 끊어서 입력하는 것도 가능하다는 것을 확인했다.

     

    728x90
Designed by Tistory.