Bucle imbricate

Una sau mai multe bucle pot fi imbricate într-o altă buclă pentru a realiza un șablon de repetări: se poate imbrica o buclă For... în altă buclă For..., o buclă For... într-o buclă Do, o buclă Do într-o buclă For..., sau o buclă Do în altă buclă Do.

VBA PERMITE PÂNĂ LA l6 NIVELE DE IMBRICARE, DAR CINE ARE NEVOIE DE O ASEMENEA COMPLEXITATE?

Pot fi imbricate până la 16 niveluri de bucle în VBA, dar codul devine prea complicat. Pentru simplificare, poate fi aleasă o altă abordare pentru a rezolva problema.

De exemplu, dacă trebuie să fie creat un anumit număr de foldere, iar fiecare să conțină un număr de subfoldere, se poate folosi o variantă a procedurii Creare_Foldere de mai sus. Dar la o astfel de procedură trebuie folosită imbricarea.

Caseta de dialog pentru procedură are nevoie de încă o casetă text pentru a scrie numărul de sub-foldere care vor fi create în fiecare folder. Noua fereastră de dialog este numită frmCreareFoldereSiSubFoldere iar caseta de dialog pentru numărul de subfoldere este numit txtCateSubFoldere. Figura următoare arată caseta de dialog.

1. Private Sub cmdOK_Click()
2. 
3. Dim strStartingFolder As String
4. Dim strFolderName As String
5. Dim strSubfolderName As String
6. Dim intSubfolder As Integer
7. Dim intLoopCounter As Integer
8. 
9. frmCreateFoldersAndSubfolders.Hide
10. Unload frmCreateFoldersAndSubfolders
11. 
12. strStartingFolder = CurDir
13. 
14. For intLoopCounter = 1 To txtHowManyFolders.Value
15. strFolderName = txtProjectNumber.Value & "s" & _
   Format(intLoopCounter, "0#")
16. MkDir strFolderName
17. ChDir strFolderName
18. For intSubfolder = 1  To txtHowManySubfolders.Value
19. strSubfolderName = "Subsection" & intSubfolder
20. MkDir strSubfolderName
21. Next intSubfolder
22. ChDir strStartingFolder
23. Next intLoopCounter
24. 
25. End Sub

Iată ce face codul din procedura de mai sus:

  • Linia 1 începe procedura, iar linia 25 o încheie.
  • Liniile de la 3 până la 5 declară trei variabile de tip String: strStartingFolder, strFolderName și strSubfolderName.
  • Linia 6 declară variabila intSubfolder de tip Integer, iar linia 7 declară variabila i de tip Integer.
  • Linia 9 ascunde formularul utilizatorului, iar linia 10 îl descarcă din memorie.
  • Linia 12 stochează numele folderului curent din variabila strStartingFolder de tip String. Este nevoie de această variabilă pentru a verifica dacă operațiunile care urmează se realizează în folderul corect din procedură. Liniile de la 14 până la 16 și linia 23 sunt la fel ca și cele din procedura anterioară. Ele construiesc numele folderului în afara proprietății Value a câmpului txtProjectNumber, litera s, un număr din două cifre și variabila i, apoi folosesc comanda MkDir pentru a crea folderul.
  • Linia 17 folosește comanda ChDir pentru a trece la folderul care a fost creat, strFolderName.
  • Pe linia 18, începe bucla imbricată For...Next. Această buclă este controlată de contorul din buclă intSubfolder și va fi executată de la intSubfolder = 1 până la intSubfolder = txtHowMany- SubFolders.Value, care este valoarea introdusă de utilizator în câmpul NumarDeSubfoldereDeCreat din caseta de dialog.
  • Linia 19 construiește variabila strSubfolderName de tip String formată din cuvântul Subsection și valoarea variabile contor intSubfolder. Pentru această procedură, se poate presupune că vor exista mai puțin de 10 subsecțiuni pentru fiecare dintre secțiuni, deci numerotarea cu o singură cifră este adecvată.
  • Linia 20 creează subfolderul folosind comanda MkDir cu variabila strSubfolderName de tip String.
  • Linia 21 folosește comanda Next Subfolder pentru a reveni la începutul buclei imbricate For...Next. VBA reevaluează condiția și repetă bucla de câte ori este nevoie.
  • Linia 22 schimbă folderul curent înapoi la strStartingFolder pentru următoarea iterație a buclei externe. (Altfel, următorul folder va fi creat din folderul curent, strFolderName.)
  • Linia 23 revine la începutul buclei externe.

FOLOSIREA VARIABILEI CONTOR CU NEXT CÂND SUNT IMBRICATE BUCLELE FOR...

Utilizarea variabilelor contorului cu comanda Next (Următorul) este opțională (în procedura de mai sus, variabilele contorului sunt denumite intLoopCounter și intSubfolder). Se poate folosi pur și simplu Next și VBA înțelege ce are de făcut.

Dar atunci când sunt bucle For... imbricate, este o idee bună să se includă o variabilă de contorizare, pentru vedea mai ușor ce buclă se încheie cu comanda Next (cu alte cuvinte, mai degrabă se folosește Next IntLoopCounter, decât versiunea simplă Next). Utilizarea unei variabile de contor face procedurile mult mai ușor de citit și poate preveni surprizele neplăcute (erorile). Buclele imbricate trebuie să se termine în ordinea inversă exactă a începerii lor, iar contoarele trebuie să se potrivească.