rand(life)

중복 제외하고 고유값만 가져오기 본문

컴퓨터/엑셀

중복 제외하고 고유값만 가져오기

flogsta 2017. 9. 11. 15:47

지식인 답변에서 가져온 것이다


참고.xlsx





이런 데이터가 있을 때 중복된 숫자는 한 번으로 치고

중복없이 아래와 같이 숫자를 나열하는 방법이다


수식은 다음과 같다.

{=IFERROR(SMALL(IF($B$4:$E$6>F4,$B$4:$E$6),1),"")}


배열수식이므로 마지막에 Ctrl-Shift-Enter해야한다


대략 수식의 구조를 설명하면,

$B$4:$E$6 는 A부분의 데이터이다. 중복된 값을 포함해 여러 숫자가 있는 범위이다

F4는 비어있는 셀이다.

여기서 오른쪽이나 아래쪽으로 끌어채우기를 하면, 이전에 나온 값보다 더 큰 값의 범위를 지정해줄 수 있다.


IF($B$4:$E$6>F4,$B$4:$E$6)

$B$4:$E$6 중에서 F4(현재는 0)보다 크다면 해당 셀값을, 아니라면 False값을 배정한다.

(IF 조건문은 if(조건, 참일때 결과, 거짓일때 결과) 이렇게 구성되는데 거짓일 때 결과 부분을 따로 지정하지 않으면 False값이 출력된다)


SMALL(범위,1)

위에서 도출된 범위 중에서 제일 작은 값을 출력한다


써 놓고 보니 매우 간단한 수식이다.

텍스트에도 적용할 수 있다면 좋겠지만, 텍스트는 숫자처럼 비교가 안되니 매크로를 써야한다

Sub Macro()
 Dim Rev() As Variant, T As Variant
 Dim X As New Collection
     On Error Resume Next
   For Each rng In Range("A4").CurrentRegion.SpecialCells(2)
        X.Add rng, CStr(rng)
     If Err.Number <> 457 Then
       ReDim Preserve Rev(n)
         Rev(n) = rng
          n = n + 1
       End If
       Err.Clear
     Next rng
  For i = UBound(Rev) To LBound(Rev) Step -1
      For j = 1 To i
          If Rev(j) > Rev(j + 1) Then
             T = Rev(j)
            Rev(j) = Rev(j + 1): Rev(j + 1) = T
          End If
       Next j
     Next i
  With Range("A10")
    .CurrentRegion.ClearContents
    .Resize(, n) = Rev
   End With
End Sub

매크로는 당연히(!) 큰형님 작품이다.

답변(VBA).xlsm