Excel provides several options for developing applications that interface with it。 但似乎所有这些选项都允许从外部控制Excel工作簿。但是,我想要反过来,正是我想“听”用户对Excel工作簿的操作。例如,侦听器可能是Excel中的加载项;当用户在单元格中输入值时,监听器可以捕获此操作,并在屏幕上打印“在单元格XXX中输入值XXX”。有谁知道有哪种机制可以实现这个目标?
编辑1: 感谢@Nathan_Sav和@Rik Sportel的投入。因此,如果我理解得很好,他们正在使用VBA来监听事件并生成消息,几乎所有事件都可以被捕获。
让我详细说明我真正想做的事情。实际上,我希望在Excel之外有一个应用程序(例如,用Python或.NET编写),并且应用程序可以根据用户对工作簿的操作来执行一些操作。如果应用程序必须读取VBA监听器生成的消息,然后解析它们,然后做相应的操作,恐怕会很慢。是否有直接(或内部)方式让应用程序连接到Excel并听取用户的操作。
答案 0 :(得分:1)
您可以通过使用带有Excel应用程序对象的类,使用with events语句将事件接收Excel应用程序(在插件中控制所有Excel工作表)
所以类似的东西(没有测试过没有访问过的vba)
在类clsExcelListner
中private withevents excelListner as Excel.Application
public sub initialise(ExcelApp as Excel.Application)
set excelListner =ExcelApp
end sub
然后在Workbook Open
public cls_ExcelListner as clsExcelListner
public sub Workbook_Open()
set cls_ExcelListner = new clsExcelListner
cls_ExcelLister.Initialise(application)
end sub
在课程中,您可以使用工作表更改事件。这些事件可以帮助你做你需要的事情,已经在工作簿中,工作表更改等等,可能只是最好使用那些,因为列表工作者需要考虑所有文档,并说用户saveAs,然后如何你检查一下要收听的文件吗?
答案 1 :(得分:0)
首先,你需要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事件已经设置了应用程序,因此不再需要它。
最后,您需要一个具有全局变量EventLogger的常规模块:
Public evLogger As EventLogger
现在,您可以打开日志文件并编写每个事件,而不是消息框,只需在内存中附加一个巨大的字符串,然后将其写入关闭的文本文件,记录每个事件或任何您想要的内容。只需展开课程以保留用户名等,即可创作:)
将整个工作簿保存为加载项并安装到用户的Excel中。 享受!
如果您只想跟踪特定工作簿的更改,则可以始终使用本文所述的本机更改跟踪器:https://support.office.com/en-us/article/Track-changes-in-a-shared-workbook-22aea671-cac7-4fa3-845d-eeb23725bd15