'엑셀 vba 기초'에 해당하는 글 8건

본 강의에서는 셀의 배경색에 대해 바꾸는 법을 알아보겠습니다.

 

엑셀에서는 기본적으로 위와 같은 방법으로 셀의 배경색을 바꿉니다.

 

하지만 vba 매크로를 활용해서도 바꿀 수 있습니다.

 

Sub Macro()
      Range("A1:E11").Interior.ColorIndex = 3
End Sub

 

Range.Interior.ColorIndex 의 값을 변경함으로써 셀의 배경색을 바꿀 수 있습니다. (3은 빨간색)

 

Sub Macro()
      Dim colorIndex As Integer
      colorIndex = 1
      For i=1 To 10
            For j=1 To 5
                  Cells(i,j).value = colorIndex
                  Cells(i,j).Interior.ColorIndex = colorIndex
                  colorIndex = colorIndex + 1
            Next j
      Next i
End Sub

*과정을 보기 위해 반복문에 시간지연을 넣었습니다.

위의 코드처럼 ColorIndex값마다 정해진 배경색이 있습니다.

 

ColorIndex 색상표

좀더 다채로운 색을 넣고 싶다면

Interior.ColorIndex가 아니라 Interior.Color = RGB(x,y,z) 를 통해 rgb값을 지정할 수 있습니다.

(ex. Cells(1,1).Interior.Color = RGB(50, 23, 34)


WRITTEN BY
컴공학도

,

본 강의에서는 Do Loop 반복문에 대해 알아보겠습니다.

 

1. Do While Loop 문

 

Do While Loop 문은 While 옆의 조건문이 거짓이 될 때까지 실행합니다.

Sub Macro()
      Dim row As Integer
      row = 1 
      Do While row < 11
            Cells(row,1).value = row
            row = row + 1
      Loop
End Sub

*반복문의 과정을 보기 위해 시간지연을 적용하였습니다.

위의 예제에서 변수 row의 값은 반복문이 실행될 때마다 값이 1씩 증가합니다.

반복문이 실행되며

Cells(1,1).value = 1

Cells(2,1).value = 2

Cells(3,1).value = 3

.

.

.

Cells(10,1).value = 10 까지 실행되고 row의 값이 11이 되어 조건문이 거짓이 되므로 반복문을 빠져나가게 됩니다.

 

참고로 조건문을 반복문의 위가 아닌 아래로 내릴 수도 있습니다.

Sub Macro()
      Dim row As Integer
      row = 1 
      Do 
            Cells(row,1).value = row
            row = row + 1
      Loop While row < 11
End Sub

*반복문의 과정을 보기 위해 시간지연을 적용하였습니다.

결과는 동일합니다.

 

그럼 조건문을 굳이 왜 아래로 내릴까요.

 

조건문을 아래로 내리게 되면 적어도 한번은 반복문 안에 있는 매크로를 실행시킬 수 있습니다.

Sub Macro()
      Dim row As Integer
      row = 5
      Do While row < 5
            Cells(row,1).value = row
            row = row + 1
      Loop
End Sub

조건문이 위에 있는 경우

위의 예제에서는 반복문 안쪽의 매크로를 실행하지 않습니다.

Sub Macro()
      Dim row As Integer
      row = 5
      Do 
            Cells(row,1).value = row
            row = row + 1
      Loop While row < 5
End Sub

조건문이 아래에 있는경우

그러나 위의 예제에서는 적어도 한번의 반복문을 실행하기 때문에 Cells(5,1)의 값이 5로 변하게 됩니다.

 

2. Do Until Loop 문

Sub Macro()
      Dim row As Integer
      row = 10
      Do Until row = 0
            Cells(11-row, 1).value = row
            row = row - 1
      Loop
End Sub

*반복문의 과정을 보기 위해 시간지연을 적용하였습니다.

이번에 row는 10부터 시작해 1씩 감소합니다.

Cells(1,1).value = 10

Cells(2,1).value = 9

Cells(3,1).value = 8

.

.

.
Cells(1,1).value = 1 까지 실행 후 row가 0이 되면 Until의 조건문이 참이 되므로 반복문을 빠져나오게 됩니다.

 

Do Until Loop 문도 Do While Loop 문 처럼 조건문을 아래로 내려서 사용이 가능합니다.

Sub Macro()
      Dim row As Integer
      row = 10
      Do
            Cells(11-row, 1).value = row
            row = row - 1
      Loop Until row = 0
End Sub

위의 예제도 반복문은 적어도 한번은 실행하게 됩니다.

 

이상으로 Do Loop 반복문 다루기를 마치겠습니다.


WRITTEN BY
컴공학도

,

본 강의에서는 vba뿐만 아니라 모든 프로그래밍 언어에서 기본적으로 사용하는 반복문에 대해서 알아보겠습니다.

 

1. For Next 문

Sub Macro()
      For i=1 To 10
            Cells(i,1).value = i
      Next i
End Sub

*반복문의 과정을 보기 위해 시간지연을 적용하였습니다.

변수 i는 1부터 시작하여 1씩 증가해 10을 넘을 때까지 반복합니다.

Cells(1,1)에는 1, Cells(2,1)에는 2 ..... Cells(10,1)에는 10이 들어가고 반복문이 끝나게 됩니다. 

 

 

추가로 Step을 이용하여 변수 i의 증가폭도 임의로 정할 수 있습니다.

Sub Macro()
      For i=1 To 20 Step 2
             Cells(i,1).value = i
      Next i
End Sub

*반복문의 과정을 보기 위해 시간지연을 적용하였습니다.

위의 예제에서는 i가 1부터 2씩 증가해 20을 넘기면 반복문이 종료하게 됩니다.

 

 

2. For Each Next 문

Sub Macro()
      Dim rng As Range
      Dim sum As Integer
      
      Set rng = Range("A1:A10")
      sum = 0
      For Each i In rng
            sum = sum + i.value
            Cells(12,1).value = sum
      Next i
End Sub

*반복문의 과정을 보기 위해 시간지연을 적용하였습니다.

For 문에서 사용된 변수 i에 rng의 구성요소 하나하나가 들어가게 됩니다.

첫번째 반복에서는 i = Range("A1")이 되고

두번째 반복에서는 i = Range("A2")이 되면서 rng의 마지막 구성요소인 Range("A10")에 도달할 때까지 반복문이 실행됩니다.

 

위의 예제 코드에서는 범위 A1:A10의 각 셀에 있는 숫자들을 반복문을 통해 모두 더한 것입니다.

 

For Each Next 구문에서 In 뒤에 오는 변수는 Range뿐만이 아닌 Array형식도 올 수 있습니다.


WRITTEN BY
컴공학도

,

본 강의에서는 랜덤한 수를 생성하는 법을 알아보겠습니다.

 

랜덤한 수를 생성할 때는 기본적으로 Rnd가 이용됩니다.


Sub CreateRandomNumber()
      Dim randomNumber As Integer
      randomNumber = Rnd
End Sub

 


하지만 위의 코드에서 randomNumber 변수에는 랜덤한 수가 아닌 숫자 0이 들어가게 됩니다.

 

이는 매크로를 실행시킬 때마다 랜덤한 수를 결정하는 Seed값이 똑같기 때문입니다.

 

따라서 Randomize라는 구문으로 Seed값이 매크로를 실행할 때마다 달라지게 해 주어야 합니다.


Sub CreateRandomNumber()
      Randomize
      Dim randomNumber As Integer
      randomNumber = Rnd
End Sub


이렇게 되면 randomNumber에는 0보다 크고 1보다 작은 수가 들어가게 됩니다. (ex. 0.1, 0.123, 0.64, 0.999999)

 

Rnd를 사용해 원하는 범위 내에서의 랜덤한 수를 얻고 싶다면 Int()함수를 사용해야 합니다.

 

Int()함수는 소수점 숫자를 정수형으로 바꾸어 줍니다. (ex. 2.12311▶2, 6.325▶6, 0.999990)

 

Int(Rnd)의 값은 0이므로 원하는 범위를 설정하기 위해서는 Int(Rnd × 숫자1) + 숫자2 를 해 주면 됩니다.

 

숫자1이 뜻하는 건 원하는 범위의 크기이고, 숫자2가 뜻하는 건 시작값입니다.

 

예를들어 숫자1이 10이고 숫자2가 1이면 1부터 위쪽으로 10개 범위의 숫자를 뜻합니다.

 

주의해야할 점은 이겁니다.

 

숫자1이 '10'이고 숫자2가 '2'라면 2부터 10까지가 아닙니다. 2부터 위쪽으로 10개의 범위의 숫자이므로 2부터 11까지의 숫자를 뜻합니다.

 

다음의 코드는 randomNumber에 1부터 10 사이의 랜덤한 정수를 넣는 방법입니다.


Sub CreateRandomNumber()
      Randomize
      Dim randomNumber As Integer
      randomNumber = Int(Rnd * 10) + 1
End Sub


Rnd의 최솟값이 0.00....1이면 Rnd × 10 의 값은 0.00....1이고 Int(Rnd × 10)은 0, Int(Rnd × 10) + 1 의 값은 1입니다.

 

Rnd의 최댓값이 0.99....9이면 Rnd × 10 의 값은 9.99....9이고 Int(Rnd × 10)은 9, Int(Rnd × 10) + 1 의 값은 10입니다.

 

따라서 최솟값이 1, 최댓값이 10인 랜덤한 정수를 생성할 수 있게 됩니다.

        


WRITTEN BY
컴공학도

,