2016-04-28 110 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