Excel VBA-在检测到单元格值变化时调用函数的最佳实践

时间:2018-10-12 07:39:45

标签: excel vba

我尝试了多种不同的方法,可以在检测到一定范围的单元格变化时自动调用宏/函数 类似于:

Private Sub Worksheet_Change(ByVal Target As Range)
    Range ("PartNumbers") = "B6:B18"
    If Not Application.Intersect(Range(Target.Address), Range("PartNumbers")) Is Nothing Then
        Application.EnableEvents = False
        decodepartnumber (Target.Address)
        Application.EnableEvents = True
    End If
End Sub

我想知道是否有更好的方法,那就是:
1.避免丢失撤消历史记录
2.仅在值更改时才触发功能。

该应用程序旨在监视range (B6:B18),如果我在B6中输入产品部件号,则功能decodepartnumber将在C6中填写产品说明,在D6中填写产品价格。

我最初是用C6中的=part_desc(A6)=part_price(A6)分别填充的B6对此进行编码的,但这意味着用户无法轻松地编辑结果值。

任何关于最佳实践的想法都会被赞赏,或者其他方法也会受到赞赏。

2 个答案:

答案 0 :(得分:0)

我认为使用vba时,您将永远丢失撤消历史记录。 **编辑:没关系,以下内容确实保留了撤消历史记录,但会再次引起单元格的更改。

看看这个:

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim KeyCells As Range

 Set KeyCells = Range("B6:B18")

 If Not Application.Intersect(KeyCells, Range(Target.Address)) _
       Is Nothing Then
    ' Display a message when one of the designated cells has been
    ' changed.
    ' Place your code here.
    MsgBox "Cell " & Target.Address & " has changed."

 End If
End Sub

答案 1 :(得分:0)

作为另一种方法:您可以使用函数来触发更改(计算必须设置为xlAutomatic)

在模块中:

Function ValChange(Cell2Follow As Range) As String
 Evaluate "decodepartnumber(" & ActiveCell.Row & ")"
End Function

Sub decodepartnumber(rw As Long)
Cells(rw, 3).Value = "description ":   Cells(rw, 4).Value = "price"
End Sub

在单元格中(工作表上的某个地方):= ValChange(PartNumbers)

在“ PartNumbers”范围内进行更改时,该功能将触发(您的Point .2) 而且您仍然具有“撤消”选项,但有一个警告:“撤消”仅适用于直到“零件编号”范围中的第一个“撤消”。

(+不考虑多项选择更改)