수색…


통사론

  1. function functionName (argumentVariable as dataType, argumentVariable2 as dataType, 선택적 argumentVariable3 as dataType) functionReturnDataType으로 사용하십시오.
    함수의 기본 선언. 모든 함수에는 이름이 필요하지만 인수가 필요하지 않습니다. 0 개의 인수를 취할 수도 있고, 주어진 수의 인수를 취할 수도 있습니다. 인수를 선택적으로 선언 할 수도 있습니다 (함수를 호출 할 때 인자를 제공하면 중요하지 않습니다). 각 인수에 대해 변수 유형을 제공하고 마찬가지로 함수 자체가 반환 할 데이터 유형을 반환하는 것이 가장 좋습니다.

  2. functionName = theVariableOrValueBeingReturned
    다른 프로그래밍 언어를 사용하는 경우 Return 키워드에 익숙해있을 수 있습니다. 이것은 VBA에서 사용되지 않습니다. 대신 함수 이름을 사용합니다. 변수의 내용이나 직접 제공된 값으로 설정할 수 있습니다. 함수의 return에 대한 데이터 유형을 설정 한 경우이 시간에 제공하는 변수 또는 데이터는 해당 데이터 유형이어야합니다.

  3. 최종 기능
    필수. Function 블록의 끝을 나타내며 끝 부분에 있어야합니다. VBE는 일반적으로 새 기능을 만들 때이 기능을 자동으로 제공합니다.

비고

UDF (User Defined Function)는 사용자가 작성한 태스크 특정 기능을 나타냅니다. 워크 시트 함수 (ex : =SUM(...) )로 호출하거나 Sub 프로 시저에서 실행중인 프로세스로 값을 반환하는 데 사용할 수 있습니다. UDF는 일반적으로 하나 이상의 매개 변수로 전달 된 정보에서 값을 리턴합니다.

다음 방법으로 만들 수 있습니다.

  1. VBA를 사용합니다.
  2. Excel C API 사용 - 컴파일 된 함수를 Excel로 내보내는 XLL을 작성합니다.
  3. COM 인터페이스를 사용합니다.

UDF - Hello World

  1. 열린 Excel
  2. Visual Basic Editor를 엽니 다 (Visual Basic Editor 열기 참조).
  3. 삽입 -> 모듈을 클릭하여 새 모듈을 추가하십시오.

여기에 이미지 설명을 입력하십시오.

  1. 다음 코드를 복사하여 새 모듈에 붙여 넣습니다.
Public Function Hello() As String
'Note: the output of the function is simply the function's name
Hello = "Hello, World !"
End Function

획득 방법 :

여기에 이미지 설명을 입력하십시오.

  1. 통합 문서로 돌아가서 "Hello World"를 보려면 셀에 "Hello ()"를 입력하십시오.

여기에 이미지 설명을 입력하십시오.

페널티없이 전체 열 참조 허용

전체 열 참조를 매개 변수로 전달할 수있는 경우 워크 시트에 일부 UDF를 구현하는 것이 더 쉽습니다. 그러나 코딩의 명백한 특성으로 인해 이러한 범위와 관련된 모든 루프는 완전히 비어있는 수십만 개의 셀을 처리 할 수 ​​있습니다. 이렇게하면 불필요한 비 값이 처리되는 동안 VBA 프로젝트 (및 통합 문서)가 고정 된 혼란으로 감소합니다.

워크 시트의 셀을 반복하는 것은 작업을 수행하는 가장 느린 방법 중 하나이지만 때로는 피할 수없는 경우도 있습니다. 실제로 필요한 것까지 수행 된 작업을 잘라내는 것이 합리적입니다.

해결 방법Intersect 메서드 를 사용하여 Worksheet.UsedRange 속성에 대한 전체 열 또는 전체 행 참조를 자르는 입니다. 기준 _은 또한 sum_range의 각 값을 기준 _에 값 동반해야하기 때문에 sum_range의에 맞게 크기를 조정할 수 있도록 다음 샘플 느슨하게 워크 시트의 기본 SUMIF 함수를 복제합니다.

워크 시트에 사용 된 UDF 용 Application.Caller 는 해당 셀이있는 셀입니다. 셀의 .Parent 속성은 워크 시트입니다. 이것은 .UsedRange를 정의하는 데 사용됩니다.

모듈 코드 시트 :

Option Explicit

Function udfMySumIf(rngA As Range, rngB As Range, _
                    Optional crit As Variant = "yes")
    Dim c As Long, ttl As Double
    
    With Application.Caller.Parent
        Set rngA = Intersect(rngA, .UsedRange)
        Set rngB = rngB.Resize(rngA.Rows.Count, rngA.Columns.Count)
    End With
    
    For c = 1 To rngA.Cells.Count
        If IsNumeric(rngA.Cells(c).Value2) Then
            If LCase(rngB(c).Value2) = LCase(crit) Then
                ttl = ttl + rngA.Cells(c).Value2
            End If
        End If
    Next c
    
    udfMySumIf = ttl

End Function

통사론:
=udfMySumIf(*sum_range*, *criteria_range*, [*criteria*])

udf_sumifs

이것은 매우 단순한 예제이지만 2 개의 전체 열 참조 (각각 1,048,576 행)를 전달하지만 데이터 및 기준의 15 개 행만 처리하는 것을 적절히 보여줍니다.


Microsoft ™의 호의적 인 방법 및 속성에 대한 공식적인 MSDN 문서를 링크했습니다.

범위의 고유 값 계산

Function countUnique(r As range) As Long
    'Application.Volatile False ' optional
    Set r = Intersect(r, r.Worksheet.UsedRange) ' optional if you pass entire rows or columns to the function
    Dim c As New Collection, v
    On Error Resume Next   ' to ignore the Run-time error 457: "This key is already associated with an element of this collection".
    For Each v In r.Value  ' remove .Value for ranges with more than one Areas
        c.Add 0, v & ""
    Next
    c.Remove "" ' optional to exclude blank values from the count
    countUnique = c.Count
End Function

컬렉션



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow