vb6.0/vba [vb6.0/vba] Collection보다 기능이 많은 Scripting.Dictionary 를 이용한 통계내기
페이지 정보
본문
출처 :: 지식인
이렇게 되어 있는 값을 아래와 같이 통계를 내고자 할때
'----------------------
Sub get_statics()
'----------------------
' 소스 범위
Dim rX As Range: Set rX = Range([A4], [A4].End(xlDown))
Dim oDic As Scripting.Dictionary
' 딕션녀리 가져오기, 키-코드, 값-규격
Set oDic = get_data(rX)
' 결과 표시할 첫 셀
Dim rT As Range: Set rT = [E3]
'기존 자료 지우기
Range(rT, rT.End(xlDown)).Resize(, 6).ClearContents
' 각 키를 돌며
'---------------------------------
For Each Key In oDic.Keys
'---------------------------------
' arraylist를 배열로 변환
v = oDic.Item(Key).toarray
'코드
rT.Value = Key
' 중간값
rT.Offset(0, 1).Value = Application.Median(v)
' 평균
rT.Offset(0, 2).Value = Application.Average(v)
'표준편차
rT.Offset(0, 3).Value = Application.StDev(v)
' 1분위
rT.Offset(0, 4).Value = Application.Quartile(v, 1)
' 3분위
rT.Offset(0, 5).Value = Application.Quartile(v, 3)
' 아래 셀로 이동
Set rT = rT.Offset(1, 0)
Next
Set oDic = Nothing
End Sub
'---------------------------------------------------
Function get_data(rX As Range) As Scripting.Dictionary
'---------------------------------------------------
' Dictionary 선언
Dim oDic As New Scripting.Dictionary
'Dim rX As Range: Set rX = [A4:A14]
Dim oList As Object
Dim c As Range, v As Variant
' 범위의 각 셀을 돌며
'----------------------------
For Each c In rX.Cells
'----------------------------
v = c.Value
'
If oDic.Exists(v) Then
oDic.Item(v).Add c.Offset(0, 1).Value
Else
Set oList = CreateObject("System.Collections.ArrayList")
oList.Add c.Offset(0, 1).Value
oDic.Add v, oList
End If
'----------------------------
Next
'----------------------------
Set get_data = oDic
End Function
"참이슬"님은 어떻게 "Scripting.Dictionary"를 이용하실 생각을 하셨을까?
요즘 vba 보다는 .net을 많이 하다보니 감이 많이 떨어졌다.
.net에서는 DataTable이 있어서 정말 편한데....
하긴 vba를 몰랐을때는 엑셀 함수만 사용하는 것만도 감동이었는데...
- 이전글[vb6.0] 실행돼있는 상태에서 자신 파일 삭제 20.02.24
- 다음글[vb6.0/vba] 창 최대화 - Maximize the window 20.02.20
댓글목록
등록된 댓글이 없습니다.