我试验了许多不同的方法,在检测到某一范围的单元格中的变化时,自动调用宏/函数,大致如下:
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
我想知道是否有更好的方法,即:
该应用程序用于监视range (B6:B18)
,如果我在B6中输入产品部件编号,函数decodepartnumber
将在C6中填写产品描述,在D6中填写产品价格。
最初,我用B6在C6中填充了=part_desc(A6)
和=part_price(A6)
,但这意味着用户无法轻松地编辑结果值。
任何关于最佳做法或替代办法的想法都将受到赞赏。
发布于 2018-10-12 12:04:30
作为另一种方法:您可以使用一个函数来触发更改(计算必须设置为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“发生更改时,该函数将触发(您的.2点),您仍然可以使用撤销选项,但有一个警告:撤消只对PartNumbers范围内的第一个撤消起作用,直到第一个撤销为止。
(+多个选择-不考虑更改)
发布于 2018-10-12 07:51:28
我认为在使用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
https://stackoverflow.com/questions/52774617
复制相似问题