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
 
댓글목록
등록된 댓글이 없습니다.



