2016-04-28 115 views
2

因此,我正在尝试编写一个VBA程序,该程序将监视文件夹中的新文件,然后对它们进行操作。我已经发现了一些令人鼓舞的例子,在使用WMI API:新文件的VBA监视器文件夹

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文件时,我需要这个运行。

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

(道歉问题的普遍性。我知道社会赞赏的具体问题。)

+2

*是* Excel是穷人的编程环境以外的东西吗? –

+2

您明白VBA代表* Visual Basic for Applications *,并且它只能在属于MS Office的应用程序之一的范围内工作?因此,代码**必须在其中一个应用程序中运行**。并且该VBA不能在Excel电子表格或Word文档之外运行,或<在此处插入所有其他Office应用程序>?那因此你不能将它用于独立程序? VBA是* Office应用程序*的穷人编程语言。 –

+0

是的,我明白了。我的直觉是避免将VBA集中在一起,但是客户喜欢它,因此当他们问我“为什么你不用Excel制作一个宏来做这件事?”时,我需要一个坚实的答案。现在我拥有了。 – CodeOwl

回答

2

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

好的 - 我找到了解决方案。这不是很漂亮,但你可以的代码在本教程中发现的Blurb的复制:

https://msdn.microsoft.com/en-us/library/aa383665(v=VS.85).aspx

成Excel宏,它几乎不经修改,调度Excel有倒闭后甚至会出现任务。该解决方案是使用VBA抢任务调度

Set service = CreateObject("Schedule.Service") 
call service.Connect() 

的一个实例,然后执行所有的详细配置该对象上安排任务。从那里它只有一个跳跃跳跃和一个跳转来写一个实际上做文件夹上的契约的其他宏。

0

我不认为Excel是这种需求的一个很好的解决方案。如何使用VB.NET来完成这项工作?

http://www.dreamincode.net/forums/topic/150149-using-filesystemwatcher-in-vbnet/

是的,这是矫枉过正,但如果你进入它,你会发现各种其他很酷的东西,你可以用VB.NET做。我喜欢与Excel合作,但我真的是使用正确的工具来支持这项工作的巨大支持者。

+0

我完全同意。但它是为客户。由于原因,客户必须拥有一个宏。我试图把它们说出来,但是它们只是把它作为一个excel宏而已。 – CodeOwl