지난 번 포스팅에서 말한 더 개선한 which함수를 조금 더 개선해보았다. 지난 번에는 Enum을 사용하다보니 select case문이 비교연산의 갯수에 비례하여 커졌다. 이번에는 이넘도 저넘도 필요없다. 연산자를 문자열로 전달하면 된다.
이렇게 짧아진 이유는 Application.Evaluate() 덕분이다. Application.Evaluate()은 문자열로 표시된 수식을 평가하여 적절한 결과를 돌려준다.
이렇게 짧아진 이유는 Application.Evaluate() 덕분이다. Application.Evaluate()은 문자열로 표시된 수식을 평가하여 적절한 결과를 돌려준다.
Function which2(array_values, oper As String, lookup) As Long()
Dim i As Long, lb As Long, ub As Long
Dim index() As Long, cnt As Long
lb = LBound(array_values)
ub = UBound(array_values)
For i = lb To ub
If Application.Evaluate(array_values(i) & oper & lookup) Then
ReDim Preserve index(cnt)
index(cnt) = i
cnt = cnt + 1
End If
Next
If cnt = 0 Then
ReDim index(0)
index(0) = -1
End If
which2 = index
End Function
Sub demo_which2()
Dim values
Dim value
values = Array(96, 10, 18, 77, 49, 76, 67, 71, 74, 45, 43, 24, 18, 30, 57, 73, 78, 2, 92, 12)
value = 50
Dim idx() As Long, i As Long, lb As Long, ub As Long
idx = which2(values, ">=", value)
lb = LBound(idx)
ub = UBound(idx)
For i = lb To ub
Debug.Print idx(i)
Next
End Sub



최근 덧글