【问题标题】:Add Module code of BeforeDoubleClick_event to dynamically created worksheets将 BeforeDoubleClick_event 的模块代码添加到动态创建的工作表中
【发布时间】:2016-11-25 11:04:29
【问题描述】:

我有这个代码:

For a = 1 To 5
    strFoglio = "SheetName" & a
    Sheets.Add

    ActiveSheet.Name = strFoglio

    ActiveSheet.Move after:=Sheets(Sheets.Count)
Next a

有没有办法在这些全新的工作表上编写代码,例如:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
    Dim myRange As Range
End sub

当然,我想直接在For...Next 循环中执行,而不是手动执行。

【问题讨论】:

  • 查看名为 Workbook_SheetBeforeDoubleClick 的 Workbook 事件 - 如果您编写此代码,您将无需尝试为动态添加到工作簿的每个工作表编写单独的事件处理程序。
  • @Sergio Obici 在下面查看我的答案,让我知道它是否适合您

标签: vba excel macros


【解决方案1】:

下面的代码将运行您的 For 循环,创建 5 张工作表,每张工作表将调用 Sub CodeCopy,这会将模块中的代码行(在本例中为“Sheet1”中的代码)复制到新的创建的工作表。

代码

Option Explicit

Sub CreateSheets()

Dim a As Long

For a = 1 To 5
    Sheets.Add
    ActiveSheet.Name = "SheetName" & a
    ActiveSheet.Move after:=Sheets(Sheets.Count)
    Call CodeCopy(ActiveSheet.Name)
Next a

End Sub

' **********

Sub CodeCopy(DestShtStr As String)    

' Macro to copy the macro module from sheet1 to a new Sheet 
' Name of new sheet is passed to the Sub as a String
' Must install "Microsoft Visual Basic for Applications Extensibility library" 
' from Tools > References.

Dim i           As Integer
Dim SrcCmod     As VBIDE.CodeModule
Dim DstCmod     As VBIDE.CodeModule

' set source code module to code inside "Sheet1"
Set SrcCmod = ActiveWorkbook.VBProject.VBComponents(ActiveWorkbook.Worksheets("Sheet1").CodeName).CodeModule
Set DstCmod = ActiveWorkbook.VBProject.VBComponents(ActiveWorkbook.Worksheets(DestShtStr).CodeName).CodeModule

' copies all code line inside "Sheet1"
' can be modified to a constant number of code lines
For i = 1 To SrcCmod.CountOfLines
   DstCmod.InsertLines i, SrcCmod.Lines(i, 1)
Next i

End Sub

“Sheet1”中将被复制到所有新创建的工作表的代码是:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Dim myRange As Range

End Sub

说明

为了让这段代码工作,你需要允许以下 2 件事:

  1. 转到工具 >> 参考,并添加对“Microsoft Visual Basic”的参考应用程序扩展性”库(下面的屏幕截图)

  1. 在 Excel 主菜单中,转到开发人员菜单,然后选择Macro Security,点击V 允许“信任对 VBA 项目对象模型的访问”(下面的屏幕截图)

【讨论】:

    【解决方案2】:

    如果我理解得很好,您想直接在使用您的初始代码创建的新工作表上创建代码。

    所以我会这样做:

    Code(1) = Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Code(2) = Dim myRange As Range
    Code(3) = '....
    
    For i = 1 To 3
    Wb.VBProject.VBComponents("SheetName & a").CodeModule.InsertLines i, Code(i)
    Next i
    

    (放循环)

    【讨论】:

    • 如果你想给出这个答案,你至少应该引用 Code 数组中的值,例如Code(1) = "Dim foo As String"。否则,您的示例代码将无法编译,并且某个地方的某个人应该投票否决您的答案...
    • 谢谢,不幸的是它返回运行时错误 1004。我可以修改我的设置来修复它,但这个文件应该在多台电脑上运行,我不能要求管理每个人的设置。我会回到旧的想法,复制一个隐藏的工作表,上面已经写了代码。
    • 感谢罗宾的建议。塞尔吉奥你的想法不错,我认为这样更安全。
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多