자료실

부자는 돈을 써서 시간을 아끼지만 가난한 사람은 시간을 써서 돈을 아낀다

vb6.0/vba

IT HUB를 찾아주셔서 감사합니다.

vb6.0/vba [vb6.0/vba] Collection보다 기능이 많은 Scripting.Dictionary 를 이용한 통계내기

페이지 정보

profile_image
작성자 하나를하더라도최선을
댓글 0건 조회 8,119회 작성일 20-02-21 15:20

본문

출처 :: 지식인
c9fa70d0971679cfcfd0279a71bd7d18_1582265994_8162.png

이렇게 되어 있는 값을 아래와 같이 통계를 내고자 할때
c9fa70d0971679cfcfd0279a71bd7d18_1582266004_1987.png

'----------------------
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(01).Value = Application.Median(v)
        ' 평균
        rT.Offset(02).Value = Application.Average(v)
        '표준편차
        rT.Offset(03).Value = Application.StDev(v)
        ' 1분위
        rT.Offset(04).Value = Application.Quartile(v, 1)
        ' 3분위
        rT.Offset(05).Value = Application.Quartile(v, 3)
        ' 아래 셀로 이동
        Set rT = rT.Offset(10)
    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(01).Value          
        Else       
            Set oList = CreateObject("System.Collections.ArrayList")
            oList.Add c.Offset(01).Value
            oDic.Add v, oList
        End If
    '----------------------------
    Next
    '----------------------------
    Set get_data = oDic
End Function
 
"참이슬"님은 어떻게 "Scripting.Dictionary"를 이용하실 생각을 하셨을까?
요즘 vba 보다는 .net을 많이 하다보니 감이 많이 떨어졌다.​
.net에서는 DataTable이 있어서 정말 편한데....
하긴  vba를 몰랐을때는 엑셀 함수만 사용하는 것만도 감동이었는데...

댓글목록

등록된 댓글이 없습니다.