Stránka 1 z 1

VBS script a excel soubor - kontrola na změnu

Napsal: 24 črc 2013 11:31
od ITCrowd
Zdravím. Na síťovém disku je uložen soubor, do kterého zapisují všichni pracovníci. Na řídícím pracovišti běží skript, který kontroluje změnu tohoto souboru a řídícího upozorní (pokud byl změněn). Protože excel změní datum a čas souboru již při otevření (při neuložení čas a datum vrátí zpět), nemohl jsem dost dobře použít systémovou proměnnou Last.Modified, která se mění taky. Vybruslil jsem z toho tak, že skript kontroloval atribut "a" souboru. Prostě, pokud tento atribut našel, oznámil změnu a atribut smazal. Bohužel po přechodu na excel 2007 jsem zjistil, že excel tento atribut dodá i při neuložení změn. Verze 2003 to nedělala. Řídící si již na upozorňování zvykli a teď pouhé prohlédnutí souboru libovolným pracovníkem vede k falešnému oznámení, že byl změněn.
Potřeboval bych nějaký nápad, jak zjistit u excelovského souboru pomocí vbs skriptu, že byl opravdu změněn. Nějaký návrh?
Díky moc za reakce.
Pro úplnost dodávám, že soubor obsahuje šest záložek a je třeba reagovat na změnu libovolné z nich. Testování na velikost by také k ničemu nevedlo, neboť například změna čísla v buňce nezpůsobí změnu velikosti souboru.

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 24 črc 2013 12:49
od franticek
Zdravím.

Co zkusit md5 nebo nějaký jiný hash souboru?
Ještě jsem našel attribut Date Last Saved, který se mění až po akci Save().

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 24 črc 2013 13:02
od ITCrowd
To mě taky napadlo, ale ani hash, ani crc nejde rozumně udělat ve vbs. Je třeba programů třetích stran.
Date Last Saved by mi stačila. Jenže potřebuje zase stáhnout od mrkvosoftu DSOfile.dll. Tam je problém s během na 64 bit.

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 24 črc 2013 20:00
od ITCrowd
up

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 25 črc 2013 08:46
od franticek
Ahoj.

DSOfile.dll problém na 64-bit systému je vyřešen tady.

Jinak něco jako MD hash script je tady a vypadá, že není třeba nic 3-tích stran (pouze to asi není pravý MD5 :-) )

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 25 črc 2013 09:22
od ITCrowd
Díky za snahu, ale vyřešen není. Skript musí běžet pod wscript.exe. navíc, i když ho spustím pod cscript, tak skončí chybou activex. Přitom registrace knihovny proběhla v pořádku. (Ostatně komentář o přechodu na OpenOfficeSDK mluví za vše).
Hash sice vypadá dobře, ale jen výpočet má milion řádků, což je daleko více, než měl původní skript. Nějaké jednodušší řešení by nebylo?
Zatím to zkouším přes počet obsazených řádků v sešitech, ale taky to není 100%, navíc se při každé kontrole musí spouštět objExcel.Application, což zbytečně bere procesorový výkon.
Ještě mě napadlo vzít dateLastModified a přitom zkontrolovat, zda je soubor otevřen. Ale na kontrolu otevření by bylo třeba zase něco jednoduchého.
Jinak demo ve vb7 dodané s DSOfile.dll funguje.

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 25 črc 2013 13:50
od franticek
Ahoj.

Napadlo mne udělat malou apku v C#, která buď udělá ten checksum nebo se zkusit dobrat k data last saved a zkompilovat to pro 64-bit systém.

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 25 črc 2013 14:37
od ITCrowd
Tak nakonec jsem to vyřešil takto - používám DateLast Modified. V případě, že skript zjistí změnu, pak pomocí volání OpenTextFile zkusí soubor otevřít pro zápis. Chybu, kterou by to vyvolalo v případě, že je soubor používán, zachycuji za běhu. V případě chyby je jasné, že soubor někdo prohlíží, nebo edituje a tudíž skript nereaguje. Pokud chyba nenastane, pak jde o regulérní změnu souboru a skript ji oznámí. Lokálně to funguje, uvidím, jak se to bude chovat se sítí.
Tímto bych poděkoval mrkvosoftu za skvělé usnadnění práce :evil: .
Appek bych mohl napsat milion, ale -
1. musím využívat součástí windows (bez programů třetích stran)
2. kód musí být čitelný (což u exe není)
Díky za snahu.

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 25 črc 2013 16:46
od franticek
Ahoj.

Taky řešení, jinak co použít powershell? Hledaný atribut má číslo 145.

Kód: Vybrat vše

$path = 'C:\vypis1.xls'
$shell = New-Object -COMObject Shell.Application
$folder = Split-Path $path
$file = Split-Path $path -Leaf
$shellfolder = $shell.Namespace($folder)
$shellfile = $shellfolder.ParseName($file)
0..287 | Where-Object { $shellfolder.GetDetailsOf($shellfile, $_) } |
Foreach-Object {
'{0} = {1} = {2}' -f $_,
$shellfolder.GetDetailsOf($null, $_),
$shellfolder.GetDetailsOf($shellfile, $_)
}

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 25 črc 2013 17:39
od ITCrowd
No, s powershellem se teprve začínám prát :D Samozřejmě mě napadl taky, jenže není standardní součástí winXP. Problém je totiž i ten, že přehráním jednoho souboru a následným restartem, můžeme vyrobit řídící pracoviště z libovolného jiného. Takže byť tento skript běží na W7, tak v případě nouze je nutné, aby běžel i na XP. kromě toho samozřejmě nehlídá jen jeden tento soubor, ale spoustu dalších věcí, na které upozorňuje, případně řeší (např. na serveru nahazuje spadlé služby). Už proto by volání dalších aplikací a cokoli jiného, co není standardní součástí woken, bylo problematické. každopádně díky.

Re: VBS script a excel soubor - kontrola na změnu

Napsal: 26 črc 2013 11:52
od franticek
Dobrá, dobrá, už mlčím :-).

Re: VBS script a excel soubor - kontrola na změnu  Vyřešeno

Napsal: 26 črc 2013 14:30
od ITCrowd
OK. zamykám.