본문 바로가기
엑셀/VBA

[엑셀 매크로 VBA] 초등학교 수학문제 생성기 코드 주석

by 공돌이남편 2017. 5. 17.

지난번에 작성한 초등수학 문제 생성기([엑셀 매크로 VBA] 초등학교 수학문제 생성기- 덧셈, 뺄셈, 곱하기, 나누기)의 주석을 달아 보았습니다. 참조하세요.

 

 

수학문제 생성기_2016_주석.xlsm

수학문제 생성기_97_2003_주석.xls

 

 

 

'변수선언 방법설정
Option Explicit


'문제생성 모듈
Sub makeQuestion()
    
    '화면변경이 안되도록 설정
    Application.ScreenUpdating = False
    
    '변수 선언
    Dim i As Long
    Dim count As Long
    Dim order As Long
    Dim nagativeNumber As Variant
    Dim floatingPoint As Variant
    
    '문제생성 sheet 선택
    Sheets("문제생성").Select
    
    'C2셀에 있는 값(문항수)을 변수에 저장
    count = Range("C2").Value
    'F2셀에 있는 값(자릿수)을 이용해서 자릿수 생성
    order = 10 ^ Range("F2").Value
    'Check Box 3(음수 사용) 선택여부를 변수에 저장
    nagativeNumber = ActiveSheet.CheckBoxes("Check Box 3").Value
    'Check Box 4(소수점 사용) 선택여부를 변수에 저장
    floatingPoint = ActiveSheet.CheckBoxes("Check Box 4").Value
    
    '랜덤값을 생성하도록 초기화
    Randomize
   
    '--------------------------------------------------------
    
    '덧셈문제 sheet 선택
    Sheets("덧셈문제").Select
    
    'B1셀에 값이 있는지 확인해서 값이 있는 경우 셀의 값을 삭제함
    If IsEmpty(Range("B1").Value) = False Then
        Range("B1").CurrentRegion.Clear
    End If
    
    'for문을 돌려서 덧셈 문제를 생성함
    For i = 1 To count
        'B셀에 문제번호
        Range("B" & i) = "문제" & i
        '랜덤 숫자 생성
        Range("C" & i).Value = Int(order * Rnd)
        Range("D" & i).Value = "+"
        '랜덤 숫자 생성
        Range("E" & i).Value = Int(order * Rnd)
        Range("F" & i).Value = "="
    Next i
    
    '가운데 맞춤
    Range("B1").CurrentRegion.HorizontalAlignment = xlCenter
   
    Range("A1").Select
   
    '--------------------------------------------------------
    
    '뺄셈문제 sheet 선택
    Sheets("뺄셈문제").Select
    
    'B1셀에 값이 있는지 확인해서 값이 있는 경우 셀의 값을 삭제함
    If IsEmpty(Range("B1").Value) = False Then
        Range("B1").CurrentRegion.Clear
    End If
    
    'for문을 돌려서 뺄셈 문제를 생성함
    For i = 1 To count
        'B셀에 문제번호
        Range("B" & i) = "문제" & i
        Range("D" & i).Value = "-"
        Range("F" & i).Value = "="
            
        '결과가 양수만 나오는 경우
        If nagativeNumber = xlOff Then
            'C셀의 값이 E셀의 값보다 작은경우 랜덤숫자 다시 생성
            Do
                Range("C" & i).Value = Int(order * Rnd)
                Range("E" & i).Value = Int(order * Rnd)
            Loop While Range("C" & i).Value < Range("E" & i).Value
        '결과에 음수도 나오는 경우
        Else
            Range("C" & i).Value = Int(order * Rnd)
            Range("E" & i).Value = Int(order * Rnd)
        End If
    Next i
    
    '가운데 맞춤
    Range("B1").CurrentRegion.HorizontalAlignment = xlCenter
   
    Range("A1").Select
   
    '--------------------------------------------------------
    
    '곱셈문제 sheet 선택
    Sheets("곱셈문제").Select
    
    'B1셀에 값이 있는지 확인해서 값이 있는 경우 셀의 값을 삭제함
    If IsEmpty(Range("B1").Value) = False Then
        Range("B1").CurrentRegion.Clear
    End If
    
    'for문을 돌려서 곱셈 문제를 생성함
    For i = 1 To count
        'B셀에 문제번호
        Range("B" & i) = "문제" & i
        '랜덤 숫자 생성
        Range("C" & i).Value = Int(order * Rnd)
        Range("D" & i).Value = "×"
        '랜덤 숫자 생성
        Range("E" & i).Value = Int(order * Rnd)
        Range("F" & i).Value = "="
    Next i
    
    '가운데 맞춤
    Range("B1").CurrentRegion.HorizontalAlignment = xlCenter
   
    Range("A1").Select
   
    '--------------------------------------------------------
    
    '나눗셈문제 sheet 선택
    Sheets("나눗셈문제").Select
    
    'B1셀에 값이 있는지 확인해서 값이 있는 경우 셀의 값을 삭제함
    If IsEmpty(Range("B1").Value) = False Then
        Range("B1").CurrentRegion.Clear
    End If
    
    'for문을 돌려서 곱셈 문제를 생성함
    For i = 1 To count
        'B셀에 문제번호
        Range("B" & i) = "문제" & i
        Range("D" & i).Value = "÷"
        Range("F" & i).Value = "="
            
        '결과에 소수점이 없는 경우
        If floatingPoint = xlOff Then
            'C셀의 값을 E셀의 값으로 나누었을때 나머지가 0이 아닌경우 랜덤숫자 다시 생성
            Do
                'C셀의 값과 E셀의 값이 같거나 0이 나오는 경우 랜덤숫자 다시 생성
                Do
                    Range("C" & i).Value = Int(order * Rnd)
                    Range("E" & i).Value = Int(order * Rnd)
                Loop While Range("C" & i).Value = Range("E" & i).Value _
                            Or Range("C" & i).Value = 0 _
                            Or Range("E" & i).Value = 0
            Loop While (Range("C" & i).Value Mod Range("E" & i).Value) <> 0
        Else
            'C셀의 값과 E셀의 값이 같거나 0이 나오는 경우 랜덤숫자 다시 생성
            Do
                Range("C" & i).Value = Int(order * Rnd)
                Range("E" & i).Value = Int(order * Rnd)
            Loop While Range("C" & i).Value = Range("E" & i).Value _
                        Or Range("C" & i).Value = 0 _
                        Or Range("E" & i).Value = 0
        End If
       
    Next i
    
    '가운데 맞춤
    Range("B1").CurrentRegion.HorizontalAlignment = xlCenter
   
    Range("A1").Select
   
    '--------------------------------------------------------
    
    '문제생서 sheet로 화면전환
    Sheets("문제생성").Select
    
    '화면변경이 안되도록 설정한 것을 복원함
    Application.ScreenUpdating = True

End Sub

 

'정답생성 모듈
Sub makeAnswer()

    '변수 선언
    Dim i As Long
    Dim rowCount As Long
    
    '덧셈문제 sheet 선택
    Sheets("덧셈문제").Select
    
    'B1셀에 값이 있는 경우
    If IsEmpty(Range("B1").Value) = False Then
        'B1셀을 기준으로 값이 있는 셀들의 수(row)를 확인함
        rowCount = Range("B1").CurrentRegion.Rows.count
        '가운데 맞춤
        Range("G1").HorizontalAlignment = xlCenter
        '덧셈 수식적용
        Range("G1").Formula = "=C1+E1"
        '전체 문제에 수식을 적용함 (마우스로 드레그 하는 효과)
        Range("G1", "G" & rowCount).FillDown
    'B1셀에 값이 없는 경우
    Else
        '문제생성 sheet 선택(화면전환)
        Sheets("문제생성").Select
        'makeAnswer모듈 종료
        Exit Sub
    End If
   
    Range("A1").Select
   
    '--------------------------------------------------------
    
    '뺄셈문제 sheet 선택
    Sheets("뺄셈문제").Select
    
    'B1셀을 기준으로 값이 있는 셀들의 수(row)를 확인함
    rowCount = Range("B1").CurrentRegion.Rows.count
    '가운데 맞춤
    Range("G1").HorizontalAlignment = xlCenter
    '뺄셈 수식적용
    Range("G1").Formula = "=C1-E1"
    '전체 문제에 수식을 적용함 (마우스로 드레그 하는 효과)
    Range("G1", "G" & rowCount).FillDown
   
    Range("A1").Select
   
    '--------------------------------------------------------
    
    '곱셈문제 sheet 선택
    Sheets("곱셈문제").Select
    
    'B1셀을 기준으로 값이 있는 셀들의 수(row)를 확인함
    rowCount = Range("B1").CurrentRegion.Rows.count
    '가운데 맞춤
    Range("G1").HorizontalAlignment = xlCenter
    '곱셈 수식적용
    Range("G1").Formula = "=C1*E1"
    '전체 문제에 수식을 적용함 (마우스로 드레그 하는 효과)
    Range("G1", "G" & rowCount).FillDown
   
    Range("A1").Select
   
    '--------------------------------------------------------
    
    '나눗셈문제 sheet 선택
    Sheets("나눗셈문제").Select
    
    'B1셀을 기준으로 값이 있는 셀들의 수(row)를 확인함
    rowCount = Range("B1").CurrentRegion.Rows.count
    '가운데 맞춤
    Range("G1").HorizontalAlignment = xlCenter
    '나눗 수식적용
    Range("G1").Formula = "=C1/E1"
    '전체 문제에 수식을 적용함 (마우스로 드레그 하는 효과)
    Range("G1", "G" & rowCount).FillDown
   
    Range("A1").Select
   
    '--------------------------------------------------------
    
    '덧셈문제 sheet로 화면전환
    Sheets("덧셈문제").Select

End Sub