我尝试了多种不同的方法,可以在检测到一定范围的单元格变化时自动调用宏/函数 类似于:
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对此进行编码的,但这意味着用户无法轻松地编辑结果值。
任何关于最佳实践的想法都会被赞赏,或者其他方法也会受到赞赏。
答案 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) 而且您仍然具有“撤消”选项,但有一个警告:“撤消”仅适用于直到“零件编号”范围中的第一个“撤消”。
(+不考虑多项选择更改)