2013-01-14 3 views
0

내가 달성하려는 것은 열의 고유 값 (문자열) 목록을 반환하는 것입니다. 그 목록을 배열에 넣은 다음 값 목록을 새로운 시트 열 A에 붙여 넣습니다. 그런 다음 각 배열 요소에 대해 원래 목록이 몇 번 있었는지 계산하고 새 시트의 열 B에서 빈도 카운트를 반환합니다 그것의 유일한 끈에 대하여.각각의 고유 한 문자열의 개수를 반환하는 Array의 각 루프에 대해

이것은 지금까지 제 코드입니다.

1. 피벗 테이블 :

은 그냥 데이터 범위에 대한 피벗 테이블을 삽입

Sub UniqueList() 
Dim rListPaste As Range 
Dim causeList As Range 
Dim iReply As Integer 
Dim element As Variant 

On Error Resume Next 

Set rListPaste = Application.InputBox _ 
(Prompt:="Please select the destination cell", Type:=8) 

    If rListPaste Is Nothing Then 
     iReply = MsgBox("No range nominated," _ 
      & " terminate", vbYesNo + vbQuestion) 
     If iReply = vbYes Then Exit Sub 
    End If 


causeList = Range("E1", Range("E65536").End(xlUp)) 
Range("causeList").AdvancedFilter Action:=xlFilterCopy, Unique:=True 
Range("causeList").AdvancedFilter CopyToRange:=causeList.Cells(1, 1) 

element = 0 
For Each element In causeList 
    element = element + 1 
Next element 
End 


End Sub 
+3

피벗 테이블을 사용하지 않는 이유는 무엇입니까? –

+1

WorksheetFunction.Countif 함수는 범위 내에서 값의 발생 횟수를 반환합니다. 마지막 루프가 아닌 해당 값을 사용합니다. CopyToRange의 결과 범위에 대해 'For Each Temprangevariable For UniqueRange'를 사용하면'Temprangevariable.Offset (0,1) '을 countif 값으로 설정할 수 있습니다. – MattCrum

+0

이 답변은 찾고자하는 답변이 아니지만 원하는 작업을 수행 할 수있는 방법입니다. [고유 값 필터링] (http://office.microsoft.com/en-001/excel-help/) 고유 값 필터 또는 중복 값 필터 - HP010073943.aspx) [각 값 반복 수] (http://office.microsoft.com/en-us/excel-help/count-occurrences-of 데이터 범위 -high-values-in-a-data-range-HP003056118.aspx) –

답변

4

은 당신이 찾고있는 무엇을 달성하기 위해 여러 가지 방법이 있습니다. 행 필드와 데이터 필드 둘 다에서 관심있는 필드 (열 이름)를 삭제하십시오. 고유 항목 목록과 그 옆에있는 개수가 표시됩니다. 데이터가 변경, 당신은 고유 한 값의 목록을 만들기 피벗 테이블

2. 새로 고침 및 COUNTIF 공식 먼저 추가해야하는 경우, 귀하의 열 (데이터 -> 필터 -> 고급)에 고급 필터를 적용합니다. 여기에서 "다른 위치로 복사"를 선택하고 데이터 범위 (목록 범위), 대상 ("복사 대상") 및 "고유 값"만 선택하십시오. 이제 고유 목록을 사용하여 다음 열에 COUNTIF 수식을 추가하십시오.

3. VBA

다음 코드를 출력 고유 값과 주파수의리스트. Dictionary 개체를 사용하므로 "Microsoft Scripting Library"에 대한 참조를 추가해야합니다.

 
Sub CountUnique(rngInput As Range, rngTarget As Range) 

    Dim d As New Dictionary 
    Dim varCell As Variant 
    Dim varKey As Variant 
    Dim rngOut As Range 
    For Each varCell In rngInput 
     If Not d.Exists(varCell.Value) Then 
      d.Add varCell.Value, 0& 
     End If 
     d(varCell.Value) = d(varCell.Value) + 1 
    Next 

    Set rngOut = rngTarget(1, 1) 
    For Each varKey In d.Keys 
     rngOut.Value = varKey 
     rngOut.Offset(, 1) = d(varKey) 
     Set rngOut = rngOut.Offset(1) 
    Next 

End Sub 
+0

+1 좋은 옵션 세트 – whytheq

+0

@Peter Albert는 훌륭한 옵션에 대해 감사드립니다. 옵션 2에서도 매크로를 만들 수 있습니다. 나는 당신의 For Each 루프가 좋아 보인다. – sayth

+0

동의 함 - 필요한 경우 옵션 1을 자동화 할 수도 있습니다. 피벗 테이블 (PivotTables (1) .PivotCache.Refresh') - 피벗 테이블을 다이내믹 범위 이름으로 설정한다고 가정하면, 엑셀 테이블/ListObject. –

관련 문제