【问题标题】:VBA Excel - Call macro using buttonsVBA Excel - 使用按钮调用宏
【发布时间】:2018-12-12 22:51:32
【问题描述】:

如果我确认要运行它,我编写了以下调用 Private Sub Worksheet_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(),将复制在 B2 中执行的计算结果并将其粘贴到 C2 中,并在 D2 中添加时间戳。列 C 和 D 填充为 B2 中的值更改,以便我获得 C3 和 D3、C4 和 D4 等中的结果和时间戳列表。这是代码:

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

我面临的问题与我的 Public Sub Worksheet_Calculate() 仅被调用一次有关,而每当我重新计算 B2 的值时,什么都没有发生。

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

希望它有意义,在此先感谢!

【问题讨论】:

  • Worksheet_Calculate 代码在哪里,在工作表代码模块或常规代码模块中?
  • @BigBen,我在常规代码模块中都有这两个代码,因为我希望我的代码在我打开的任何工作簿中都可用。我的意图是在功能区中有一个按钮。谢谢!
  • @BigBen,我之前没用过,但我会做一些研究并尝试理解它背后的想法,谢谢!
  • 通过“激活第二个代码”,您希望第二个代码在工作簿计算时执行,对吧?

标签: excel vba button


【解决方案1】:

工作表计算事件

这是您放入 Module1 的内容,或者您​​将调用的模块。这是使用 Add Module 创建的普通模块。我保留了测试程序的名称不变,但我更改了另一个,因为它用于工作表事件,特别是 Worksheet Calculate 事件test 程序和变量blnCalculation 启用或禁用整个事情,所以一开始在你启用它之前什么都不会发生。您可以为其创建一个按钮,并在其 Click 事件 中添加 Module1.test 或直接从 Macros 运行它。

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 中双击它来获得它。 Worksheet Calculate 事件 发生在 Excel 每次“决定”计算工作表时,在您的情况下这可能是有保证的,因为您说 B2 中有一个公式,所以该事件会发生 每次B2 都会被计算。但它不会运行SheetCalculate 程序,除非值已更改 使用TargetValue 变量检查。 Worksheet Activate 事件 发生在工作表上,例如每次在选项卡中选择它时。在这种情况下,它用于将新选择的工作表中的新 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

【讨论】:

  • 非常感谢!抱歉,我这两天没上网,我会查看您的解决方案并尝试理解它,一定会通知您,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多