< návrat zpět

MS Excel


Téma: hladanie súboru v priecinkoch rss

Zaslal/a 12.7.2021 13:00

Zdravím. Kód mi robí to že nájde súbor v priečinkoch, avšak ide iba do 2 podpriečinkov ak je ich viac vypíše chybu. Vedeli by ste mi pomôct? Ako mám spraviť to aby súbor našlo aj ked bude podpriečinkov povedzme 10. Vedel by som tam pridať 10x for each ale čo ak bude podpriečinkov 11 chcel by som to mať nejak automacické snád chápete ako to myslím.Sub PrintFolders() 'testovaci
Dim objFSO As Object
Dim objFolder As Object
Dim kategorie As Object
Dim film As Object
Dim folder As String

Sheets("Hárok2").Range("A2:F" & Sheets("Hárok2").Range("A99999").End(xlUp).Row).ClearContents
Application.StatusBar = ""
folder = Sheets("Hárok1").Range("B2").Value & ":\"

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objFSO.GetFolder(folder)
i = 1
'On Error GoTo handleCancel
Application.EnableCancelKey = xlErrorHandler

For Each kategorie In objFolder.subfolders

For Each film In kategorie.subfolders

Call PrintFiles(film.Path)

Next film
Next kategorie
handleCancel:
If Err = 18 Then
MsgBox "You cancelled"
End If
End Sub

Zaslat odpověď >

Strana:  « předchozí  1 2
#050993
elninoslov
K ostatnému, čo píšete, sa pozriem niekedy neskôr. Teraz len rýchlo k tomu, že to nefachá v Roote disku. To je preto, lebo Win v Roote každého disku vytvorí skrytý adresár "System Volume Information" s vyhradeným prístupom. Nastane chyba pri získavaní počtu obsiahnutých súborov (obmedzený prístup), a keďže tam máte možnosť prerušenia makra (formou vyvolania a odchytu chyby), tak vlastne táto chyba prístupu, vyvolá rovnaké ukončenie ako ESC. Preto by som navrhol testovať cez Len(Dir()) cestu, a ak sa jedná o takýto adresár, dostanete 0, tak sa to dá obísť aj so zachovaním umelého prerušenia makra cez ESC pomocou vyvolania chyby, a zároveň to nekrachne na adresároch s obmedzeným prístupom.
pred riadok
Count = objFolder.Files.Count
dajte toto
If Len(Dir(objFolder.Path, vbDirectory)) = 0 Then Exit Subcitovat
#050998
avatar
Vdaka oprava funguje. Bol by som ti vdačný ak by si mi s tým pomáhal aj dalej. Zatial teda dakujem a ozvi sa ked budeš mať čas.citovat
#051000
elninoslov

Sperhak napsal/a:

...Tie dáta chcem použit ako databázu a dalej s nimi pracovať a priradovat k nim veci.
Teraz som zistil že ak to zmažem a znova načítam tak mi tie veci čo som knim priradil náhodne priradí k iným filmom...

Ak spustíte makro na rovnakých vstupných dátach (nezmenené súbory, názvy, umiestnenie, rozloženie po adresároch, ani zmena dátumov a časov), tak neexistuje, aby makro vrátilo iný výsledok. Čiže ak ste v iných stĺpcoch doplnil ďalšie info, a potom znovu spustil makro, muselo Vám prepísať tie stĺpce, ktoré makro menilo, rovnakými dátami, a tie doplnené v iných stĺpcoch musia sedieť.

Každopádne, z toho čo píšete, vyplýva jedna alarmujúca vec. Ako chcete docieliť, že opätovným načítaním súborov z nejakého disku/adresára, sa pridajú do DB len info o tých súboroch, ktoré v DB ešte niesú? Lebo nechcete duplicity opakovaným spúšťaním akra na rovnakom zdroji??? DB je preto DB, lebo majú záznamy nejaký jednoznačný identifikátor ID. Takže pri pridávaní by ste mal do jedného stĺpca zapisovať automaticky sa zvyšujúce ID, aby nedošlo k zámene dát. Ak napr nahradíte na disku FHD film UHD filmom s rovnakým názvom, nový film bude na rovnakom umiestnení ale s iným ID. A filmy ktoré mažete, zmažte aj z DB. Tak nedôjde k omylu.

A čo sa týka toho zápisu. Vôbec nestačí iba odstrániť mazanie predošlých výsledkov (to ste tam mal aj pred tým). Treba upraviť zápis nových dát na prvý voľný riadok, pod pôvodné dáta. Zmeňte časť END_PROC na toto:
END_PROC:
If bPrint Then Sheets("Hárok2").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Resize(CountFiles, 6).Value = Application.Transpose(Info): Sheets("Hárok2").Activate


A ďalej v prípade uchovávania starších dát, treba pridať aj stĺpec s názvom disku, lebo to potom už nemôže stačiť, keď sa pri každom spustení iba prepíše bunka G2.

No treba to ešte premyslieť.citovat
#051002
avatar
Popravde s databazou som ešte nepracoval, ale ako píšete priradovať ID k dátam by bolo asi najlepšie.
Ako píšete do toho zoznamu/databázy by sa mali dostať všetky filmy z disku a nemali by sa tam opakovať. Ak pridám na disk dalši film alebo nejaky vymažem tak aby sa do databazy pridal len ten alebo aby z nej len ten zmizol. To s tým názvom disku som chcel samozrejme na všetky riadky, len som sa k tomu ešte nedostal.

Skúsil som zmenit ten kod ako ste mi radili
END_PROC:

If bPrint Then Sheets("Hárok2").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Resize(CountFiles, 6).Value = Application.Transpose(Info): Sheets("Hárok2").Activate

ale zoznam sa duplicitoval či mám nechať aj ten prikaz na mazanie zoznamu čo je na začiatku?

No premyslím si to ešte a skúsim si to nejak utriediť a rozkresliť na papier čo by to malo robiť.citovat
#051003
elninoslov
Nie, zmena toho riadku iba spôsobí, že sa dáta neprepíšu od bunky A2, ale pridajú sa až za poslednou vyplnenou v stĺpci A. Teda vyhovenie požiadavke neprepisovania, ale pridávania.

Podľa toho čo píšete, si neviem ani len predstaviť realizovateľnosť. Prečo? Tak napr.:
Spustím makro s diskom ABC, bude tam film Avatar.mkv. Potom spustím makro na disku DEF, kde bude tiež Avatar.mkv. Čo teraz? Je to iný film s rovnakým názvom? Rovnaký v inej kvalite? Ten istý iba presunutý na iný disk? Odkiaľ toto makro zistí? Dajme tomu, že keď je z iného disku, tak sa pridá. Teda budú tam dva Avatar.mkv. Potom ho presuniem na tretí disk, alebo do iného adresára. Spustím makro, a čo teraz? Pridá tretí? Zmaže prvý, druhý, ... ? Ak film fyzicky zmažem, spustím makro, ako makro zistí, či som film zmazal alebo či tam nikdy nebol?
Fúha, tak toto prinesie ešte veľké hlavolamy. Problém je v samotnej podstate filmov. Oni sa totiž často menia, presúvajú, mažú, a to všetko mimo kontrolných mechanizmov DB či kvázi-DB v Excelovskom makre.citovat
#051004
avatar
"Nie, zmena toho riadku iba spôsobí, že sa dáta neprepíšu od bunky A2, ale pridajú sa až za poslednou vyplnenou v stĺpci A. Teda vyhovenie požiadavke neprepisovania, ale pridávania."

Chapem ale pridaju sa tam aj dáta ktoré už v zozname sú a to mi tiež nevyhovuje.
Tiež to nechcem komplikovať viac ako to je. Môžu byť 2 skripty s 2 roznymy cestamy pre 2 rozdielne disky a každý by bol na inom hárku. Viem že keby to chcem blbuvzorné tak mi to nikto zadarmo nenapíše lebo by ten kód bol na 2000 riadkov.
Skúsim napísať ako by som si predstavoval body čo ste rozpísali, potom mi prosím napíšte či by to bolo jednoducho realizovatelné alebo nejak strašne zložité.
"""Ak film fyzicky zmažem, spustím makro, ako makro zistí, či som film zmazal alebo či tam nikdy nebol?"""
Tak keď nieje na disku tak ho odstráni aj z databázy.
"""Spustím makro s diskom ABC, bude tam film Avatar.mkv. Potom spustím makro na disku DEF, kde bude tiež Avatar.mkv. Čo teraz? Je to iný film s rovnakým názvom? Rovnaký v inej kvalite? Ten istý iba presunutý na iný disk? Odkiaľ toto makro zistí? Dajme tomu, že keď je z iného disku, tak sa pridá. Teda budú tam dva Avatar.mkv. Potom ho presuniem na tretí disk, alebo do iného adresára. Spustím makro, a čo teraz? Pridá tretí? Zmaže prvý, druhý, ... ?"""
No bude tam predsa aj ten názov disku a každý disk sa bude volať ináč tak podľa toho to bude vedieť.Do tej databázy by som to chcel tak že čo je na disku to je v databáze.citovat

Strana:  « předchozí  1 2

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje