2014-08-29 52 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