在新行中运行宏的Excel VBA已插入

时间:2014-08-29 17:55:15

标签: excel vba excel-vba

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

我阅读了如何设置工作表以便在进行更改时自动运行代码,但我很难让代码工作。

我尝试了以下操作,每次插入新行时,它都会一直添加一行,直到出现错误并且我必须强行退出:

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以查看它是否可行。这只是一个测试,但它仍然失败。

有谁知道可能的解决方案?

3 个答案:

答案 0 :(得分:3)

您的代码中存在两个主要问题

  1. 您正在引发事件级联。即您的更改事件正在触发进一步的更改事件
  2. .Insert没有做你认为它做的事情。它没有检测插入的行,它插入行。
  3. 我假设“...插入一个新行......”你的意思是插入整行

    此演示可避免使用.EnableEvents = False级联,并使用CopypasteSpecial复制格式和公式。

    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
    

答案 1 :(得分:0)

看起来你对错误的事件感兴趣。您已将代码附加到“Worksheet_Change”事件,但您的代码也导致更改工作表

Cells(1, 2).Value = 10

右转并调用“Worksheet_Change”事件。

至于要附加的正确事件,看起来“New Row Inserted”没有原生事件。

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

答案 2 :(得分:0)

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

代码:

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

用于检查所采取的操作是否在您要监控的范围内。您不希望在此行中执行操作。相反,你想要更像的东西:

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

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

因此,假设您在依赖于A列的B到K列中有公式,那么您只需要更改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