VBA - podivné chování cyklu „Do While“ a „For each“

Programy pro práci v kanceláři (Word, Excel, Access…=>Office)

Moderátor: Mods_senior

Uživatelský avatar
atari
Level 5
Level 5
Příspěvky: 2101
Registrován: říjen 08
Pohlaví: Muž

VBA - podivné chování cyklu „Do While“ a „For each“

Příspěvekod atari » 25 zář 2019 10:52

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ů?

► Zobrazit spoiler


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:
Nemáte oprávnění prohlížet přiložené soubory.
Naposledy upravil(a) atari dne 25 zář 2019 11:44, celkem upraveno 1 x.



Reklama
Uživatelský avatar
elninoslov
Level 2
Level 2
Příspěvky: 211
Registrován: červen 13
Pohlaví: Muž

Re: VBA - podivné chování cyklu „Do While“ a „For each“

Příspěvekod elninoslov » 25 zář 2019 11:35

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.

Uživatelský avatar
atari
Level 5
Level 5
Příspěvky: 2101
Registrován: říjen 08
Pohlaví: Muž

Re: VBA - podivné chování cyklu „Do While“ a „For each“

Příspěvekod atari » 25 zář 2019 11:45

To mě také napadlo, jenže to abecedně nevychází a není to pravidelné, kdyby to bylo tou abecedou …

Uživatelský avatar
elninoslov
Level 2
Level 2
Příspěvky: 211
Registrován: červen 13
Pohlaví: Muž

Re: VBA - podivné chování cyklu „Do While“ a „For each“

Příspěvekod elninoslov » 25 zář 2019 12:29

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 ?

Uživatelský avatar
atari
Level 5
Level 5
Příspěvky: 2101
Registrován: říjen 08
Pohlaví: Muž

Re: VBA - podivné chování cyklu „Do While“ a „For each“

Příspěvekod atari » 25 zář 2019 12:34

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.

Uživatelský avatar
elninoslov
Level 2
Level 2
Příspěvky: 211
Registrován: červen 13
Pohlaví: Muž

Re: VBA - podivné chování cyklu „Do While“ a „For each“

Příspěvekod elninoslov » 25 zář 2019 12:48

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

Uživatelský avatar
atari
Level 5
Level 5
Příspěvky: 2101
Registrován: říjen 08
Pohlaví: Muž

Re: VBA - podivné chování cyklu „Do While“ a „For each“

Příspěvekod atari » 25 zář 2019 12:52

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ě. :thumbup:

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?

Uživatelský avatar
elninoslov
Level 2
Level 2
Příspěvky: 211
Registrován: červen 13
Pohlaví: Muž

Re: VBA - podivné chování cyklu „Do While“ a „For each“

Příspěvekod elninoslov » 25 zář 2019 15:31

Á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.


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Podivné chování sítě
    od Jafff » 07 lis 2019 07:48 » v Sítě - hardware
    13
    743
    od ITCrowd
    08 lis 2019 21:21
  • Podivné zvuky
    od Thrasher » 10 srp 2019 13:55 » v Problémy s hardwarem
    13
    976
    od dvorakj
    14 srp 2019 22:41
  • Podivne vysoké hodnoty v HW monitore
    od TheSalon112 » 27 srp 2019 01:05 » v Vše ostatní (hw)
    2
    392
    od Skeleton
    27 srp 2019 09:33
  • Podivné praktiky největšího prodejce elektroniky v ČR
    od Scientific » 03 kvě 2019 20:41 » v Reklamace a zákony
    18
    1910
    od Scientific
    04 kvě 2019 18:17
  • BSOD a celkove velmi divne chovani
    od tobiasekll » 29 bře 2019 22:50 » v BSOD (Blue Screen Of Death)
    7
    1914
    od JegenaJk
    04 čer 2019 19:30

Zpět na “Kancelářské balíky”

Kdo je online

Uživatelé prohlížející si toto fórum: CommonCrawl [Bot] a 1 host