如何在工作表(而非工作簿)中存储和使用VBA函数

时间:2019-02-07 15:30:09

标签: excel vba

我一直在寻找答案,但似乎不走运。

我有一个自定义函数,希望将其存储在单个工作表中,以便可以随工作表(即不是工作簿)一起分发该函数

需要从excel单元格公式调用自定义函数

在存储在代码模块中时调用该函数可以很好地工作,但是将其移到工作表对象“模块”中会导致其失败。这也许是意料之中的。

希望将功能放置在工作表代码中的原因是,它可以将它与工作表一起通过templates文件夹自动导入到新工作簿中,然后可供工作簿的其余部分使用。 (这是通过Insert> New Sheet对话框

导入的

所以我的问题是2折:

在工作表代码中编写函数时如何从excel公式调用函数,或者...

当我从模板文件添加工作表时,如何自动将模块添加到新工作簿中?

值得注意的是,使用personal.xlsb文件将无法正常运行,我需要能够从工作表公式中调用函数

预先感谢

2 个答案:

答案 0 :(得分:1)

您可以将以下内容添加到要导入工作表的ThisWorkbook事件中,并根据需要进行调整。我在Sheet1中有一个工作表函数,名为ns,它带有两个参数ab,我希望使用的excel函数是MY_FUNCTION

这将添加一个模块来将包装器保存到工作表函数中。

Private Sub Workbook_NewSheet(ByVal Sh As Object)

Dim vbp As VBProject
Dim vbm As VBComponent

Set vbp = Application.VBE.ActiveVBProject

Set vbm = vbp.VBComponents.Add(vbext_ct_StdModule)
vbm.Name = "MY_FUNCTION_MDL"

'   vbm.CodeModule.AddFromFile ""       '   <--- another way add from file

vbm.CodeModule.InsertLines 1, "Public Function MY_FUNCTION(a,b)"
vbm.CodeModule.InsertLines 2, "     MY_FUNCTION=sheet1.ns(a,b)"
vbm.CodeModule.InsertLines 3, "End Function"

End Sub

答案 1 :(得分:0)

您可以执行此操作(对我有用):

Option Explicit

Private Sub Workbook_Open()

   ThisWorkbook.VBProject.VBComponents.Import "[PathtoDir]\MyMod.bas"

End Sub

确保在excel中执行以下操作:

Security