상세 컨텐츠

본문 제목

HOWTO: 사용자 정의 함수를 스프레드시트 구성 요소에 사용

프로그래밍/스크립트

by 라제폰 2009. 2. 6. 17:09

본문

HOWTO: 사용자 정의 함수를 스프레드시트 구성 요소에 사용

기술 자료 ID : 248822
마지막 검토 : 2004년 3월 19일 금요일
수정 : 1.0
이 문서는 이전에 다음 ID로 출판되었음: KR248822

요약

COM 개체 또는 ActiveX DLL에서 사용자 정의 함수를 만든 다음 셀 수식에서 사용할 수 있도록 Microsoft Office 스프레드시트 구성 요소에 제공할 수 있습니다. 본 문서에서는 COM 개체를 만들고 배포하고 스프레드시트 구성 요소에 사용하는 방법을 설명합니다.

추가 정보

본 문서에서 설명하는 예제 COM 개체는 GetTicks()CustomTrend() 등, 두 개의 Public 함수를 제공합니다.
GetTicks

이 함수는 시스템이 시작된 후 경과한 시간을 밀리초 단위로 나타낸 값을 반환합니다. 이 함수에서 반환된 값은 GetTickCounts API 함수를 호출하여 얻습니다.
CustomTrend

스프레드시트 구성 요소는 셀에서 배열 수식을 사용하도록 지원하지 않습니다. 따라서 이 구성 요소는 값의 배열을 반환하는 Excel 워크시트 함수를 지원하지 않습니다. 값의 배열을 반환하며 스프레드시트 구성 요소에서 지원되지 않는 Excel 워크시트 함수 중 많이 사용되는 것으로 LINEST, LOGEST, TREND 및 TRANSPOSE가 있습니다.

CustomTrend 함수는 스프레드시트 구성 요소에서 지원하지 않는 이들 함수 중 하나인 TREND 함수를 호출하도록 Excel을 자동화할 수 있는 방법을 보여줍니다. 자동화를 사용할 때 Excel TREND 함수는 COM 개체에 값의 배열을 반환합니다. 그 다음에 CustomTrend는 함수의 인수 중 하나에 의해 결정된 대로 그 배열의 요소를 반환합니다. COM 개체 함수는 스프레드시트 구성 요소에 값의 배열을 반환할 수 없기 때문에 결과 배열에서 모든 요소를 검색하는 데 필요한 만큼 여러 번 CustomTrend 함수를 호출할 수 있습니다.

참고: 예제 COM 개체는 Microsoft Excel을 자동화하기 때문에 이 예제 COM 개체를 사용하는 클라이언트에는 Microsoft Excel이 설치되어 있어야 합니다.

COM 개체 만들기

1. Microsoft Visual Basic을 시작하고 새 ActiveX DLL 프로젝트를 만듭니다.
2. 프로젝트 이름을 OWCAddin으로 지정합니다.
3. 클래스 이름을 MyFunctions로 지정합니다.
4. 프로젝트 메뉴에서 구성 요소를 누른 다음 Microsoft Office Web Components 9.0을 선택합니다.
5. MyFunctions 클래스의 코드 모듈에 아래 코드를 추가합니다.
Private Declare Function GetTickCount Lib "kernel32" () As Long

Dim oExcel As Object

Public Function GetTicks() As Long
    GetTicks = GetTickCount()
End Function

Private Function GetValues(xRange As IXRangeEnum) As Variant()
    Dim nCols As Long
    Dim nRows As Long
    Dim objRange As Object

    ' QI for IDispatch interface
    Set objRange = xRange

    ' Get unsigned longs and assign it to signed longs
    ' This is not always a good idea. You can use it here
    ' because the number of rows or columns cannot be greater
    ' than maximum value of a signed long
    nCols = objRange.ColCount
    nRows = objRange.RowCount

    ' Get values in an array of variants
    ReDim vVals((nRows * nCols) - 1) As Variant
    objRange.Next nRows * nCols, vVals(0), vbNull

    ' Return the array
    GetValues = vVals

End Function

Public Function CustomTrend(ByVal KnownY As IXRangeEnum, ByVal KnownX As IXRangeEnum, _
    ByVal NewX As IXRangeEnum, ByVal Idx As Variant) As Variant

    Dim XVals() As Variant, YVals() As Variant
    Dim NewXVals() As Variant, NewYVals() As Variant

    On Error GoTo ErrHandler

    'Get the values of Range in an array
    YVals = GetValues(KnownY)
    XVals = GetValues(KnownX)
    NewXVals = GetValues(NewX)

    'Now automate Excel to get an array of new Y Values using the TREND function
    NewYVals = oExcel.WorksheetFunction.Trend(YVals, XVals, NewXVals, True)

    'Return the requested index (Idx)
    CustomTrend = NewYVals(Idx)

Exit Function

ErrHandler:
    CustomTrend = "#VALUE!"

End Function

Private Sub Class_Initialize()
    Set oExcel = CreateObject("Excel.Application")
End Sub

Private Sub Class_Terminate()
    oExcel.Quit
    Set oExcel = Nothing
End Sub
6. 파일 메뉴에서 OWCAddin.dll 만들기를 선택하여 DLL을 만듭니다.
7. 프로젝트를 OWCAddin.vbp로 저장합니다.

COM 개체 패키지 만들기

1. 패키지 및 배포 마법사를 시작합니다.
2. OWCAddIn.vbp를 선택한 다음 패키지를 누릅니다.
3. 패키지 형식으로 인터넷 패키지를 선택하고 다음을 누릅니다.
4. 패키지 폴더를 선택하고 다음을 누릅니다.
5. MSOWC.dll의 종속성 정보를 찾을 수 없다는 메시지가 나타나면 확인을 누릅니다.
6. 포함 파일 목록에서 MSOWC.dll의 선택을 해제하고 다음을 누릅니다.
7. 다음을 눌러 파일 원본을 적용합니다.
8. 안전 설정에서 스크립트 사용에 안전초기화하기에 안전 모두에 를 선택한 후 다음을 누릅니다.
9. 마침을 눌러 CAB 파일을 만듭니다.

COM 개체의 사용자 정의 함수를 사용하는 스프레드시트 구성 요소로 HTML 페이지 만들기

1. 메모장을 열고 아래 내용을 포함하는 새 텍스트 파일을 만듭니다.
<HTML>
<HEAD>

<! --- COMMENT BEGIN ------------------------------------->
<! --- Modify the codebase and clsid items below --------->

<OBJECT classid = clsid:FFB16550-E40D-11D3-BB97-00C04FAEB609
codebase="http://MyServer/OWCAddin.CAB" id=OWCAddin></OBJECT>

<! --- COMMENT END --------------------------------------->

</HEAD>

<BODY>

<OBJECT classid=clsid:0002E510-0000-0000-C000-000000000046 height="50%"
id=Spreadsheet1 width="80%"></OBJECT>

<SCRIPT Language=VBScript>

Function Window_OnLoad()
   'Reference the COM object so that its functions can be called from
   'formulas in cells on the Spreadsheet
   Spreadsheet1.AddIn OWCAddin.Object

   'Populate the Spreadsheet with data
   With SpreadSheet1
      .Range("A1:D1").Value = Array("Known X-Values", "Known Y-Values", _
                                    "New X-Values", "New Y-Values")
      .Range("A2:A13").Value = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
      .Range("B2:B13").Value = Array (133890, 135000, 135790, 137300, _
                                      138130, 139100, 139900, 141120, _
                                      141890, 143230, 144000, 145290)
      .Range("C2:C5").Value = Array(13, 14, 15, 16)
      .Range("A1:D13").AutoFitColumns
      .Range("D2:D5").NumberFormat = "0.00"
End With
End Function

</SCRIPT>

</BODY>
</HTML>
참고: clsidcodebase에 대한 올바른 값을 포함하도록 OWCAddin 개체의 <OBJECT> 태그를 수정해야 합니다. 레지스트리 편집기(regedit.exe)에서 레지스트리 키 HKEY_CLASSES_ROOT\OWCAddin.MyFunctions\Clsid를 검사하면 COM 개체의 클래스 ID를 확인할 수 있습니다. codebase 태그는 패키지 및 배포 마법사를 사용하여 만든 CAB 파일의 위치를 포함해야 합니다.

2. : 텍스트 파일을 CustomFunction.htm으로 저장합니다.
3. : Windows 탐색기에서 CustomFunction.htm을 두 번 눌러 브라우저에 표시합니다.
4. : D2:D5 셀에 아래 수식을 입력합니다.
D2:=CustomTrend(B2:B13, A2:A13, C2:C5, 1)
D3:=CustomTrend(B2:B13, A2:A13, C2:C5, 2)
D4:=CustomTrend(B2:B13, A2:A13, C2:C5, 3)
D5:=CustomTrend(B2:B13, A2:A13, C2:C5, 4)
이 수식은 아래와 같은 결과를 반환합니다.
D2:     146171.52
D3:     147189.70
D4:     148207.88
D5:     149226.
06
5. : F1 셀에 아래 수식을 입력합니다.
=GetTicks()
이 수식은 시스템이 시작된 이후 경과한 시간을 밀리초 단위로 나타내는 값을 반환합니다.

사용자 정의 함수에 Range 인수를 사용할 때의 참고 정보

스프레드시트 구성 요소는 IXRangeEnum 인터페이스를 사용하는 사용자 정의 함수에 Range 인수를 전달합니다. IXRangeEnum은 Office 웹 구성 요소 유형 라이브러리(MSOWC.dll)에서 숨김 구성원(Member)으로 나타나므로 Office 웹 구성 요소 개체 모델의 도움말에 설명되어 있지 않습니다. IXRangeEnum은 사용자 정의 함수에 전달된 Range에서 값을 검색할 수 있는 메서드와 속성을 제공합니다. COM 개체의 GetValues 함수는 IXRangeEnum을 사용하여 범위의 값에서 배열을 만드는 방법을 보여줍니다. IXRangeEnum을 사용하는 방법에 대한 자세한 내용은 다음 설명서의 11장 "Building Solutions with the Office Web Components"를 참조하십시오.

Programming Microsoft Office 2000 Web Components (http://mspress.microsoft.com/books/3533.htm) Dave Stearns 지음 - ISBN 0-7356-0794-X

참조

Office 2000 스프레드시트 구성 요소 작업에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
Using Worksheet Functions in Web Page Scripts (http://msdn.microsoft.com/isapi/msdnlib.idc?theURL=/library/techart/webfunc.htm)
Office 2000 웹 구성 요소를 사용하는 솔루션의 배포에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.

본 문서의 정보는 다음의 제품에 적용됩니다.
Microsoft Office Spreadsheet Component 9.0
Microsoft Excel 2000 Standard Edition
Microsoft Visual Basic 6.0 Enterprise Edition
키워드: 
kbautomation kbofficewebspread kbgrpdso KB248822


관련글 더보기