Excel에서 사용자 정의 함수 작성 - 아날로그 SUM 함수

3267 단어 Office구성 요소
사용자 정의 함수를 작성하는 것은 데이터를 처리하기 위해서이며, 사용자 정의 함수(UDF)에 처리할 데이터를 어떻게 전달하는지는 개발자가 고려해야 할 문제가 된다.
일반적인 의미의 함수에 대해 말하자면 매개 변수 목록은 매개 변수의 개수가 고정되고 유형이 명확하다. 예를 들어 아래의 성명:
Public Function MyFunc1(name As String, age As Integer) As String

그러나 엑셀의 함수는 그 특수성을 가지고 있다.우리가 작업표에서 공식을 작성할 때 종종 구체적인 숫자나 문자열을 제공하지 않는다. 예를 들어 ("장삼", 23), 매개 변수로 한다.Excel에서 우리는 셀이나 셀 범위의 인용으로 파라미터를 전달하는 데 익숙하다. 위의 예와 같이 함수를 호출할 때의 표현 방식은 아마도 MyFunc1(A1, B1)일 것이다.위의 설명에 의하면, 만약에 우리가 단일한 칸을 매개 변수에 인용하는 것만 허용한다면, 엑셀은 칸이 인용하는 데이터 형식을 알고 있다.
그러나 때때로 함수의 어떤 매개 변수에 대해 우리는 단일한 칸을 전달할 수도 있고 하나의 칸의 범위를 전달할 수도 있으며 함수의 유연성을 증가시키기를 희망한다. 예를 들어 썸(A1)과 썸(A1:A5) 모두 가능하다.이때 우리는 매개 변수를 기본 데이터 형식으로 성명하는 것이 적합하지 않다. Excel 특유의 데이터 형식인 Range로 성명하면 위에서 언급한 문제를 해결할 수 있다. 왜냐하면 Range 대상은 단일한 칸일 수도 있고 하나의 칸 범위일 수도 있기 때문이다.
더 나아가, 만약 우리가 매개 변수 목록이 길어지기를 원한다면?매개 변수를 제공하면 되고, 두 개를 제공하면 세 개를 제공하면 되고, 매개 변수의 개수는 임의이다.
하나의 해결 방법은 Optional 키워드를 사용하는 것이다.Optional 키워드를 가진 매개 변수는 필요하지 않습니다. 우리는 Optional 키워드를 가진 매개 변수에 기본값을 줄 수 있습니다. 이렇게 하면 이 매개 변수를 생략해도 아무런 관계가 없습니다.
Public Function MyFunc2(name As String, Optional age As Integer =0) As String

그러나 Optional 키워드를 사용하는 것은 진정한 변장 매개 변수 목록이 아니다.나는 Optional 키워드는 사용자의 입력을 절약했을 뿐이라고 생각한다. 함수 안에서 매개 변수의 개수는 여전히 고정되어 있다.그리고 만약에 우리가 제공한 매개 변수의 개수가 정의된 매개 변수의 개수를 초과하면 어떻게 합니까?Optional은 적고 많을 수밖에 없는 것이지, 진정한 의미는 마음대로 길어지는 것이 아니다.
매개변수를 Range 유형으로 선언하는 것도 해결책입니다.Range 유형의 매개 변수는 하나의 셀일 수도 있고 임의의 행렬의 셀일 수도 있습니다.그러나 Range 유형의 매개 변수에도 문제가 있습니다. 우리가 셀 인용을 전달할 때 가능하고 전달 상수가 잘못됩니다. (Range 유형은 아래로 기본 유형으로 전환할 수 있고 기본 유형은 위로 Range 유형으로 전환할 수 없습니다.)우리는 매개 변수를 전달하는 데이터 유형에서도 일정한 유연성을 유지하기를 바란다.
우리의 요구에 더욱 가까운 해결 방안은 Param Array 키워드를 사용하는 것이다.ParamArray 키워드는 우리가 임의의 수의 매개 변수를 전달할 수 있도록 합니다.그리고 Param Array 키워드로 설명하는 매개 변수는 Variant 유형의 수조로 각 요소는 각종 데이터 유형이 될 수 있다.Param Array 키워드와 Optional 키워드는 상호 배타적입니다.
다음 예는 SUM 함수 기능을 에뮬레이션하는 사용자 정의 더하기 함수입니다.
Function MySum(ParamArray numbers()) As Double

Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim argD As Integer
Dim rtn As Double
rtn = 0
argD = UBound(numbers)

For i = 0 To argD
    If IsArray(numbers(i)) Then
        If IsObject(numbers(i)) Then
            For j = 1 To numbers(i).Rows.Count
                For k = 1 To numbers(i).Columns.Count
                    If IsNumeric(numbers(i)(j, k)) Then
                        rtn = rtn + numbers(i)(j, k)
                    End If
                Next k
            Next j
        Else
            For j = LBound(numbers(i)) To UBound(numbers(i))
                rtn = rtn + numbers(i)(j)
            Next j
        End If
    Else
        If IsNumeric(numbers(i)) Then
            rtn = rtn + numbers(i)
        End If
    End If
Next i

MySum = rtn

End Function

몇 가지 설명을 하자면, Param Array 키워드로 성명된 매개 변수 그룹은 최고 1급의 차원만 되돌아오는데, 보기에 1차원처럼 보인다.이것은 Param Array 키워드로 성명된 매개 변수 그룹 안의 요소는 매우 다를 수 있기 때문에 반드시 몇 곱하기 몇 개의 정연한 행렬이 아니기 때문이다.예를 들어 위에서 사용자 정의한 MySum 함수는 이렇게 =MySum(A2:D4,2, {1,2,3,4})을 호출할 수 있다.
코드에 중단점을 넣은 다음 "Locals Window"에서 Numbers라는 그룹의 구조를 볼 수 있습니다.만약 우리가 Numbers(i, j)와 같은 표현식을 사용하려고 시도한다면, 오히려 "Wrong number of dimensions"오류를 받을 수 있습니다.
Param Array 키워드로 성명된 매개 변수 그룹의 성질을 이해하면 각 요소를 어떻게 훑어보고 각 요소를 다르게 처리하는지 이해할 수 있다.

좋은 웹페이지 즐겨찾기