Excel添加.xlam模块将代码注入到新工作表中

我有一个模块正在创build一个表。 它使用一系列表格构build工作表。

我想添加一个function,使用单元格的OnChange事件来validation用户input一个小数。 下面的代码这样做如果我可以只注入新的工作表 。 这是我无法弄清的唯一的事情。

鉴于's'是我们刚刚创build的当前工作表是否有任何方法将以下代码注入's'的表单代码模块?

Private Sub Worksheet_Change(ByVal Target As Range) Const CELL_ADDRESS = "$R$4:$AQ$500" If Not Application.Intersect(Target, Range(CELL_ADDRESS)) Is Nothing Then If Not IsNumeric(Target.Value) Then MsgBox "Please enter numbers only", vbCritical, "Invalid Entry" Target.Value = vbNullString End If End If End Sub 

编辑:显示select解决scheme的问题(select楔的解决scheme)。

(答案:)我们将添加一个公共函数到Addin,我们将从模板调用,因此从模板创build的所有工作表。

使用模板并复制它将使我们能够将自定义代码内置到新工作表中,而无需更改安全设置。

调用公共函数允许我们修改表单,而不必将受保护的密码放在表单的代码中。

(表单内的公用函数调用)

 Private Sub Worksheet_Change(ByVal Target As Range) Dim wb As Workbook Set wb = ActiveWorkbook Dim ws As Worksheet Set ws = wb.ActiveSheet Application.Run "numberaddin.Validate_Input", wb, ws, Target End Sub 

(公共函数内置于Addin中,当用户修改数据时将由表单调用)。

– 所有这些function确保我们的单元格只存储数字和格式。 任何非值文本在单元格中变为0。 即使用户复制粘贴数据,这也是有效的。

 Public Function Validate_Input(wb As Workbook, ws As Worksheet, r As Range) CELL_ADDRESS = Cells(1, 2).Value ''''we'll use the locked Cell B1 to specify the Validation Range Dim rCell As Range Dim eCell As Range Dim numErr As Boolean numErr = False Set rCell = Range(CELL_ADDRESS) If Not Application.Intersect(rCell, r) Is Nothing Then ActiveSheet.Protect Password:="pw", UserInterfaceOnly:=True Application.EnableEvents = False For Each eCell In rCell.Cells If Not eCell Is Nothing And eCell.Locked = False And Not Application.Intersect(eCell, r) Is Nothing Then If IsNumeric(eCell.Value) = False Or IsEmpty(eCell.Value) = True Or eCell.Value <> eCell.Value + "0" Then If Not IsNumeric(eCell.Value) Then numErr = True End If eCell.Value = Val(eCell.Value) End If eCell.Interior.Color = RGB(255, 255, 153) eCell.NumberFormat = "_(* #,##0_);_(* (#,##0);_(* "" - ""??_);_(@_)" If eCell.Value > 1000000 Then eCell.Columns.AutoFit eCell.ColumnWidth = eCell.ColumnWidth * 1.2 End If End If Next eCell Application.EnableEvents = True ActiveSheet.Protect Password:="pw", UserInterfaceOnly:=False End If If numErr = True Then MsgBox "Only numbers are allowed here.", vbCritical, "Invalid Entry" End If End Function 

这不完全是你问的,但我认为你可以创build一个隐藏的“模板”工作表,其中包含你想要的代码(有一个xlVeryHidden选项,你可以用来防止从UI中隐藏模板甚至)。 然后,而不是创build一个新的工作表,您创build该“模板表”的副本,它应该复制在工作表VBA代码与它。

首先,您必须启用信任中心中的“信任访问VBA项目对象模型”设置。
之后,你将不得不写这样的事情:

 Sub AddModule() Dim Module As VBComponent Dim ModuleString As String ModuleString = "Sub Test()" & vbCrLf & _ " Msgbox(""Test"")" & vbCrLf & _ "End Sub" Set Module = Workbooks(2).VBProject.VBComponents.Add(vbext_ct_StdModule) Module.CodeModule.AddFromString ModuleString End Sub 

显然,你将会改变工作簿引用和ModuleString。 也要小心信任的变化。 这是有原因的。