VBA监视新文件的文件夹

时间:2016-04-28 00:06:58

标签: excel vba excel-vba vb6

所以我试图编写一个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

https://blogs.technet.microsoft.com/heyscriptingguy/2004/10/11/how-can-i-automatically-run-a-script-any-time-a-file-is-added-to-a-folder/

但事情就是这样:看起来每个人都使用这些示例的方法是将VBA连接到Excel电子表格中作为宏。人们将Excel视为穷人的编程环境。很公平。问题是,当用户用宏关闭这个神奇的excel文件时,我需要运行它。

有些东西告诉我,我需要在Visual Studio中使用VB6.0或C#制作完整的Windows应用程序,并在后台运行应用程序作为某种计划任务。这是正确的路径还是我在这些Excel / VBA教程中缺少一些简单的东西?

(对问题的一般性表示道歉。我知道社区对具体问题表示赞赏。)

3 个答案:

答案 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,但我真的非常支持使用正确的工具。