2014-08-29 102 views
1

我试图让我的电子表格在插入新行时自动采用以前的行格式和公式。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,看看它是否会工作。这只是一个测试,但它仍然失败。

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

+0

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

回答

0

它看起来像你附加到错误的事件。您已连接您的代码为“Worksheet_Change”事件,但你的代码也引起变化的工作表

Cells(1, 2).Value = 10 

哪个对周围转,并调用“Worksheet_Change”事件。

至于要附加的正确事件,看起来没有“插入新行”的本机事件。

有这种过度的this page这可能是回答你的问题的讨论......

0

像@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.而且,正如前面提到的,你不想要的代码进行到列的任何变化一个(在这种情况下)没有任何东西把它从递归循环中分离出来。最好只是将条件格式应用于您指定为目标的任何列。

希望帮助,

N8

3

有在你的代码有两个主要问题

  1. 您造成的事件级联。即您的更改事件正在触发进一步的更改事件
  2. .Insert不会做你认为它所做的事情。它没有检测插入行,它插入行。

我被“......插入新行......”你的意思是插入一整排

这个演示避免了级联.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 
+0

当我使用此代码时,它不会在第一次插入时运行。此外,在第二次插入之后,它将复制不包含公式的单元格的值。 – user3925803 2017-02-25 03:56:06