我正在尝试让我的电子表格在插入新行时自动采用先前的行格式和公式。
我阅读了如何设置工作表以便在进行更改时自动运行代码,但我很难让代码工作。
我尝试了以下操作,每次插入新行时,它都会一直添加一行,直到出现错误并且我必须强行退出:
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 :(得分:3)
您的代码中存在两个主要问题
.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
答案 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