2016-04-28 8 views
2

Also ich versuche, ein VBA-Programm zu schreiben, das einen Ordner auf neue Dateien überwacht und dann Sachen mit ihnen macht.VBA-Monitor-Ordner für neue Dateien

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/

Aber hier ist das Ding: Ich habe einige vielversprechende Beispiele zur Verwendung der WMI api gefunden Es scheint, wie die Klebrigkeit jeder mit diesen Beispielen nimmt, ist auf Draht die VBA in eine Excel-Tabelle als Makro. Menschen behandeln Excel als Programmierumgebung für Arme. Meinetwegen. Das Problem ist, ich brauche dies zu laufen, wenn der Benutzer diese magische Excel-Datei mit dem Makro geschlossen ist.

Etwas sagt mir, ich muss eine vollständige Windows-Anwendung in Visual Studio mit VB6.0 oder C# und führen Sie die Anwendung im Hintergrund als eine Art von geplanten Aufgabe. Ist das der richtige Weg oder gibt es etwas Einfaches, das ich in diesen Excel/VBA Tutorials vermisse?

(Apologies für die Allgemeinheit nicht in Frage. Ich weiß, dass die Gemeinschaft spezifische Fragen zu schätzen weiß.)

+2

* Ist Excel etwas anderes als die Programmierumgebung eines armen Mannes? –

+2

Sie verstehen, dass VBA für * Visual Basic für Applikationen * steht, und dass es nur innerhalb der Grenzen einer der Anwendungen, die Teil von MS Office sind, funktioniert? Und deshalb muss der Code ** ** in einer dieser Anwendungen laufen? Und dass VBA nicht außerhalb einer Excel-Tabelle oder eines Word-Dokuments ausgeführt werden kann oder ? Und deshalb können Sie es nicht für ein eigenständiges Programm verwenden? VBA ist die Programmiersprache des armen Mannes für Office-Anwendungen *. –

+0

Ja, das verstehe ich. Mein Instinkt ist, VBA alle zusammen zu vermeiden, aber ein Klient liebt es, und deshalb brauche ich eine solide Antwort, wenn sie mich fragen: "Warum hast du nicht ein Makro für Excel gemacht, um das zu tun?" Und jetzt habe ich es. – CodeOwl

Antwort

2

VBA und VBScript ähnlich ist. Für WMI ziemlich genau so. Hier sind drei Skripte. Sie können WMI auch mit Ereignishandlern verkabeln, sodass Sie mehrere Ereignisse anstelle von einem wie hier gezeigt haben können.

VB6 ist VBA, die in eine exe kompiliert werden kann. VB6 hostet die VBA-Sprache wie Office.

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

Ok- Ich habe eine Lösung dafür gefunden. Es ist nicht schön, aber man kann den Klappentext Code in diesem Tutorial gefunden kopieren:

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

in einen Excel-Makro und es wird funktionieren fast ohne Änderungen, eine Aufgabe, die Planung, die auch dann auftritt, wird nach Excel nach unten geschlossen . Die Lösung ist VBA zu verwenden, um eine Instanz der Task-Scheduler zu greifen

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

Und dann all die ausführlichen Konfigurationen für das Objekt ausführen die Aufgabe zu planen. Von dort ist es nur ein Sprungsprung und ein Sprung, um ein anderes Makro zu schreiben, das tatsächlich die Tat auf dem Faltblatt tut.

0

Ich denke nicht, Excel ist eine gute Lösung für diese Art von Bedarf. Wie wäre es mit VB.NET, um die Arbeit zu machen?

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

Ja, es ist übertrieben, aber wenn man in sie zu erhalten, finden Sie alle Arten von anderen wirklich coole Dinge, die Sie mit VB.NET tun können.Ich liebe es, mit Excel zu arbeiten, aber ich bin wirklich ein großer Befürworter des richtigen Tools für den Job.

+0

Ich könnte mehr nicht zustimmen. Aber es ist für einen Kunden. Und der Klient muss es unbedingt in einem Makro haben, aus Gründen. Ich habe versucht, sie davon abzubringen, aber sie sind gerade dabei, dies als Excel-Makro zu tun. – CodeOwl