【问题标题】:Excel VBA to run Macro in new row is Inserted插入在新行中运行宏的 Excel VBA
【发布时间】:2019-10-02 22:12:50
【问题描述】:

我试图让我的电子表格在插入新行时自动采用之前的行格式和公式。

我阅读了您可以在哪里设置工作表以在进行更改时自动运行代码,但我很难让代码正常工作。

我尝试了以下方法,每次插入新行时,它都会不断添加一行,直到出现错误,我必须强制退出:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Range("A1:D25") = ActiveCell.EntireRow.Insert Then
        Cells(1, 2).Value = 10
    End If 
End Sub

我添加了Cell Value = 10 看看它是否有效。这只是一个测试,但仍然失败。

有人知道可能的解决方案吗?

【问题讨论】:

  • 这是看起来应该可以工作但以一种有趣的方式中断的事情之一。我不是 100% 确定它在那个 If 语句中做了什么......当你说“插入新行”时,你的意思是你在新行上附加了一些数据,在表格​​的更下方,或者你实际上是右键单击插入新行?在任何一种情况下,如果带有数据的最后一行向下移动,您可以在每个 worksheet_change 之后放置一个检查最后一行的事件,并将其附加到 / 检查包含 prev 的隐藏工作表中的值。最大行,如果是更高的值则运行

标签: excel vba


【解决方案1】:

您的代码中有两个主要问题

  1. 您正在引发事件级联。即您的更改事件正在触发进一步的更改事件
  2. .Insert 并没有像您认为的那样做。它不检测插入的行,它插入行。

我假设 "... 插入一个新行 ..." 你的意思是 插入一整行

此演示避免了与.EnableEvents = False 的级联,并使用Copy、pasteSpecial 来复制格式和公式。

Option Explicit

Dim RowsCount As Long ' Variable to track number of rows used in sheet

Private Sub Worksheet_Activate()
    RowsCount = Me.UsedRange.Rows.Count
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo EH
    ' Detect whole row changed
    If Target.Columns.Count = Me.Columns.Count Then
        ' Detect Extra Row
        If RowsCount = Me.UsedRange.Rows.Count - 1 Then
            ' Copy Formulas and Format new row
            Application.EnableEvents = False
            If Target.Row > 1 Then
                Target.Offset(-1, 0).Copy
                Target.PasteSpecial xlPasteFormulas, xlPasteSpecialOperationNone, False, False
                Target.PasteSpecial xlPasteFormats, xlPasteSpecialOperationNone, False, False
                Application.CutCopyMode = False
            End If
        End If
        RowsCount = Me.UsedRange.Rows.Count
    End If

EH:
    Application.EnableEvents = True
End Sub

【讨论】:

  • 当我使用此代码时,它不会在第一次插入时运行。此外,在第二次插入之后,它正在复制不包含公式的单元格的值。
【解决方案2】:

您似乎加入了错误的事件。您已将代码附加到“Worksheet_Change”事件,但您的代码也导致工作表发生更改

Cells(1, 2).Value = 10

右转并调用“Worksheet_Change”事件。

至于要附加到的正确事件,似乎没有“插入新行”的原生事件。

this page 上对此进行了讨论,这可能是您问题的答案...

【讨论】:

    【解决方案3】:

    就像@laughsloudly 所说,您的代码现在所做的是,一旦您在 A1:D25 范围内的任何位置进行更改,它将开始插入行,直到 Excel 用完行,这是一个开放循环。

    代码:

    If Target.Range("A1:D25") = ActiveCell.EntireRow.Insert Then
    

    旨在检查所采取的操作是否在您要监控的范围内。您不想在此行中执行操作。相反,您想要的更像是:

    If Target.Range("A1:D25") = ActiveCell Then
    

    这将允许您根据工作表中的操作运行代码。但是,您的声明“我试图让我的电子表格在插入新行时自动采用以前的行格式和公式。”不完全合乎逻辑。我认为您的意思是从上面的行中复制 所有格式,并且只从某些单元格中复制公式,对吗?因此,假设您的行都有相对于 A 列的公式,您不想复制所有行,因为您将覆盖 A。此外,在这种情况下,您只想监视 A 列。

    假设您在 B 到 K 列中有依赖于 A 列的公式,那么您只希望更改 A 列来影响电子表格。然后您的代码将如下所示:

    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Target.Column = ActiveCell.Column Then
            refRow = Target.Row - 1
            thisRow = Target.Row
            Range("B" & refRow & ":K" & refRow).Copy Range("B" & thisRow & ":K" & thisRow)
        End If
    
    End Sub
    

    当您对 A 进行更改时,这会复制除 A 列之外的所有内容。而且,正如前面提到的,您不希望代码对 A 列(在这种情况下)进行任何更改,而没有任何东西可以打破它那个递归循环。最好将条件格式应用于您指定为目标的任何列。

    希望对你有帮助,

    n8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多