【问题标题】:Excel VBA - event change doesn't workExcel VBA - 事件更改不起作用
【发布时间】:2013-07-31 14:13:09
【问题描述】:

我对 VBA 还很陌生,但到目前为止,我还在学习。直到这一刻,我都被这个挑战困住了。

My goal is to select a percentage (10, 90 or 100) from a drop down menu in a cell in column B, C, D or E and when one of the percentages is selected, I want the same cell to calculate A列中值的选定百分比。

因此,当 A 列中的单元格的值为“500”并且在 C 列的同一行中,我选择“90”时,我希望将 90 替换为 450 (0.9*500)

这里给出的代码是我到目前为止所得到的,包括一些已经从另一个主题“借来”的代码。虽然它可以在新的、干净的 Excel 工作表中使用,但它无法在我希望它工作的文档中工作。

你们中的一些人有什么想法可以找到缺陷吗? (我什至创建了一个只有任务的命令按钮:Application.EnableEvents = True)

Private Sub Worksheet_Change(ByVal Target As Range)

On Error GoTo Whoa

If Not Intersect(Target, Range("B:D")) Is Nothing Then
    Application.EnableEvents = False
    If Target.Value = 90 Then Target.Value = 0.9 * Cells(Target, 1).Value
    ElseIf Target.Value = 10 Then Target.Value = 0.1 * Cells(Target, 1).Value
    ElseIf Target.Value = 100 Then Target.Value = Cells(Target, 1).Value
    Else
        MsgBox "Not a valid percentage"
    End If

Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue
End Sub

【问题讨论】:

  • 你说它不起作用。什么具体不起作用?你有错误吗?出乎意料的结果?请更详细地描述您遇到的问题。
  • 如果您只将此代码添加到工作表中,那么只有该工作表上的更改才会运行您的代码。这是stackoverflow.com/questions/10474356/vba-worksheet-change-event 的副本吗?

标签: excel vba events


【解决方案1】:

听起来你想要 Workbook_SheetChange 事件。在 VBA 编辑器中将您的逻辑添加到 ThisWorkbook。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    MsgBox "Cell changed. Target: " & Target.Worksheet.Name & "!" & Target.Address
End Sub

将上述代码添加到ThisWorkbook 后,工作簿中任何工作表上的更改都会触发该事件。

【讨论】:

  • 您好 km1,感谢您的代码。今天早上我实际上发现,当我重新打开文档时,代码工作得很好。我也用 If 替换了 ElseIf。看来这让事情变得更好了。
【解决方案2】:

您不需要 VBA 来完成您的要求。数据验证,公式将起作用:

【讨论】:

  • 嗨,肖恩,感谢您的反应。我实际上确实需要 VBA,因为我有超过 40 个周期,因此超过 40 个列可能会出现成本百分比。因此,我试图避免在公式中使用 40 个额外的列。此外,行数很容易超过 1000,因此为了保持文档较小,我认为只使用宏会更好。
【解决方案3】:

意味着您在 application.enableevents=false 时因错误而停止,并且您在没有 application.enableevents=true 的情况下再次运行该东西...

我其实有一个按钮解决这个问题,就在我调试代码的时候,或者在VB编辑器中,Ctrl+G,在即时窗口中,可以写application.enableevents=true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2016-09-23
    • 2021-02-15
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多