所以我试图编写一个VBA程序,它将监视文件夹中的新文件然后用它们做些什么。我发现了一些使用WMI api的有希望的例子:
Receive notification of file creation in VBA without polling
http://www.mrexcel.com/forum/excel-questions/211547-monitor-new-files-folder.html
但事情就是这样:看起来每个人都使用这些示例的方法是将VBA连接到Excel电子表格中作为宏。人们将Excel视为穷人的编程环境。很公平。问题是,当用户用宏关闭这个神奇的excel文件时,我需要运行它。
有些东西告诉我,我需要在Visual Studio中使用VB6.0或C#制作完整的Windows应用程序,并在后台运行应用程序作为某种计划任务。这是正确的路径还是我在这些Excel / VBA教程中缺少一些简单的东西?
(对问题的一般性表示道歉。我知道社区对具体问题表示赞赏。)
答案 0 :(得分:4)
VBA和VBScript类似。对于WMI几乎一样。这是三个脚本。您还可以使用事件处理程序连接WMI,这样您就可以拥有多个事件而不是一个事件,如此处所示。
VB6是可以编译成exe的VBA。 VB6和Office一样托管VBA语言。
<强> InstanceCreationEvent 强>
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent= 'Win32_Directory.Name=""c:\\\\scripts""'")
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
Wscript.Echo objLatestEvent.TargetInstance.PartComponent
Loop
<强> InstanceModificationEvent 强>
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceModificationEvent WITHIN 10 WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent= 'Win32_Directory.Name=""c:\\\\scripts""'")
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
Wscript.Echo objLatestEvent.TargetInstance.PartComponent
Loop
<强> InstanceDeletionEvent 强>
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceDeletionEvent WITHIN 10 WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent= 'Win32_Directory.Name=""c:\\\\scripts""'")
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
Wscript.Echo objLatestEvent.TargetInstance.PartComponent
Loop
答案 1 :(得分:0)
好的 - 我找到了解决方法。它并不漂亮,但您可以复制本教程中的代码:
https://msdn.microsoft.com/en-us/library/aa383665(v=VS.85).aspx
进入一个excel宏,它几乎不需要修改即可工作,安排即使在excel关闭后也会发生的任务。解决方案是使用VBA来获取任务调度程序的实例
Set service = CreateObject("Schedule.Service")
call service.Connect()
然后对该对象执行所有详细配置以安排任务。从那里它只是一个跳跃跳跃和一个跳转来编写另一个宏,它将实际上在该文件夹上执行契约。
答案 2 :(得分:0)
我不认为Excel是满足这种需求的好方法。那么使用VB.NET来做这项工作呢?
http://www.dreamincode.net/forums/topic/150149-using-filesystemwatcher-in-vbnet/
是的,它有点矫枉过正,但如果你进入它,你会发现你可以用VB.NET做的各种其他非常酷的事情。我喜欢使用Excel,但我真的非常支持使用正确的工具。