如果单元格值被另一个模块更改,则excel on change不起作用



我有一个范围,其值是实时更改的,但如果该范围的值被其他模块更改,onchange模块将不执行任何操作。但是,如果我手动更改值,它会起作用。代码:-

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Dim lastRow As Long
Dim cell As Range

If Not Intersect(Target, Range("J10:J43")) Is Nothing Then
Application.EnableEvents = False
For Each cell In Target
If cell.Value < cell.Offset(0, 4).Value Then
cell.Offset(0, 7).Value = cell.Offset(0, 1).Value
'Module1.OnGenOrder
End If
Next cell


End If
Application.EnableEvents = True
End Sub

注:-我认为模块专用子工作表_Change(ByVal Target As Range)无法感知变化。该值由另一个外部.xla文件中的模块更改。但是通过简单公式(如=a1+b1)的改变可以很好地进行

更新

这是监控的小区代码

=c:Excelmacrosupdateprice.xla!dataupdate($H12,"price1")

事件处理程序有一个简单的命名约定:

Private Sub [EventSource]_[EventName]([args])

看到事件源Worksheet,您的处理程序似乎位于某个工作表的代码隐藏模块中;它将只响应工作表上的Change事件

如果要处理ThisWorkbook中任何工作表上的Change事件,请在ThisWorkbook:的代码隐藏模块中处理Workbook类的SheetChange事件

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
End Sub

请注意更改后的图纸是如何作为参数接收的。

如果你想处理另一个工作簿中任何工作表上的Change工作表事件,那么你需要一个类模块和一个WithEvents字段-后面的ThisWorkbook代码可以服务(毕竟,工作簿是一个类),为了简单起见:

Private WithEvents app As Excel.Application

您需要将app事件源的SetExcel.Application对象引用视情况而定(例如,在ThisWorkbookOpen处理程序中),然后您就可以处理应用程序范围的事件:

Private Sub Workbook_Open()
Set app = Excel.Application
End Sub
Private Sub app_SheetChange(ByVal Sh As Object, ByVal Target As Range)
MsgBox "Cell " & Target.Address(External:=True) & " was changed."
End Sub

最新更新