2016-06-09 101 views
0

我有一個四個單元格的範圍。最左邊的單元格(A列)是一個獨特的值。接下來的三個單元格填充了公式。列B和C是Vlookups,當填充列A時(如果單元格的值爲「」),將從表單2中提取值。當D值被放入列A時,D列將填入當前日期(否則單元格的值也爲「」)。Excel VBA宏刪除動態範圍不起作用的公式

我想要做的是運行一個宏時,將一個唯一的值放入列A將殺死B,C,D中的公式並保留其值。然後它會自動選擇A列中後續行中的單元格.A3是固定的,這就是爲什麼我使用了End(xlDown)方法,然後是Activecell.Offset

這是我有一個Excel的轟炸在運行時:

Private Sub Worksheet_Change(ByVal Target As Range) 

Range(ActiveCell, ActiveCell.Offset(0, 3)).Value = Range(ActiveCell, ActiveCell.Offset(0, 3)).Value 
    Range("A3").Select 
    Selection.End(xlDown).Select 
    ActiveCell.Offset(1, 0).Select 
End Sub 

回答

1
  1. 務必關閉事件在Worksheet_Change改變值之前處理。如果你不這樣做,例程會嘗試運行。
  2. 如果列A中的更改指示需要刪除公式,則將處理限制在A列發生更改時。
  3. ActiveCell在這裏不是一個好的選擇。改用Target。目標可能是一個或多個單元格。
  4. 從下往上查找列A中的第一個空單元格,而不是從上到下。
  5. 使用錯誤控制來確保VLOOKUP具有返回值而不是錯誤。

下面是一些應該讓你開始的通用代碼。

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Columns("A")) Is Nothing Then 
     On Error GoTo bm_Safe_Exit 
     Application.EnableEvents = False 
     Dim rng As Range 
     For Each rng In Intersect(Target, Columns("A")) 
      If Not IsError(rng.Offset(0, 1)) Then 
       rng.Resize(1, 3) = rng.Resize(1, 3).Value 
      End If 
     Next rng 
     With Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) 
      'optionally put in new VLOOKUP formulas in column B and C 
      '.Offset(0, 1).FormulaR1C1 = "=VLOOKUP(RC1, Sheet2!C1:C3, 2, FALSE)" 
      '.Offset(0, 2).FormulaR1C1 = "=VLOOKUP(RC1, Sheet2!C1:C3, 3, FALSE)" 
      .Select 
     End With 
    End If 
bm_Safe_Exit: 
    Application.EnableEvents = True 
End Sub 
+0

這工作完美。我必須做的唯一改變是'rng.Resize(1,4)= rng.Resize(1,4).value'。並且謝謝你! – ackdaddy