반응형
- 이 매크로는 숫자데이터들의 구간별 빈도를 빠르게 산출하는 매크로이다.
- 각종 통계 데이터의 분포를 빠르게 살펴보고 보고서로 작성할 때 유용한 매크로이다.
- 사용법은 간단하다. 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.
반응형
'VBA Macro > VBA Excel' 카테고리의 다른 글
[엑셀 VBA] 기준이 없는 리스트에 따라 자동필터하기 (1) | 2022.10.09 |
---|---|
[엑셀 VBA] 짤막하고 유용한 사용자정의 함수 및 스니핏 (0) | 2021.02.02 |
[엑셀 VBA] 가능한 모든 조합 나열하기 (응용하기) (0) | 2021.01.25 |
[엑셀 VBA] 가능한 모든 조합 나열하기 (9) | 2020.05.18 |
[엑셀 VBA] 두 단어의 일치도(%) 산출 매크로 #2 (일반화된 방법) (2) | 2020.05.12 |