【问题标题】:How to make a macro run with change in each cell of a dynamic table? Excel VBA如何使宏在动态表的每个单元格中随变化而运行? Excel VBA
【发布时间】:2019-05-03 14:47:12
【问题描述】:

我有一个大小由用户决定的表。每次用户在第一列的每个单元格中输入或更改值时,我都需要运行一个宏。

默认表格只有标题行和 1 个空白行。有一个单独的启用宏的按钮,其功能是在需要时向此表添加行。 我尝试使用下面的测试代码首先找出表格的大小,然后每次该表格第一列中的单元格发生变化时运行一个宏。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim dyString As String
Dim dyRange As Range
Dim LastRowEntry_1 As Integer

LastRowEntry_1 = ActiveSheet.ListObjects("TableName").Range.Rows.Count

dyString = "B12:B" & LastRowEntry_1
Set dyRange = Range(dyString)

If Not Intersect(Target.Columns(1), dyRange) Is Nothing Then
    If IsEmpty(Target.Value) = False Then
    'RUN MACRO 1
    End If
End If

End Sub

虽然宏针对第一行中的任何更改正常运行,但每次向表中添加新行时,宏仅在添加空白行(单击按钮)的操作上运行,而不针对任何对新行中单元格的后续更改。我需要它仅在这些单元格中输入值或更改现有值时运行,而不是在其空白时运行。

我哪里错了?

【问题讨论】:

  • 我建议使用ListColumns(1) 来引用表格的第一列,似乎它应该简化这一点(无需找到表格的最后一行)。

标签: excel vba


【解决方案1】:

您需要确保您的按钮代码不会干扰您的事件宏。

按如下方式构建按钮代码:

Sub ButtonCode()
    Application.EnableEvents = False
        ' your code to add rows
    Application.EnableEvents = True
End Sub

以及在您的事件宏中使用:

If IsEmpty(Target.Value) = False Then
    Application.EnableEvents = False
         'RUN MACRO 1
    Application.EnableEvents = True
End If

我也会替换:

If IsEmpty(Target.Value) = False Then

与:

If Target.Value <> "" Then

【讨论】:

  • 基于“每次用户进入或更改第一列每个单元格中的值时,我都需要一个宏来运行”的要求,我不是确定为什么需要检查单元格是否为空。你同意吗?
  • @BigBen,我认为因为每次向该表添加新行时,这都被视为更改,并且宏无论如何都会运行。
  • 我也按照@Gary'sStudent 的建议尝试使用 Application.EnableEvents。虽然这消除了每次添加行时都会运行宏的问题,但宏仍然不会针对添加的行中的更改运行。
  • 我最初的评论不是针对为什么添加新行会触发工作表更改事件。我想知道您是否希望宏在最初编辑单元格时运行,即如果它空白而现在不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2017-08-23
相关资源
最近更新 更多