哪种机制允许 Excel 将用户的操作传达给外界?
Which mechanism allows Excel to communicate users' manipulations to outside?
Excel provides several options for developing applications that interface with it。
但似乎所有这些选项都允许从外部控制 Excel 工作簿。但是,我想要相反的方式,正是我想要 "listen to" 用户对 Excel 工作簿的操作。例如,侦听器可能是 Excel 中的加载项;当用户在单元格中输入一个值时,侦听器可以捕获此操作,并在屏幕上打印 "enter value XXX in cell XXX"。有谁知道有什么机制可以实现这个?
编辑 1:
感谢@Nathan_Sav 和@Rik Sportel 的投入。所以如果我理解的好的话,他们是在使用VBA来监听事件和产生消息,几乎所有的事件都可以被捕捉到。
让我详细说明我真正想做的事情。实际上,我想有一个Excel之外的应用程序(例如,用Python或.NET编写的),该应用程序可以根据用户对工作簿的操作进行一些操作。如果应用程序必须读取VBA监听器产生的消息,然后解析它们,然后做相应的操作,恐怕会很慢。是否有直接(或内部)方式让应用程序连接到 Excel 并听取用户的操作。
您可以通过使用带有 Excel 应用程序对象的 class 事件接收器 Excel 应用程序(在插件中控制所有 Excel 工作表),使用 with events 语句
类似的东西(未测试,因为 mo 无法访问 vba)
在 class clsExcelListner 中
private withevents excelListner as Excel.Application
public sub initialise(ExcelApp as Excel.Application)
set excelListner =ExcelApp
end sub
然后在工作簿中打开
public cls_ExcelListner as clsExcelListner
public sub Workbook_Open()
set cls_ExcelListner = new clsExcelListner
cls_ExcelLister.Initialise(application)
end sub
在class中,您可以随后使用工作表更改事件。这些将帮助您完成所需工作的事件已经在工作簿中,例如工作表更改等,可能最好使用这些事件,因为监听器需要考虑所有文档,并说用户另存为,然后如何你检查它的文档要听吗?
Nathan 已经指出了正确的方向。
然而,它可以做得更干净。
首先,您需要监听器 class。将以下内容放入您称为 "EventLogger"
的 class 模块中
Private WithEvents ExcelListener As Excel.Application
Private Sub Class_Initialize()
Set ExcelListener = Application
End Sub
Private Sub excelListener_SheetChange(ByVal Sh As Object, ByVal Target As Range)
MsgBox Sh.Name & "!" & Target.Address & " changed into " & Target.Value
End Sub
'Hook into any other events you wish.
在工作簿模块中将以下内容放入 Workbook_Open()
Public Sub Workbook_Open()
Set evLogger = New EventLogger
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Set evLogger = Nothing
End Sub
由于 class 的 Initialize 事件已经设置了应用程序,因此不再需要。
最后,您需要一个具有全局变量 EventLogger 的常规模块:
Public evLogger As EventLogger
现在您可以打开日志文件并写入每个事件,而不是消息框,只需在内存中附加一个巨大的字符串并在关闭时将其写入文本文件,记录每个事件,或任何您想要的。只需扩展 class 以容纳用户名等,发挥创意 :)
将整个工作簿另存为加载项并安装到用户的 Excel 中。
享受吧!
当您只想跟踪特定工作簿的更改时,您始终可以使用此处记录的本机更改跟踪器:https://support.office.com/en-us/article/Track-changes-in-a-shared-workbook-22aea671-cac7-4fa3-845d-eeb23725bd15
Excel provides several options for developing applications that interface with it。 但似乎所有这些选项都允许从外部控制 Excel 工作簿。但是,我想要相反的方式,正是我想要 "listen to" 用户对 Excel 工作簿的操作。例如,侦听器可能是 Excel 中的加载项;当用户在单元格中输入一个值时,侦听器可以捕获此操作,并在屏幕上打印 "enter value XXX in cell XXX"。有谁知道有什么机制可以实现这个?
编辑 1: 感谢@Nathan_Sav 和@Rik Sportel 的投入。所以如果我理解的好的话,他们是在使用VBA来监听事件和产生消息,几乎所有的事件都可以被捕捉到。
让我详细说明我真正想做的事情。实际上,我想有一个Excel之外的应用程序(例如,用Python或.NET编写的),该应用程序可以根据用户对工作簿的操作进行一些操作。如果应用程序必须读取VBA监听器产生的消息,然后解析它们,然后做相应的操作,恐怕会很慢。是否有直接(或内部)方式让应用程序连接到 Excel 并听取用户的操作。
您可以通过使用带有 Excel 应用程序对象的 class 事件接收器 Excel 应用程序(在插件中控制所有 Excel 工作表),使用 with events 语句
类似的东西(未测试,因为 mo 无法访问 vba)
在 class clsExcelListner 中
private withevents excelListner as Excel.Application
public sub initialise(ExcelApp as Excel.Application)
set excelListner =ExcelApp
end sub
然后在工作簿中打开
public cls_ExcelListner as clsExcelListner
public sub Workbook_Open()
set cls_ExcelListner = new clsExcelListner
cls_ExcelLister.Initialise(application)
end sub
在class中,您可以随后使用工作表更改事件。这些将帮助您完成所需工作的事件已经在工作簿中,例如工作表更改等,可能最好使用这些事件,因为监听器需要考虑所有文档,并说用户另存为,然后如何你检查它的文档要听吗?
Nathan 已经指出了正确的方向。 然而,它可以做得更干净。
首先,您需要监听器 class。将以下内容放入您称为 "EventLogger"
的 class 模块中Private WithEvents ExcelListener As Excel.Application
Private Sub Class_Initialize()
Set ExcelListener = Application
End Sub
Private Sub excelListener_SheetChange(ByVal Sh As Object, ByVal Target As Range)
MsgBox Sh.Name & "!" & Target.Address & " changed into " & Target.Value
End Sub
'Hook into any other events you wish.
在工作簿模块中将以下内容放入 Workbook_Open()
Public Sub Workbook_Open()
Set evLogger = New EventLogger
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Set evLogger = Nothing
End Sub
由于 class 的 Initialize 事件已经设置了应用程序,因此不再需要。
最后,您需要一个具有全局变量 EventLogger 的常规模块:
Public evLogger As EventLogger
现在您可以打开日志文件并写入每个事件,而不是消息框,只需在内存中附加一个巨大的字符串并在关闭时将其写入文本文件,记录每个事件,或任何您想要的。只需扩展 class 以容纳用户名等,发挥创意 :)
将整个工作簿另存为加载项并安装到用户的 Excel 中。 享受吧!
当您只想跟踪特定工作簿的更改时,您始终可以使用此处记录的本机更改跟踪器:https://support.office.com/en-us/article/Track-changes-in-a-shared-workbook-22aea671-cac7-4fa3-845d-eeb23725bd15