Création d'une boucle.

Sybille

XLDnaute Junior
Bonjour :),

Toujours sur même macro depuis 2 jours (elle avance tres bien) :cool:.
Je suis sur la dernière ligne droite : la création de ma boucle!

J'ai un fichier avec plein d'onglet, dont chaque onglet doit s'enregistrer à des endroits différents, avec des noms différents... grâce à un tableau qui liste toutes ces informations, j'ai réussi a créer une macro qui pour la première ligne, enregistre bien mon 1er onglet dans le bon dossier avec le bon nom!! :D

Maintenant, il me faut créer une boucle pour arriver à faire automatiquement les lignes suivantes.

Voici le début de mon code :

Code:
 Dim max_boucles As Integer
     max_boucles = [Liste!D1].Value
    
     For i = 1 To 25
     If i > max_boucles Then 'Si A1 est vide ou contient un nombre > 25
           Exit For 'Si condition vraie, on quitte la boucle For
     End If

"les instructions"

Next ligne

(PS : est ce bien d'avoir choisi une boucle avec for?)

pour mes instructions, voici un des problème :

mon code est :
Code:
 dir_import = [Liste!E5].Value & "\"

Où dois je mettre le i pour qu'il passe à liste!E6???? o_O

Normalement, en m'expliquant juste cette ligne, je peux terminer tout mon code toute seule!

A l'avance merci

Sybille
 

Dranreb

XLDnaute Barbatruc
Bonjour.
N'avez vous pas vu ma réponse dans l'autre discussion ?
VB:
Dim T() As Variant, L As Long
T = [Liste!A4].CurrentRegion.Value
For L = 2 To UBound(T, 1)
   ThisWorkBook.Worksheets(T(L, 1)).Copy
   With ActiveSheet.UsedRange: .Value = .Value: End With
   ActiveWorkBook.SaveAs T(L, 5)
   ActiveWorkBook.Close
   Next L
 

Bebere

XLDnaute Barbatruc
bonjour

Code:
Sub x()
    Dim max_boucles As Long, i As Long, dir_import As String
    max_boucles = [Liste!D1].Value    'peut être que A1 est D1
    If max_boucles = 25 Then
        For i = 1 To max_boucles
            '     If I > max_boucles Then 'Si A1 est vide ou contient un nombre > 25
            '           Exit For 'Si condition vraie, on quitte la boucle For
        'End If
        dir_import = Sheets("Liste").Range("E" & i).Value & "\"

        '"les instructions"

    Next ligne
Else
    MsgBox "Compléter D1,svp"    ': Exit Sub 'si besoin
End If

End Sub
 

Sybille

XLDnaute Junior
Bonjour.
N'avez vous pas vu ma réponse dans l'autre discussion ?
VB:
Dim T() As Variant, L As Long
T = [Liste!A4].CurrentRegion.Value
For L = 2 To UBound(T, 1)
   ThisWorkBook.Worksheets(T(L, 1)).Copy
   With ActiveSheet.UsedRange: .Value = .Value: End With
   ActiveWorkBook.SaveAs T(L, 5)
   ActiveWorkBook.Close
   Next L

Oups non Désolé!! :oops:

Je vais réessayer avec votre réponse. Encore désolé, je suis passé à coté! :rolleyes:
 

Sybille

XLDnaute Junior
Bonjour,

Merci à vous deux! J'ai bien avancé!! :)
Désolé Dranreb, j'ai choisi la méthode de Bebere car elle est plus simple à comprendre à mon niveau :D
(j'ai tenté de maîtriser ta version pourtant!! :oops:)

MAIS, (malheureusement pour moi)
Je n'arrive pas a écrire la partie de code que tu m'a copié dans "le langage" de Bebere.

J'ai écris :
Code:
ThisWorkbook.Worksheets("Liste").Range("A" & i).CurrentRegion.Value.Copy
     With ActiveSheet.UsedRange: .Value = .Value
     End With

J'y mets de la volonté pourtant pour y arriver!!!
mais çà ne fonctionne pas! :(

J'ai encore écrit de travers???

A l'avance merci,

Sybille
 

Dranreb

XLDnaute Barbatruc
Qu'est ce que vous ne comprenez pas dans mon code ?
Ce qu'il faut savoir c'est que la propriété Value d'une expression Range représentant plusieurs cellules est directement un tableau VBA dynamique 2D, et qu'elle peut donc être affectée à une variable tableau. Non seulement l'accès à un élément du tableau est ensuite simplissime, mais en plus tout ça est considérablement plus rapide que d'accéder aux cellules au coup par coup. Et de surcroît, dans le cas de figure qui nous intéresse, ça n'a plus d'importance que ce ne soit plus le classeur contenant la macro qui est le classeur actif, mais celui qu'on vient de créer par copie de la feuille: vous n'avez plus à vous poser de question d'écriture à cause de ça, puisque vous n'avez de toute façon plus à consulter votre classeur vu que vous avez tout sous la main dans un tableau en mémoire.
VB:
Dim T() As Variant, L As Long ' Déclare un tableau dynamique et un entier long.
T = [Liste!A4].CurrentRegion.Value ' Charge dans la variable tableau dynamique T la valeur (donc
'   les valeurs de toutes ses cellules) de la zone en cours de la cellule A4 de la feuille "Liste",
'   c'est à dire la plage la contenant, délimitée par les lignes et colonnes vides les plus proches d'elle.
For L = 2 To UBound(T, 1) ' de 2 au nombre de lignes (on ne prend pas la ligne d'entête)
   ThisWorkbook.Worksheets(T(L, 1)).Copy ' T(L, 1) c'est donc le nom de la feuille
   With ActiveSheet.UsedRange: .Value = .Value: End With ' Supprime les formules de la feuille créée par copie.
   ActiveWorkbook.SaveAs T(L, 5)  & "\" & T(L, 3) ' C'est le Chemin\NomFichier à écrire si je ne me trompe.
   ActiveWorkbook.Close
   Next L
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 108
Messages
2 085 380
Membres
102 876
dernier inscrit
BouteilleMan