如何对电子表格组件使用自定义函数

根据msdn修改( http://support.microsoft.com/kb/248822/zh-cn )

概要

<script type="text/javascript">loadTOCNode(1, 'summary');</script>
可以在 COM 对象(或 ActiveX DLL)中创建您自己的自定义函数,并将这些函数公开给 Microsoft Office 电子表格组件,以便在单元格公式中使用。本文介绍如何创建、部署以及与电子表格组件一起使用 COM 对象
本文中讨论的示例 COM 对象公开了两个公用函数: GetTicks()CustomTrend()
GetTicks

此函数返回一个值,该值代表自系统启动之后所经过的毫秒数。它返回的值是从对 GetTickCounts API 函数的调用中获得的。
CustomTrend

电子表格组件不支持在单元格中使用数组公式。因此,它不支持返回值数组的任何 Excel 工作表函数。返回值数组并且在电子表格组件中不受支持的常用 Excel 工作表函数有 LINEST、LOGEST、TREND 和 TRANSPOSE。

CustomTrend 函数演示如何使 Excel 自动调用这些不受电子表格组件支持的函数中的其中一个:TREND 函数。利用自动化功能,Excel TREND 函数会向 COM 对象返回一个值数组;然后,CustomTrend 会根据函数的其中一个参数返回该数组中的一个元素。由于 COM 对象函数无法向电子表格组件返回一个值数组,因此您可以根据需要多次调用 CustomTrend 函数,以便从产生的数组中检索所有元素。

注意:由于示例 COM 对象会实现 Microsoft Excel 自动化,因此使用此示例 COM 对象的客户端上必须安装 Microsoft Excel。
创建 COM 对象
<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script>
1.启动 Microsoft Visual Basic,并创建一个新的 ActiveX DLL 项目。
2.将该项目命名为 OWCAddin
3.将类命名为 MyFunctions
4.在“项目”菜单上,单击“组件”,然后选择“Microsoft Office Web Components 11.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 对象打包
<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script>
1.启动打包和部署向导。开始菜单中Microsoft Visual Studio 6.0 Tools->Package & Deployment Wizard
2.选择 OWCAddIn.vbp 并单击打包
3.对于程序包类型,请选择 Internet 程序包,并单击下一步
4.选择一个程序包文件夹并单击下一步
5.收到说明 MSOWC.dll 缺少依赖项信息的消息后,单击确定

注意:在 Microsoft Office 2003 中,当您收到说明 OWC11.dll 缺少依赖项信息的消息时,请单击确定
6.在包含文件的列表中,选择 OWC11.dll,然后单击下一步
7.单击下一步以接受文件来源。
8.对于安全设置,请为可安全执行脚本可安全执行初始化选择,然后单击下一步
9.单击完成以生成 CAB 文件。
使用电子表格组件(该组件在 COM 对象中使用自定义函数)创建 HTML 页面
<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script>
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:0002E559-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>
					
注意:您需要修改 OWCAddin 对象的 <OBJECT> 标记,以使它包含 clsidcodebase 的正确值。您可以通过在注册表编辑器 (Regedit.exe) 中检查注册表项 HKEY_CLASSES_ROOT/OWCAddin.MyFunctions/Clsid 来确定 COM 对象的类 ID。codebase 标记应该包含您使用打包和部署向导创建的 CAB 文件的位置。也可以再*.CAB目录下找到一个OWCAddin.HTM中找到classID

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()
					
该公式返回一个值,该值代表自系统启动之后所经过的毫秒数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农丁丁

你的认可是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值