EXCEL - VBA

UDF에서 자기 셀 참조 시

별동산 2024. 1. 5. 08:59
반응형

일반적으로 UDF(User Defined Function, 사용자 정의 함수)는 다른 셀 주소를 참조해서 계산을 하며,

 
 
아래는 제곱값을 구하는 함수의 코드입니다.

Function square(rngA As Range)
    square = rngA.Value * rngA.Value
End Function

 
 
그러나, 자기 자신의 셀을 참조해야 할 수도 있습니다.
이때 사용하는 것이 Application.Caller 속성(Property)입니다.
 
Application.Caller 대충 감을 잡으면
응용 프로그램이 호출하는 곳 또는 어디서 호출되었는지 정도가 될 것입니다.
따라서, 자기 자신 셀을 가리킵니다.
 
위의 경우에 항상 왼쪽 두 번째 셀의 값을 참고한다고 하면 범위를 이용하지 않고
 
아래와 같이 Application.Caller와 Offset을 이용해서 
Application.Caller.Offset(0, -2).Value라고 수정할 수 있습니다.

Function square(rngA As Range)
'    square = rngA.Value * rngA.Value
    square = Application.Caller.Offset(0, -2).Value * Application.Caller.Offset(0, -2).Value
End Function

 
이때 만약 Application.Caller를 ActiveCell을 이용해서  ActiveCell.Offset(0, -2).Value로 수정하면

Function square(rngA As Range)
'    square = rngA.Value * rngA.Value
'    square = Application.Caller.Offset(0, -2).Value * Application.Caller.Offset(0, -2).Value
    square = ActiveCell.Offset(0, -2).Value * ActiveCell.Offset(0, -2).Value
End Function

 
 
A열에 값이 3,4,5가 있을 경우 ActiveCell은 현재 셀이므로  C1셀에 9가 반환되는데

 
다른 셀에 값을 나타나게 하려고 C1셀의 수식을 C3셀까지 끌면 현재 셀이 C1셀이므로 모두 9가 반환되는 문제점이 있습니다.

 
 
따라서, 셀마다 값을 제대로 표시하려면 C2셀과 C3셀에서 F2키 누르고 엔터키를 눌러야 하는데, 그렇게 한다는 것은 말이 안 됩니다.

 

따라서, Application.Caller가 필요한 것입니다.

application.caller
0.01MB

반응형