【问题标题】:how to copy all of table information with dynamic vba cells in excel如何在excel中使用动态vba单元格复制所有表格信息
【发布时间】:2016-08-08 07:55:05
【问题描述】:

我在工作表中有一个表格,如下所示

我在所有OptionButtons 中都有 vba 代码。我的OptionButtons 代码如下所示:

Private Sub OptionButton11_Click()
    Worksheets("Sheet1").Activate
    Range("$J$6").Activate
    ActiveCell.FormulaR1C1 = "=RC[-5]*4"
    ActiveCell.Offset(5, 0).Select

    ActiveCell.Select
    ActiveCell.FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
End Sub

像这样:

Private Sub
    Worksheets("Sheet1").Activate
    Range("$J$8").Activate
    ActiveCell.FormulaR1C1 = "=RC[-5]*2"
    ActiveCell.Offset(3, 0).Select

    ActiveCell.Select
    ActiveCell.FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
End Sub

我在同一张纸上有 45 个这样的表格,我不想为每个单选按钮都添加代码。我的代码适用于第一张桌子,但我该如何复制它以供休息?

我想做一个像附件中的表格

【问题讨论】:

    标签: excel excel-2013 vba


    【解决方案1】:
    1. 您必须首先了解代码遵循的模式是什么。如果您可以识别模式,那么您所要做的就是为所有按钮使用非常简单的代码。

    2. 也不要使用ActiveX Option Button,而是使用Form Control Option Button。原因是我们可以使用Assign Macro将所有选项按钮绑定到同一个代码

    3. 我们将使用的下一个技巧是按顺序命名选项按钮,以便我们可以使用数字(例如:“选项按钮 1”中的 1)进行计算

      李>

    这是一个非常基本的示例,说明如何使用多个按钮来实现相同的功能

    假设我们的工作表如下所示。现在我们想要的是,我们选择相应行中单元格 J 的任何按钮都应该有一些值。

    将此代码放入模块中。接下来在每个Option Button 中,右键单击并单击Assign Macro。选择您编写的通用代码。在本例中,我们将选择Sample

    注意我们如何使用Application.Caller 来获取选项按钮的名称以实现我们想要的。

    Sub Sample()
        Dim i As Long
    
        i = Val(Trim(Replace(Application.Caller, "Option Button", "")))
    
        Sheet1.Range("J" & i + 1).Value = "Blah Blah Blah"
    End Sub
    

    在您的情况下,代码可以这样编写。您必须识别模式并相应地修改以下代码。

    Sub Sample()
        Dim i As Long
        Dim multiplier As Long
    
        i = Val(Trim(Replace(Application.Caller, "Option Button", "")))
    
        multiplier = i + 3
    
        With Sheet1.Range("J" & i + 5)
            .FormulaR1C1 = "=RC[-5]" & "*" & multiplier
            .Offset(i + 5, 0).FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
        End With
    End Sub
    

    注意:以上也可以通过 ActiveX 控件实现,但是您必须使用数组控件,如VBA – Control Arrays

    【讨论】:

    • Application.Caller 将为您提供调用代码的选项按钮的名称,并在Replace(Application.Caller, "Option Button", "") 中通过替换Option Button 中的Option Button 来检索号码@ 编辑:我看到您已删除你的评论?
    • 嗨,悉达多,我很高兴收到您的回复。我正在尝试理解您的回复。所以我无法得到 '(Replace(Application.Caller, "Option Button", "")' 并且当我将该代码写入我的 OptionButton 时,它总是写在同一列中。
    【解决方案2】:

    您可以编写 vba 代码以循环添加子例程到模块。例如,如果您想在 Module1 中添加子程序 Private Sub OptionButton1()、Private Sub OptionButton2()、Private Sub OptionButton3() 等等,

    Sub AddProcedureToModule()
        Dim VBProj As VBIDE.VBProject
        Dim VBComp As VBIDE.VBComponent
        Dim CodeMod As VBIDE.CodeModule
        Dim LineNum As Long
        Const DQUOTE = """" ' one " character
    
        Set VBProj = ActiveWorkbook.VBProject
        Set VBComp = VBProj.VBComponents("Module1")
        Set CodeMod = VBComp.CodeModule
    
        With CodeMod
    
        For i = 1 To 5
            LineNum = .CountOfLines + 1
            .InsertLines LineNum, "Private Sub OptionButton" & i & "_Click()"
            LineNum = LineNum + 1
            .InsertLines LineNum, "    MsgBox " & DQUOTE & "Hello World" & DQUOTE
            LineNum = LineNum + 1
            .InsertLines LineNum, "End Sub"
        Next i
    
        End With
    End Sub
    

    这会将以下代码插入到您的 Module1

    Private Sub OptionButton1_Click()
        MsgBox "Hello World"
    End Sub
    Private Sub OptionButton2_Click()
        MsgBox "Hello World"
    End Sub
    Private Sub OptionButton3_Click()
        MsgBox "Hello World"
    End Sub
    Private Sub OptionButton4_Click()
        MsgBox "Hello World"
    End Sub
    Private Sub OptionButton5_Click()
        MsgBox "Hello World"
    End Sub
    

    【讨论】:

    • 1 个表格有 28 个选项按钮。因此,假设您要求他复制代码 168 次 6 表???我想知道如果他有更多的桌子,他的项目会发生什么;)
    • 现在我有 6 个表,但我将有超过 50 个表结束 proejct。 :)
    • 我的老板想要我一份比赛的得分表。有50多个项目。我会把这个优秀的成绩交给陪审团。
    • 悉达多,我可能理解错了她的问题。我以为她只是想通过微小的变化多次复制该功能,可以通过这种方式循环完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多