链接模块和工作表,以便当您将工作表复制到新书时,模块出现

时间:2017-08-04 03:39:09

标签: vba module

我有一个宏,它根据我提供的数据集创建了一堆工作表。然后,宏会创建一些未来用户可以单击的复选框。复选框具有.OnAction = "Module"功能,需要与未来的用户输入一起运行。

我希望能够将此用户输入表复制到新工作簿中,这样我就不会向用户提供本书中用于制作用户所需的其余宏或工作表/原始数据输入表。但是,每次我将工作表复制到一本新书并单击复选框时,它会打开原始工作表并通过原始工作表运行该模块。

所以我的问题是:如何链接模块和工作表,以便在复制工作表时模块出现? 我也尝试将模块放在工作表对象中,但我无法弄清楚如何让.OnAction函数调用它

2 个答案:

答案 0 :(得分:0)

这对我来说很好:

首先添加一个复选框并分配一个OnAction方法的代码:

Sub AddCheckbox()
    Dim sht As Worksheet, cbx
    Set sht = ThisWorkbook.Sheets("OriginalSheet")
    Set cbx = sht.CheckBoxes.Add(113.25, 56.25, 133.5, 20.25)
    cbx.Name = "cbx_1"
    cbx.Caption = "Testing"
    cbx.OnAction = sht.CodeName & ".CheckBoxClicked"
End Sub

在带有复选框的工作表的代码模块中:

Public Sub CheckBoxClicked()
    Dim c
    c = Application.Caller
    Debug.Print c, Me.Name, Me.Parent.Name
End Sub

单击复选框时输出:

cbx_1         OriginalSheet Book1

接下来将此工作表复制到另一个工作簿并重新分配复选框处理程序:

Sub CopySheet()
    Dim sht As Worksheet, cb As CheckBox
    Set sht = ThisWorkbook.Sheets("OriginalSheet")

    Application.CopyObjectsWithCells = True '<< make sure this is set
    sht.Copy after:=Workbooks("Book2").Sheets(1)
    Set sht = Workbooks("Book2").Sheets(2)
    sht.Name = "CopiedSheet"
    For Each cb In sht.CheckBoxes
        cb.OnAction = "'" & sht.Parent.Name & "'!" & _
                      sht.CodeName & ".CheckBoxClicked"
    Next cb

End Sub

单击复制的工作表中的复选框输出:

cbx_1    CopiedSheet   Book2

答案 1 :(得分:0)

感谢您的帮助!所有的答案都以他们自己的方式提供了帮助,但我遗漏的是,当使用工作表模块的On.Action功能时,工作表的名称与您在选项卡中重命名的内容不同