2016-06-09 97 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