Excel VBA 宏删除动态范围不起作用的公式
Excel VBA macro to remove formulas for a dynamic range not working
我有四个单元格的范围。最左边的单元格(A 列)是唯一值。右侧接下来的三个单元格填充有公式。 B 列和 C 列是 Vlookup,它们在填充 A 列时从 sheet 2 中提取值(否则单元格的值为“”)。当将值放入 A 列时,D 列将填充当前日期(否则单元格的值也为“”)。
我想要做的是 运行 一个宏,当一个唯一值被放入 A 列时,它会杀死 B、C、D 中的公式并保留它们的值。然后它会自动选择 A 列中后续行中的单元格。A3 是固定的,这就是我使用 End(xlDown)
方法然后使用 Activecell.Offset
.
的原因
这就是我在轰炸 Excel 时 运行s:
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
- 在 Worksheet_Change 中更改值之前始终关闭事件处理。如果不这样做,例程将尝试 运行 在其自身之上。
- 如果 A 列中的更改决定了需要删除公式,则将处理限制在 A 列发生更改时。
- ActiveCell 在这里不是一个好的选择。请改用目标。目标可以是一个或多个单元格。
- 从下往上而不是从上往下查找 A 列中的第一个空单元格。
- 使用错误控制来确保 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
我有四个单元格的范围。最左边的单元格(A 列)是唯一值。右侧接下来的三个单元格填充有公式。 B 列和 C 列是 Vlookup,它们在填充 A 列时从 sheet 2 中提取值(否则单元格的值为“”)。当将值放入 A 列时,D 列将填充当前日期(否则单元格的值也为“”)。
我想要做的是 运行 一个宏,当一个唯一值被放入 A 列时,它会杀死 B、C、D 中的公式并保留它们的值。然后它会自动选择 A 列中后续行中的单元格。A3 是固定的,这就是我使用 End(xlDown)
方法然后使用 Activecell.Offset
.
这就是我在轰炸 Excel 时 运行s:
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
- 在 Worksheet_Change 中更改值之前始终关闭事件处理。如果不这样做,例程将尝试 运行 在其自身之上。
- 如果 A 列中的更改决定了需要删除公式,则将处理限制在 A 列发生更改时。
- ActiveCell 在这里不是一个好的选择。请改用目标。目标可以是一个或多个单元格。
- 从下往上而不是从上往下查找 A 列中的第一个空单元格。
- 使用错误控制来确保 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