Excel VBA在新行中运行macros被插入
我试图让我的电子表格自动采取以前的行格式和公式插入一个新行时。
我读了你可以设置你的工作表的地方来自动运行代码,如果改变了,但我很难得到的代码工作。
我已经尝试了以下,每次我插入一个新的行,它不断添加一个行,直到它得到一个错误,我必须强制退出:
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
,看看它是否会工作。 这只是一个testing,但仍然失败。
有谁知道可能的解决scheme?
你的代码中有两个主要的问题
- 您正在导致事件级联。 即您的更改事件正在触发进一步的更改事件
-
.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
看起来你是附属于错误的事件。 您已将您的代码附加到“Worksheet_Change”事件,但是您的代码也正在更改工作表
Cells(1, 2).Value = 10
其中右转并调用“Worksheet_Change”事件。
至于要附加的正确事件,看起来没有“插入新行”的本地事件。
在这个页面上有一个关于这个问题的讨论,这可能是你的问题的答案。
就像@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进行任何修改(在这个例子中),没有任何东西把它从这个recursion循环中分离出来。 最好只是将条件格式应用于您正在分配为目标的任何列。
希望有所帮助,
N8