본문 바로가기

Excel

[VBA 연습문제] for문 과 문자함수 mid

과제 [VBA 초보용]

문제1

그림처럼 A1셀의 문자를 한자씩 추출하여 왼쪽에서 오른쪽으로 셀마다 한자씩 나열 하는 방법은?

 

결과

 

VBA코드로 위 그림과 같이 나열해보겠습니다.

VBA코드를 만들어 실행하면 위 그림과 같은 결과를 만듭니다.

아래에서 설명은 초보자를 위해 자세하게 설명했습니다.

모듈삽입

모듈추가하기

엑셀을 실행하고, VBA를 작성하기 위해 alt키를 누른 상태에서 F11키보드를 누르면 위 드림과 같은 화면이 나오고

위 그림과 같이 왼쪽 "현재_통합_문서"부분에서 오른쪽 마우스를 클릭하면 위 그림과 같은 메뉴가 나오고

모듈을 클릭하면 모듈이 삽입됩니다.

 

VBA작성

 

Sub 문자_자르기() 
    Dim val_ As String 
     
    val_ = Range("A1").Value 
    For i = 1 To Len(val_) 
        Cells(2, i).Value = Mid(val_, i, 1) 
    Next i 
End Sub

[ VBA 코드 설명 ]

"Sub 함수이름"을 쓰고 엔터를 치면

Sub 문자_자르기()
End Sub

위 2줄이 자동으로 입력됩니다.

 

변수

val_이라는 변수에 A1셀의 값을 담아줍니다.

val_ = Range("A1").Value

 

변수라는 것은 변하는 수라는 것이고

바구니와 같은 것이라고 생각하면 되고

어떤 것을 담을 수 있고 뺄 수도 있는 것이라고 생각하면됩니다.

함버거를 담은 변수 빵도 가능

위 바구니에 사과도 담을 수 있겠지요

기타 많은 것을 담을 수 있습니다.

담는 내용물에 따라...

사과바구니,헴버거바구니,빵바구니...로 변하겠지요.

이와 같은 것을 변수라고 합니다.

 

프로그래밍에서는 '데이타'를 담습니다.

변수에 대한 자세한 설명은 구글 검색하시면 됩니다.

 

Range("A1").Value 의 의미

Range("A1") : A1셀을 가리키는 코드입니다.

B1셀은? Range("B1") 이렇게 하면 됩니다.

Value : 이것은 값을 참조하겠다는 뜻입니다.

그래서

Range("A1").Value : A1셀의 값을 의미합니다.

= 기호는 왼쪽에 오른쪽 값을 집어 넣겠다는 뜻입니다.

그래서 val_ = Range("A1").Value

val_이라는 변수(바구니?)에 A1셀의 값을 집어넣겠다는 뜻입니다.

 

변수선언

변수를 사용했으니 변수를 윗부분에 선언해줍니다.

Dim val_ As String

 

Dim은 변수를 선언할 때 맨앞에 붙여줍니다.

Dim 변수이름 As 변수의형태

식으로 선언합니다.

변수의 형태는...

문자 : String

정수 : Integer

큰수 : Long

기타 : Varient

...

Varient는 써주지 않아도 됩니다.

Dim val_ 이렇게만 써도...

Dim val_ As Varient와 같습니다.

이것외에도 많이 있는 것으로 알지만

지금까지 이것만 알아도 다되었습니다.

특별한 경우가 있다면...

예를 들어 에러가 난다든지해서 다르게 해야 할 경우라면

구글 검색하여 사용하면 된다고 생각합니다.

그래도 위에 것에 대해 모두 안다면

미리 시간날 때 공부하는 것이 좋을 것입니다.

처음에는 위에 것만 알아도 충분하다고 생각합니다.

 

그외 자세한 내용은 이곳 참조하시거나,

구글에서 "vba 변수선언" 검색해보시면 나옵니다.

Dim 말고도 다양한 방법으로 선언하는 방법이 있지만

(저도 이사실은 몰랐었습니다. Dim 하나말 알아도 괜찮다 충분하다는 의미입니다.)

저는 거의 Dim만 사용했습니다. 다른 방법도 나중에 알아봐야 겠습니다.

그렇지만 Dim하나만으로 지금까지 사용하는데 지장이 없었습니다.

 

VBA에서는 변수를 선언하는 부분을 생략해도 에러가 나지 않습니다.

저는 보통 Dim부분은 생략하고 작성합니다.

그런데 VBA코드맨위에 "Option Explicit" 이런 문장이 있다면

VBA문법을 엄격하게 적용하겠다는 뜻이고

변수 정의 부분을 생략할 수 없습니다.

그렇지만 변수를 사용할 때마다

VBA코드 위쪽에 가서 선언해주는 것이 좋은 습관이라고 생각합니다.

관행이라고 할까요? 변수는 보통 코드의 위쪽에 선언합니다.

선언하지 않았는데 사용부터하면 에러가 날 수 있으니 그럴 것으로 생각됩니다.

 

For문

For 문의 자세한 내용은 구글 검색해보시면 됩니다.

For 카운트변수 = 시작수 To 끝나는 수 (카운트 수 증가 방법)

       '안쪽부분에 코드작성

Nex 카운트변수

이렇게 쓰고 안쪽에 코드를 작성해 주면 됩니다.

For문은 VBA에서 매우 많이 사용합니다.

다른 언어 C, Java, JavaScript, Python...등의 언어에서도 유사하게 사용하는 것입니다.

 

For문은 안쪽부분의 코드를 시작수부터 끝나는 수까지 반복해서 실행하겠다는 것입니다.

(카운트 수 증가 방법)이것은 거의 사용하지 않습니다.

이것은 꺼꾸로 실행(마지막수 부터 시작수)로 실행하거나

카운트변수가 1씩 증가하지 않고(1씩증가 하는 것이 기본입니다)

2씩혹은 3씩등 증가 한다거나 할 때 사용합니다.

이런 경우는 특수한 경우이고 별로 사용하지 않습니다.

사용할 때마다 For문 검색해서 찾아보고 코드를 작성하면 될 것 같습니다.

For i = 1 To Len(val_) 
        Cells(2, i).Value = Mid(val_, i, 1) 
Next i

위 VBA코드에서

For i = 1 To Len(val_) 

의 의미는...

안쪽에 있는 코드를 1부터 Len(val_)까지 실행하겠다는 뜻입니다.

Len(val_) : 이것은 val_변수에 글자수를 나타냅니다.

Len(문자열)식으로 사용하는 함수입니다.

Len 함수에 대한 자세한 설명은 구글 검색하시면 됩니다.

구글 검색 : VBA Len 함수 ,

구글 검색 : VBA 문자 개수

이렇게 검색하면 나옵니다. VBA코드를 작성할 때는 이런 함수들을 외울 필요가 없다고 생각합니다.

위처럼 사용할 때 마다 검색하여 찾아서 쓰거나 잘 정리하여 필요할 때마다 찾아서 쓰면됩니다.

자주사용하는 것은 자주 쓰다보면 저절로 외워집니다.

 

그러니

For i = 1 To Len(val_) 

이것의 의미는 1부터 val_변수에 들어있는 글자수만큼 For문 안쪽에 VBA코드를 반복하겠다는 의미입니다.

 

다음으로...

Cells(2, i).Value = Mid(val_, i, 1)

이부분이 핵심이라고 생각됩니다.

Cells(2, i).Value 이것은 윗부분에서 설명한 것과 같이

Cells(2,i)의 값을 의미합니다.

 

셀을 표현하는 방법 2가지

  • Range("A1")
  • Cell(행,열)

Cells(2,i)이것은 셀을 의미합니다.

VBA코드에서 엑셀의 셀을 의미하는 방법은 2가지?가 있습니다.

더 있는지는 확실하지 않습니다. (저는 이것만으로 지장이 없었습니다. 더 공부하실 분은 찾아보시기 바랍니다)

 

엑셀의 셀을 의미하는 방법은 2가지는 위쪽에서 보았던 Range("A1")처럼 사용하는 것이고

또 하나는 Cell(행,열) 이렇게 사용하는 것입니다.

 

  • Range("A1") = Cell(1,1)
  • Range("C4") = Cell(4,3)

Range("A1") = Cell(1,1)과 같은 것을 가리킵니다.

Range("C4")은?

Cell(행,열)이니까 4행 3열을 가리키는 셀을 찾으면 되겠지요.

Range("C4") = Cell(4,3) 입니다.

 

그래서 Cells(2,i) 이것은 2행, i열의 셀을 의미합니다.

i는 For문에서 사용하는 카운트 변수이고

이 변수는 시작수부터 마지막수까지 1씩증가합니다.

위 For문 시작하는 수가 1이고 끝나는 수가 글자수라고 했으니까

i는 1부터 글자수 만큼 1씩 증가하는 것입니다.

 

그래서 Cells(2,i)는 For문이 반복 될때마다 변하는 것이고...

Cells(2,1) > Cells(2,2) > Cells(2,3) > ... > Cells(2,글자수)

이렇게 되는 것입니다.

 

Cells(2, i).Value = Mid(val_, i, 1)

이것에서 = 은 오른쪽에 있는 것을 왼쪽에 입력하는 문장이라고 위에서 이야기 했으니...

For문이 반복되면서...

Cells(2,1) > Cells(2,2) > Cells(2,3) > ... > Cells(2,글자수)

이셀에 각각 Mid(val_, i, 1)을 입력(대입)해주는 것입니다.

 

Mid함수

그러면...

Mid(val_, i, 1) 이것은 무었일까요?

Mid는 문자관련 함수(구글검색)입니다.

자세한 것은 구글 검색하면 나옵니다.

구글검색 : VBA Mid함수

 

Mid함수는

Mid(대상문자열, 시작위치, 글자수)

입니다.

 

이것의 의미는 대상문자열(함수에서 사용할 대상 문자들)에서

일부분의 문자를 가져오려고 하는 문자함수입니다.

 

시작위치와 글자수를 입력하면

대상문자열에서 가져오려고 하는 일부분의 문자를 가져올 수 있습니다.

예를 들어 Mid(대상문자열, 3, 2)가 의미하는 것은

대상문자열에서 시작위치가 3번째이고, 거기서부터 2개의 글자를 가져오는 것입니다.

 

그러면 Mid함수가 사용된 코드를 보겠습니다.

Mid(val_, i, 1) 이것은 무엇을 의미할까요?

val_은 위에서 A1셀의 값이 저장된 변수라고 했고

i는 For문이 반복될 때 1씩 증가하는 카운트변수라고 했으니..

Mid(val_, i, 1)은 A1셀의 값을 1자씩 가져오는데, 시작위치가 i입니다.

i는 1씩증가하니... A1셀에 있는 문자를 한자씩 가져오게 되는 것입니다.

시작위치가 1씩증가하면서 1자씩 가져오는 것이니까요.

 

그러니...

Cells(2, i).Value = Mid(val_, i, 1)

Cells(2, 1).Value = Mid(val_, 1, 1)

Cells(2, 2).Value = Mid(val_, 2, 1)

Cells(2, 3).Value = Mid(val_, 3, 1)

...

Cells(2, 글자수).Value = Mid(val_, 글자수, 1)

왼쪽부터 오른쪽의 각셀에 값을 대입하는 것이고... 그 값은 A1셀의 글자 1개씩인 것이되어...

아래 그림과 같이 글자가 채워지는 것입니다.

결과

 

과제2

그러면 몇번째 글자가 무엇인지 알기 쉽게 하기 위해 아래와 같이 만들고 싶다고 한다면 VBA코드는 어떻게 될까요?

문제2

Sub 문자_자르기_순서집어넣기() 
    Dim val_ As String 
     
    val_ = Range("A1").Value 
    For i = 1 To Len(val_) 
        Cells(2, i).Value = Mid(val_, i, 1) 
        Cells(3, i) = i 
    Next i 
End Sub

이렇게 위에서 만든 코드에

Cells(3, i) = i

이 코드 한줄만 넣어주면 됩니다.

Cells(3, i) = i

에서 i는 For문이 반복하면서 1씩 증가하는 카운트 변수라고 했으니...

Cells(2,1) = 1

Cells(2,2) = 2

Cells(2,3) = 3

...

Cells(2,글자수)

이렇게 되는 것입니다.

'Excel' 카테고리의 다른 글

엑셀버젼 확인 방법 + 파워쿼리 설치  (0) 2020.06.24