Excel VBA宏删除动态范围不工作的公式

时间:2016-06-09 02:54:50

标签: excel vba excel-vba macros excel-2013

我有一系列的四个细胞。最左边的单元格(A列)是唯一值。右边的下三个单元格填充了公式。列B和C是Vlookup,当填充列A时从表2中提取值(否则单元格的值为“”)。当一个值放入A列时,D列填充当前日期(否则单元格的值也为“”)。

我想要做的是在将一个唯一值放入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 个答案:

答案 0 :(得分:1)

  1. 在更改Worksheet_Change中的值之前,请务必关闭事件处理。如果不这样做,例程将尝试自行运行。
  2. 如果A列中的更改指示需要删除公式,则将处理限制为A列发生更改时。
  3. ActiveCell在这里不是一个好选择。请改用Target。目标可以是一个或多个单元格。
  4. 从下往上查找A列中的第一个空单元格,而不是自上而下。
  5. 使用错误控制确保VLOOKUP已返回值,而不是错误。
  6. 以下是一些可以帮助您入门的通用代码。

    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