안녕하세요. 이번 강좌에서는 VBA 를 이용하여 초등학교 저학년 아이를 위한 연산문제를 자동으로 내주는 스크립트를 작성해 보겠습니다. VBA 를 좀 해봤다 하면서 막상 일상 생활에 사용하려면 사용할데가 마땅히 떠오르지 않죠? 초등학교 저학년 자녀가 있으신 분은 수학 연산 학습지를 한번 살펴보세요. 별거 없습니다. 간단한 문제 들이 그저 나열되어 있을 뿐이죠.
이제 우리는 VBA 를 조금 다룰 줄 알게 되었기 때문에 VBA 를 이용하여 사랑하는 아이를 위한 연산 문제를 만들어주는 스크립트를 작성해 보려고 합니다.
현재 활성화된 시트와 특정 영역을 설정하는 방법은 앞선 포스트에서 다루었으니 해당 포스트를 참고하시면 되고요.
오늘 작성할 포스트에서 새로 나타나는 특별한 함수, 반복문이 있습니다.
- Randomize / Rnd : 임의의 숫자를 만들어 내는 함수
- Int : 소수형 숫자를 정수형으로 변경해주는 함수
- Do ... While : 어떤 조건이 만족할 때까지 계속해서 반복실행을 하는 함수
아래와 같은 기능을 개발할 예정입니다.
- 현재 선택된 시트에 동작하도록 한다.
- 두개의 임의의 숫자를 만들어 지정한 칸에 붙인다.
- 만약 두개의 숫자의 합이 10이 넘는다면 10이 넘지 않는 두번째 숫자를 구한다. (쉬운버전)
- 첫번째 숫자 뒤에는 "+" 기호를 넣고 두번재 숫자 뒤에는 "=" 기호를 넣는다.
자 먼저 함수를 정의하고 입력할 시트와 칸을 지정, 그리고 숫자 두개를 지정하겠습니다. 감이 오시나요?
Sub makeMath_under10()
Dim aSht As Worksheet
Dim rngA As Range
Dim numA As Integer
Dim numB As Integer
Set aSht = ActiveSheet
Set rngA = [B3]
End sub
요렇게요.
아직 아무런 동작도 실행되지는 않지만 필요한 변수는 다 설정했고 입력할 시트와 셀도 지정을 했습니다.
자 이제 한번에 갑니다. 조금 복잡할수도 있지만 잘 보세요~ ( '로 시작하는 문장은 주석입니다. )
Sub makeMath_under10()
Dim aSht As Worksheet
Dim rngA As Range
Dim numA As Integer
Dim numB As Integer
Set aSht = ActiveSheet
Set rngA = [B3]
' 이 함수에서 난수를 사용할 것임을 선언함'
Randomize
'Rnd 라는 함수에서 난수 0.00001 ~ 0.99999 사이의 숫자를 생성'
'만들어진 9 이하의 숫자를 정수로 변경'
'최종 만들어진 숫자에 1 을 더함 : 0이 나올수 있기 때문에'
'만들어진 숫자를 numA 에 적용함'
numA = Int(Rnd * 9) + 1
'Do 와 Loop 사이의 수식을 While 뒤에 나오는 조건이 만족하는 동안 계속 반복함'
Do
numB = Int(Rnd * 9) + 1
Loop While (numA + numB > 10)
'rngA 를 기준으로 우측으로 각 칸마다 필요한 값을 입력'
rngA.Offset(0, 0).Value = numA
rngA.Offset(0, 1).Value = "+"
rngA.Offset(0, 2).Value = numB
rngA.Offset(0, 3).Value = "="
End sub
주석으로 설명을 했습니다만 어려울 수 있는 부분만 추가 설명을 하겠습니다.
Int( 숫자 ) 라는 함수는 '숫자' 에 해당하는 어떤 수 도 정수형으로 변경해 주는 함수 입니다.
Rnd 를 통해 만들어진 소수형 숫자에 9를 곱해 최대 9가 나올수 있도록 범위를 확장해 준 뒤 Int 라는 함수를 이용하여 정수로 변경해주는 문장입니다. 만약 Rnd 에서 0.00001 이런 값이 나오는 경우 1 미만의 값이 나올 수 있기 때문에 제일 마지막에 + 1 을 해주어 절대로 0은 나오지 않도록 작성하였습니다.
그 뒤에 나오는 Do ... Loop While 부분이 조금 어려우실 수도 있겠는데요. 조금 생각해보면 그다지 어렵지는 않습니다.
Do 와 Loop 사이에 어떤 문장을 계속 반복하라는 뜻인데요. 이 반복은 어떤 조건이 만족할때만 반복시키게 됩니다. 여기에서는 (numA + numB > 10) 이라는 조건을 걸었죠. 말하자면 Do Loop 사이에서 구해진 numB 라는 값과 그 전에 구해진 numA 라는 값을 더했을 때 10이 넘는다면 numB 를 다시 구하도록 하는 역할을 합니다. 만약 두 숫자를 더했을 때 10이 넘지 않는 다면 반복문은 종료 되고 그 다음 줄로 빠져나오게 됩니다. 이렇게 하면 numA 와 numB를 더했을 때 절대로 10이 넘지 않게 됩니다. 저희 둘째가 아직 어려서 10 넘는 더하기는 무리이기 때문에 10이 넘지 않도록 하였지만 만약 10이 넘는 덧셈이 필요하시면 해당 부분을 제거하시면 됩니다.
조금 응용을 해보시면 반드시 10이 넘는 계산만 만드시는 것도 가능하겠죠?
위의 스크립트를 실행하면 아래와 같이 작성이 됩니다.
전 한 페이지에 문제를 좀더 내려고 합니다. For 문을 이용해서 반복적으로 문제를 계속해서 만들어 나갈 겁니다.
Sub makeMath_under10()
Dim aSht As Worksheet
Dim rngA As Range
Dim numA As Integer
Dim numB As Integer
Set aSht = ActiveSheet
Set rngA = [B3]
Randomize
For i = 0 To 8
numA = Int(Rnd * 9) + 1
Do
numB = Int(Rnd * 9) + 1
Loop While (numA + numB > 10)
rngA.Offset(i * 2, 0).Value = numA
rngA.Offset(i * 2, 1).Value = "+"
rngA.Offset(i * 2, 2).Value = numB
rngA.Offset(i * 2, 3).Value = "="
Next i
For i = 0 To 8
numA = Int(Rnd * 9) + 1
Do
numB = Int(Rnd * 9) + 1
Loop While (numA + numB > 10)
rngA.Offset(i * 2, 6).Value = numA
rngA.Offset(i * 2, 7).Value = "+"
rngA.Offset(i * 2, 8).Value = numB
rngA.Offset(i * 2, 9).Value = "="
Next i
End Sub
요렇게 작성했습니다. 이렇게 만들고 코드를 실행하면 아래와 같은 한페이지에 총 16 문제가 들어있는 문제집이 만들어 집니다.
그런데 모양이 보기에 좋지 않죠? 음...
이제 함수를 실행할때 마다 문제가 새로 만들어 질 건데요. 그 전에 화면을 좀 다듬어 봐야 겠네요.
출력할 용지도 고려하고 아이가 볼 문제니 글자 크기도 좀 키우고 해야 겠죠?
최종으로 만들어진 화면입니다.
스크립트를 실행할 때 마다 문제가 계속 바뀌니 항상 새로운 문제를 낼 수 있게 되었습니다.
물론 아이가 좋아할지는 미지수입니다.
숫자를 쓴걸 보니 그다지 재미는 없나 보네요. ( 0 이 아니고 10을 쓴거네요. 1이 아주 작게 ㅋ)
뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. |
그럼 이만~
2020/04/17 - [DEV/VBA] - [vba] 초등학교 연산 문제 자동 출제, 이번엔 뺄셈에 도전
2019/09/10 - [DEV/VBA] - [VBA] 엑셀로 초등학교 저학년 문제집 만들기 (자동버전)
'DEV > VBA' 카테고리의 다른 글
[VBA] 엑셀에 그림 자동으로 넣기 (14) | 2019.09.20 |
---|---|
[VBA] 엑셀로 초등학교 저학년 문제집 만들기 (자동버전) (0) | 2019.09.10 |
[vba] 엑셀 시트의 모든 색상의 셀 색상 제거하기 (0) | 2019.09.02 |
[VBA]RGB 색상 값이 들어있는 셀에 셀 색상 지정하기 (5) | 2019.08.30 |
[VBA] 엑셀 시트에 있는 모든 그림 한번에 삭제하기 (13) | 2019.08.21 |