哪一种机制可以让Excel将用户的操作传达给外部?

Excel为开发与之交互的应用程序提供了几个选项 。 但是,似乎所有这些选项都允许从外部控制Excel工作簿。 但是,我想反过来,正是我想“听”用户对Excel工作簿的操作。 例如,侦听器可能是Excel中的一个加载项; 当用户在单元格中input值时,监听器可以捕获此操作,并在屏幕上打印“在单元格XXX中input值XXX”。 有谁知道哪种机制可以实现这一点?

编辑1:感谢@Nathan_Sav和@Rik Sportel的input。 所以如果我理解的很好,他们使用VBA来收听事件并生成消息,几乎所有事件都可以被捕获。

让我详细说明我真正想做的事情。 实际上,我想在Excel之外有一个应用程序(例如用Python或.NET编写),应用程序可以根据用户在工作簿上的操作做一些操作。 如果应用程序必须读取由VBA监听器生成的消息,然后parsing它们,然后做相应的操作,恐怕会很慢。 是否有直接(或内在)的方式让应用程序连接到Excel,并听取用户的操作。

内森已经指向了正确的方向。 然而,它可以做得更干净。

首先,你需要Listener类。 将以下内容放在您称为“EventLogger”的类模块中

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 

由于该类的Initialize事件已经设置了该应用程序,因此不需要更多。

最后,你需要一个具有全局variablesEventLogger的常规模块:

 Public evLogger As EventLogger 

现在,您可以打开一个日志文件而不是消息箱来写每个事件,只需在内存中添加一个巨大的string,然后将其写入一个文本文件,logging每个事件或任何您想要的内容。 只需扩展该类以保存用户名等,具有创意:)

将整个工作簿保存为加载项并安装到用户的Excel中。 请享用!

如果您只希望跟踪特定工作簿的更改,则可以始终使用本地更改跟踪器,如以下文档所述: https : //support.office.com/zh-cn/article/Track-changes-in-a-shared-工作簿22aea671-cac7-4fa3-845d-eeb23725bd15

您可以通过使用具有Excel应用程序对象的类,使用with events语句将事件沉入Excel应用程序(在插件中控制所有Excel工作表)

所以像(没有testing,因为没有访问vba在莫)

在类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 

在课堂上,您可以使用工作表更改事件。 这些事件可以帮助你做你所需要的东西已经在工作簿中了,比如工作表变更等等,可能是最好的,因为列表员需要考虑所有的文档,并且说用户保存为你检查它的文件被听取?