VBA Macro/VBA Excel

[엑셀 VBA] 숫자데이터의 구간별 빈도 빠르게 산출하기

루아흐뉴마 2021. 1. 26. 19:25
반응형
  • 이 매크로는 숫자데이터들의 구간별 빈도를 빠르게 산출하는 매크로이다.
  • 각종 통계 데이터의 분포를 빠르게 살펴보고 보고서로 작성할 때 유용한 매크로이다.
  • 사용법은 간단하다. 1) 데이터의 범위를 지정하고, 2) 매크로를 실행한 다음, 3) 구간값을 띄어쓰기로 입력하면 된다.
  • 3) 단계에 대한 부연을 하자면 다음과 같다.
  • 가령 내가 가진 연령 데이터가 최소 15세부터 최대 67세까지 있다고 하자.(매크로를 실행하면 범위를 알려준다.)
  • 이에 대해 1) 20세 미만, 2) 20세 이상 40세 미만, 3) 40세 이상 60세 미만, 4) 60세 이상 4개 구간으로 구분하여
  • 빈도를 산출하고자 한다면. 입력창에 0 20 40 60 100(60보다 큰 수이면 된다.)을 입력하면 된다.

  • 일단 코드만 먼저 제시하고 추후에 추가기능파일(xlam)을 업로드할 예정이다.
  • 테스트해보실 분들은 코드만 가지고 돌려보면 되겠다.
  • 영상에서 보는 것처럼 추가기능을 만들어서 사용하면 편리하다.


매크로 Output

 





VBA Code

 
Option Explicit
Sub histRng()

Dim num_input As String
Dim num_arr As Variant
Dim rngSel As Range
Dim rnc_c As Range
Dim i As Long
Dim max_N As Double, min_N As Double
Dim msgRslt As Long

Set rngSel = Selection

max_N = WorksheetFunction.Max(rngSel)
min_N = WorksheetFunction.Min(rngSel)

num_input = Application.InputBox("공백(Space)을 구분자로 하는 숫자배열을 오름차순으로 입력하세요" & Chr(10) & _
                                 "예시: 0 10 20 30 40 50" & Chr(10) & _
                                 "최솟값: " & min_N & Chr(10) & _
                                 "최댓값: " & max_N) '숫자 배열로 받기

num_arr = Split(num_input, " ") '입력받은 배열을 숫자 배열로 초기화

'사용자가 입력한 범위가 실제 데이터의 범위보다 좁을 때
If num_arr(0) > min_N Or num_arr(UBound(num_arr)) <= max_N Then
  msgRslt = MsgBox("입력한 범위가 실제 데이터 범위보다 좁습니다." & Chr(10) & _
          "올바른 빈도가 산출되지 않습니다. 그래도 진행하시겠습니까?" & Chr(10) & _
          "아니오를 선택하시면 프로시저를 종료합니다.", vbYesNo)
    If msgRslt = vbYes Then '그래도 진행
      'do nothing
    Else
      Exit Sub  '프로시저 종료
    End If
End If

With Sheets.Add(, ActiveSheet) '현재 시트 다음에 출력시트 생성
  .Activate
End With

For i = 0 To UBound(num_arr) - 1
  ActiveSheet.Cells(i + 1, "A") = "[" & num_arr(i) & ", " & num_arr(i + 1) & ")"  '구간 산출
  ActiveSheet.Cells(i + 1, "B") = WorksheetFunction.CountIfs(rngSel, ">=" & num_arr(i), rngSel, "<" & num_arr(i + 1)) '구간별 빈도 산출
Next i
End Sub



매크로 실행 동영상

 

 

 Copyright (2021) Ruahneuma. All Rights Reserved.

 

반응형