Stránka 1 z 1
VBA - podivné chování cyklu „Do While“ a „For each“
Napsal: 25 zář 2019 10:52
od atari
Tímto kódem přejmenuji 40 spuborů tak, že před původní název vložím 4místné náhodné číslo. První spuštění kódu je OK. Při druhém spuštění již kód přejmenuje některé soubory 2x (vždy ty stejné). Viz spoiler.
Kód: Vybrat vše
Sub prejmenuj()
Dim F As String
slozka = "D:Zdroj"
F = Dir(slozka) 'funkce DIR přidělí do "f" soubory z adresáře
i = 0
Do While F <> ""
i = i + 1
cislo = Int((9999 - 1000 + 1) * Rnd + 1000)
Name slozka & F As slozka & cislo & "_" & F
F = Dir() 'do "f" nactu dalsí soubor
Loop
End Sub
Poznatky:
1. Když je souborů méně (například 15) tak prvních 9 spuštění kódu je OK. Teprve 10-té spuštění přejmenuje některé soubory 2x.
2. Když je souborů 99, tak již druhé spuštění kódu přejmenuje některé soubory dokonce 3x.
3. Když soubory ukládám do jiné složky, tak se tento jev neděje.
4. Když použiju tento cyklus „For each", tak to dělá to samé:
Kód: Vybrat vše
Sub pokusEACH()
Set fso = CreateObject("Scripting.FileSystemObject")
Set F = fso.GetFolder("D:Zdroj") 'Return the Folder object
For Each file In F.Files
cislo = Int((9999 - 1000 + 1) * Rnd + 1000)
Name file As F & "" & cislo & "_" & file.Name
Next file
End Sub
Dokáže někdo říct, proč se tak děje, a proč to je rozdílné u různého počtu souborů?
ABBC3_SPOILER_SHOW
Ukázka př i 40 souborech:
prvni spusteni:--druhe spusteni:--------treti spusteni:
AA01.txt--------- 1168_AA35.txt----------1002_1168_AA35.txt
AA02.txt----------1203_AA01.txt----------1278_7110_2154_AA40.txt
AA03.txt----------1500_AA12.txt----------1404_8852_5878_AA23.txt
AA04.txt----------1548_AA15.txt----------1737_1949_AA38.txt
AA05.txt----------1665_AA37.txt----------1806_3985_AA39.txt
AA06.txt----------1949_AA38.txt----------1809_7101_AA05.txt
AA07.txt----------1966_AA29.txt----------1858_5136_AA31.txt
AA08.txt----------2154_AA40.txt----------1881_5522_AA06.txt
AA09.txt----------2400_AA19.txt----------2349_2893_AA36.txt
AA10.txt----------2406_AA24.txt----------2528_5270_AA20.txt
AA11.txt----------2893_AA36.txt----------2727_1966_AA29.txt
AA12.txt----------3194_AA13.txt----------2854_9348_5409_AA18.txt
AA13.txt----------3315_AA21.txt----------2868_4643_AA10.txt
AA14.txt----------3427_AA11.txt----------3117_7819_4181_AA09.txt
AA15.txt----------3985_AA39.txt----------3291_8446_1665_AA37.txt
AA16.txt----------4181_AA09.txt----------3309_6890_AA26.txt
AA17.txt----------4284_AA17.txt----------3456_5623_AA07.txt
AA18.txt----------4512_AA16.txt----------3456_6364_AA33.txt
AA19.txt----------4514_AA28.txt----------3675_7783_AA32.txt
AA20.txt----------4643_AA10.txt----------3904_7339_3194_AA13.txt
AA21.txt----------4872_AA04.txt----------3967_4872_AA04.txt
AA22.txt----------5136_AA31.txt----------4065_8494_AA34.txt
AA23.txt----------5166_AA08.txt----------4213_2406_AA24.txt
AA24.txt----------5270_AA20.txt----------4616_4284_AA17.txt
AA25.txt----------5409_AA18.txt----------4994_5554_AA27.txt
AA26.txt----------5522_AA06.txt----------5087_2400_AA19.txt
AA27.txt----------5554_AA27.txt----------5156_4512_AA16.txt
AA28.txt----------5623_AA07.txt----------5324_8055_AA30.txt
AA29.txt----------5878_AA23.txt----------5341_9245_AA03.txt
AA30.txt----------5890_AA02.txt----------5429_4514_AA28.txt
AA31.txt----------6364_AA33.txt----------5771_3427_AA11.txt
AA32.txt----------6658_AA22.txt----------5831_1203_AA01.txt
AA33.txt----------6890_AA26.txt----------5896_1548_AA15.txt
AA34.txt----------7101_AA05.txt----------6297_9446_AA25.txt
AA35.txt----------7783_AA32.txt----------6308_5166_AA08.txt
AA36.txt----------8055_AA30.txt----------6913_1500_AA12.txt
AA37.txt----------8494_AA34.txt----------7062_6658_AA22.txt
AA38.txt----------9245_AA03.txt----------7794_9811_AA14.txt
AA39.txt----------9446_AA25.txt----------8111_7756_5890_AA02.txt
AA40.txt----------9811_AA14.txt----------8780_9359_3315_AA21.txt
Dodatečně přidáno po 4 minutách 17 vteřinách:
Kdyby si to někdo chtěl vyzkoušet, tak soubory přikládám:
Re: VBA - podivné chování cyklu „Do While“ a „For each“
Napsal: 25 zář 2019 11:35
od elninoslov
Teraz nemám čas, ale tipujem, že je to kvôli tomu, že niektoré už premenované znovu nájde medzi súbormi, lebo pôjde podľa abecedy, a tie nové sa predsunú pred staré, lebo začnú "menším" znakom.
Re: VBA - podivné chování cyklu „Do While“ a „For each“
Napsal: 25 zář 2019 11:45
od atari
To mě také napadlo, jenže to abecedně nevychází a není to pravidelné, kdyby to bylo tou abecedou …
Re: VBA - podivné chování cyklu „Do While“ a „For each“
Napsal: 25 zář 2019 12:29
od elninoslov
Nerobte to ani cez While ani cez Each. Načítajte si zoznam súborov do poľa a potom postupne premenúvajte podľa toho poľa. Mám Vám to teda spraviť, či ovládate polia ?
Re: VBA - podivné chování cyklu „Do While“ a „For each“
Napsal: 25 zář 2019 12:34
od atari
Pole moc neovládám, ale já to již vyřešil tak, že přejmenované soubory ukládám do jiné složky, a tam to ten problém nedělá.
Zde to řeším jen proto, abych zjistil příčinu. Jen tak ze zvědavosti.
Re: VBA - podivné chování cyklu „Do While“ a „For each“
Napsal: 25 zář 2019 12:48
od elninoslov
Tak skúste toto. A inak skúste ešte v Preskumníkovy dať F5 (Refresh), nemusí totiž na všetky súbory zareagovať, možno ich len vivíte nepremenované, ale v skutočnosti sú premenované všetky.
Kód: Vybrat vše
Sub Premenuj()
Dim FSO As Object, F As Object, File As Object, arrOld() As String, i As Long, Path As String
Path = "z:\Premenuj\"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set F = FSO.GetFolder(Path)
ReDim arrOld(1 To F.Files.Count)
For Each File In F.Files
i = i + 1
arrOld(i) = File.Name
Next File
For i = LBound(arrOld) To UBound(arrOld)
Set File = FSO.getfile(Path & arrOld(i))
File.Name = Int((9999 - 1000 + 1) * Rnd + 1000) & "_" & File.Name
Next i
End Sub
Re: VBA - podivné chování cyklu „Do While“ a „For each“
Napsal: 25 zář 2019 12:52
od atari
Používám Total commander, tam s obnovením není problém. (Ono to je obráceně, přejmenované jsou vícekrát)
Večer budu u toho PC, tak to zkusím.
Dodatečně přidáno po 1 hodině 51 minutách 2 vteřinách:
Tak jsem to vyzkoušel. OK díky. S těmi poli to funguje spolehlivě.
Tak tedy ještě k tomu dotaz:
Rozumím tomu správně, že "
For i = LBound(arrOld) To UBound(arrOld)" projde celé pole od zdola nahoru?
Re: VBA - podivné chování cyklu „Do While“ a „For each“
Napsal: 25 zář 2019 15:31
od elninoslov
Áno pochopil ste to na šupu. Je to jednoduché.
-Načíta sa adresárová štruktúra do objektu F, a podľa počtu súborov sa pripraví pole o danej veľkosti.
-Postupne sa zapíšu všetky názvy súborov objektu F do poľa arrOld().
-Následne prebehne ešte jeden cyklus, kde sa vyberie názov každého súboru z poľa, a medzi cestu a názov sa vloží náhodné číslo.