VBA Excel-使用按钮调用宏

VBA Excel-使用按钮调用宏,vba,button,Vba,Button,我编写了以下宏,如果我确认要运行它,它将调用私有子工作表_Calculate()。请查看以下代码的第一部分: Sub test() Dim result As VbMsgBoxResult result = MsgBox("Run Macro?", vbYesNo, "Excel VBA") If result = vbYes Then Call Worksheet_Calculate End If End Sub Private Sub Worksheet_Calculate(

我编写了以下宏,如果我确认要运行它,它将调用私有子工作表_Calculate()。请查看以下代码的第一部分:

Sub test()
Dim result As VbMsgBoxResult

result = MsgBox("Run Macro?", vbYesNo, "Excel VBA")

If result = vbYes Then
    Call Worksheet_Calculate
End If

End Sub
Private Sub Worksheet_Calculate()
Dim lastrow As Long

lastrow = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row

    With Worksheets(1).Cells(lastrow, 2)
        .Offset(1, 0) = Cells(2, 1).Value
        .Offset(1, 1) = FormatDateTime(Now, vbLongTime)
    End With

End Sub
第二个代码是私有子工作表_Calculate(),它应复制B2中执行的计算结果,并将其粘贴到C2中,并向D2添加时间戳。列C和D作为B2更改中的值填充,因此我得到了C3和D3、C4和D4等中的结果和时间戳列表。下面是代码:

Sub test()
Dim result As VbMsgBoxResult

result = MsgBox("Run Macro?", vbYesNo, "Excel VBA")

If result = vbYes Then
    Call Worksheet_Calculate
End If

End Sub
Private Sub Worksheet_Calculate()
Dim lastrow As Long

lastrow = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row

    With Worksheets(1).Cells(lastrow, 2)
        .Offset(1, 0) = Cells(2, 1).Value
        .Offset(1, 1) = FormatDateTime(Now, vbLongTime)
    End With

End Sub
我面临的问题与以下事实有关:我的公共子工作表_Calculate()只被调用一次,并且每当我重新计算B2的值时,都不会发生任何事情

有没有办法a)保持第二个代码激活或b)有一个按钮或一个勾选框来激活/停用第二个代码

希望它有意义,提前谢谢

工作表计算事件 这是您放入模块1的内容,或者您将称之为模块的内容。这是使用Add module创建的普通模块。我保留了测试程序的名称,但我更改了另一个,因为它用于工作表事件,特别是工作表计算事件。test程序和变量
blnCalculation
启用或禁用整个过程,因此在启用之前,一开始不会发生任何事情。您可以为它创建一个按钮,并在其单击事件中只需添加
模块1。测试
,或从宏运行它

Option Explicit

Public TargetValue As Variant
Public blnCalculation As Boolean

Sub test()
    Dim result As VbMsgBoxResult
    result = MsgBox("Run Macro?", vbYesNo, "Excel VBA")
    If result = vbYes Then
        blnCalculation = True
        ActiveSheet.Calculate
      Else
        blnCalculation = False
    End If
End Sub

Sub SheetCalculate()
    Dim lastrow As Long
    With ActiveSheet
    lastrow = .Cells(Rows.Count, 2).End(xlUp).Row
        With .Cells(lastrow, 2)
            .Offset(1, 0) = .Parent.Cells(2, 1).Value
            .Offset(1, 1) = FormatDateTime(Now, vbLongTime)
        End With
    End With
End Sub
下面是您在每个工作表代码(也称为对象模块)中输入的内容,通过在VBE中双击它可以获得这些内容。每次Excel“决定”计算工作表时,都会发生工作表计算事件,在您的情况下,这可能是有保证的,因为您说在
B2
中有一个公式,所以每次计算
B2
时都会发生。但是它不会运行
SheetCalculate
程序,除非值已更改,该值已通过
TargetValue
变量进行检查。 工作表激活事件发生在工作表上,例如每次您在选项卡中选择它时。在这种情况下,它用于将新的
B2
值从新选择的工作表传递到
TargetValue
变量

Option Explicit

Private Sub Worksheet_Activate()
    If Module1.blnCalculation Then _
    Module1.TargetValue = Me.Range("B2").Value
End Sub

Private Sub Worksheet_Calculate()
    If Module1.blnCalculation Then
        If Me.Range("B2").Value <> Module1.TargetValue Then
            Module1.SheetCalculate
        End If
    End If
End Sub
选项显式
专用子工作表_Activate()
如果模块1.BLN计算,则_
Module1.TargetValue=Me.Range(“B2”).值
端接头
专用子工作表_Calculate()
如果模块1.BLN计算,则
如果Me.Range(“B2”).值Module1.TargetValue,则
模块1.1计算
如果结束
如果结束
端接头

在工作表代码模块或常规代码模块中,您在哪里有
工作表\u Calculate
代码?@BigBen,我在常规代码模块中有这两个代码,因为我希望我的代码在我打开的任何工作簿中都可用。我的目的是在缎带上有一个按钮。谢谢@BigBen,我以前从未使用过它,但我会做一些研究,试图理解它背后的想法,谢谢!通过“激活第二个代码”,您希望在工作簿计算时执行第二个代码,对吗?非常感谢!很抱歉,我最近几天没有上网,我会查看您的解决方案并尝试了解它,一定会让您知道,再次感谢!