rand(life)
중복 제외하고 고유값만 가져오기 본문
지식인 답변에서 가져온 것이다
이런 데이터가 있을 때 중복된 숫자는 한 번으로 치고
중복없이 아래와 같이 숫자를 나열하는 방법이다
수식은 다음과 같다.
{=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
매크로는 당연히(!) 큰형님 작품이다.