excel-vba
사용자 정의 함수 (UDF)
수색…
통사론
function functionName (argumentVariable as dataType, argumentVariable2 as dataType, 선택적 argumentVariable3 as dataType) functionReturnDataType으로 사용하십시오.
함수의 기본 선언. 모든 함수에는 이름이 필요하지만 인수가 필요하지 않습니다. 0 개의 인수를 취할 수도 있고, 주어진 수의 인수를 취할 수도 있습니다. 인수를 선택적으로 선언 할 수도 있습니다 (함수를 호출 할 때 인자를 제공하면 중요하지 않습니다). 각 인수에 대해 변수 유형을 제공하고 마찬가지로 함수 자체가 반환 할 데이터 유형을 반환하는 것이 가장 좋습니다.functionName = theVariableOrValueBeingReturned
다른 프로그래밍 언어를 사용하는 경우Return
키워드에 익숙해있을 수 있습니다. 이것은 VBA에서 사용되지 않습니다. 대신 함수 이름을 사용합니다. 변수의 내용이나 직접 제공된 값으로 설정할 수 있습니다. 함수의 return에 대한 데이터 유형을 설정 한 경우이 시간에 제공하는 변수 또는 데이터는 해당 데이터 유형이어야합니다.최종 기능
필수.Function
블록의 끝을 나타내며 끝 부분에 있어야합니다. VBE는 일반적으로 새 기능을 만들 때이 기능을 자동으로 제공합니다.
비고
UDF (User Defined Function)는 사용자가 작성한 태스크 특정 기능을 나타냅니다. 워크 시트 함수 (ex : =SUM(...)
)로 호출하거나 Sub 프로 시저에서 실행중인 프로세스로 값을 반환하는 데 사용할 수 있습니다. UDF는 일반적으로 하나 이상의 매개 변수로 전달 된 정보에서 값을 리턴합니다.
다음 방법으로 만들 수 있습니다.
- VBA를 사용합니다.
- Excel C API 사용 - 컴파일 된 함수를 Excel로 내보내는 XLL을 작성합니다.
- COM 인터페이스를 사용합니다.
UDF - Hello World
- 열린 Excel
- Visual Basic Editor를 엽니 다 (Visual Basic Editor 열기 참조).
- 삽입 -> 모듈을 클릭하여 새 모듈을 추가하십시오.
- 다음 코드를 복사하여 새 모듈에 붙여 넣습니다.
Public Function Hello() As String
'Note: the output of the function is simply the function's name
Hello = "Hello, World !"
End Function
획득 방법 :
- 통합 문서로 돌아가서 "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*])
이것은 매우 단순한 예제이지만 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