IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Boucle 3 variables


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    en alternance
    Inscrit en
    Mai 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : en alternance

    Informations forums :
    Inscription : Mai 2018
    Messages : 39
    Par défaut Boucle 3 variables
    Bonjour ! Une question surement bête mais à laquelle je ne trouve pas de réponse... Je voudrais écrire une boucle pour la macro suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sheets(6).Name = ws2.Cells(9, 3) & " - " & ws1.Cells(6, 4)
    Sheets(7).Name = ws2.Cells(9, 3) & " - " & ws1.Cells(7, 4)
    Sheets(8).Name = ws2.Cells(9, 3) & " - " & ws1.Cells(8, 4)
     
    Sheets(9).Name = ws2.Cells(10, 3) & " - " & ws1.Cells(6, 4)
    Sheets(10).Name = ws2.Cells(10, 3) & " - " & ws1.Cells(7, 4)
    Sheets(11).Name = ws2.Cells(10, 3) & " - " & ws1.Cells(8, 4)
     
    Sheets(12).Name = ws2.Cells(11, 3) & " - " & ws1.Cells(6, 4)
    Sheets(13).Name = ws2.Cells(11, 3) & " - " & ws1.Cells(7, 4)
    Sheets(14).Name = ws2.Cells(11, 3) & " - " & ws1.Cells(8, 4)
     
    Sheets(15).Name = ws2.Cells(12, 3) & " - " & ws1.Cells(6, 4)
    Sheets(16).Name = ws2.Cells(12, 3) & " - " & ws1.Cells(7, 4)
    Sheets(17).Name = ws2.Cells(12, 3) & " - " & ws1.Cells(8, 4)
     
    Sheets(18).Name = ws2.Cells(13, 3) & " - " & ws1.Cells(6, 4)
    Sheets(19).Name = ws2.Cells(13, 3) & " - " & ws1.Cells(7, 4)
    Sheets(20).Name = ws2.Cells(13, 3) & " - " & ws1.Cells(8, 4)
     
    Sheets(21).Name = ws2.Cells(14, 3) & " - " & ws1.Cells(6, 4)
    Sheets(22).Name = ws2.Cells(14, 3) & " - " & ws1.Cells(7, 4)
    Sheets(23).Name = ws2.Cells(14, 3) & " - " & ws1.Cells(8, 4)
     
    Sheets(24).Name = ws2.Cells(15, 3) & " - " & ws1.Cells(6, 4)
    Sheets(25).Name = ws2.Cells(15, 3) & " - " & ws1.Cells(7, 4)
    Sheets(26).Name = ws2.Cells(15, 3) & " - " & ws1.Cells(8, 4)
     
    Sheets(27).Name = ws2.Cells(16, 3) & " - " & ws1.Cells(6, 4)
    Sheets(28).Name = ws2.Cells(16, 3) & " - " & ws1.Cells(7, 4)
    Sheets(29).Name = ws2.Cells(16, 3) & " - " & ws1.Cells(8, 4)
    En sachant que je voudrais ajouter une option "si la cellule à gauche de ws2.Cells(9, 3) est vide alors passer à ws2.Cells(10, 3)".

    J'ai tenté d'écrire plusieurs versions de ce type de code (dont je n'ai pas gardé de copie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub test()
     
    Set ws1 = ThisWorkbook.Sheets(1)
    Set ws2 = ThisWorkbook.Sheets(2)
     
    WS_Count = ActiveWorkbook.Worksheets.Count
     
    For i = 9 To 16
     For j = 6 To WS_Count
      For k = 6 To 8
       If ws2.Cells(i, 2).Value = "" Then GoTo Continue Else
        Sheets(j).Name = ws2.Cells(i, 3) & " - " & ws1.Cells(k, 4)
       End If
      Next k
     Next j
    Continue:
    Next i
     
    End Sub
    Je n'arrive pas à trouver la bonne logique/syntaxe/écriture...

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Bonjour,

    essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i = 6 to 29
      Sheets(i).Name = ws2.Cells(7+int(i/3), 3) & " - " & ws1.Cells(6+(i mod 3), 4)
    next i

    En sachant que je voudrais ajouter une option "si la cellule à gauche de ws2.Cells(9, 3) est vide alors passer à ws2.Cells(10, 3)".
    Si ws2.Cells(10, 3) est vide tu passes à ws2.Cells(11,3) ? et ainsi de suite ?
    ws2.Cells(9, 3) n'est utilisé que dans les 3 premières lignes tu ne souhaites cette option que pour ces lignes ?

  3. #3
    Membre averti
    Femme Profil pro
    en alternance
    Inscrit en
    Mai 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : en alternance

    Informations forums :
    Inscription : Mai 2018
    Messages : 39
    Par défaut
    Bonjour halaster08 !

    Merci beaucoup pour ton aide, à première vue ça fonctionne

    Si ws2.Cells(10, 3) est vide tu passes à ws2.Cells(11,3) ? et ainsi de suite ?
    Oui !

    ws2.Cells(9, 3) n'est utilisé que dans les 3 premières lignes tu ne souhaites cette option que pour ces lignes ?
    En fait je voulais vraiment dire : "si la cellule à gauche de ws2.Cells(9, 3) est vide alors passer à ws2.Cells(10, 3)"
    Autrement dit si ws2.Cells(9, 2) est vide alors passer à ws2.Cells(10, 2), puis ws2.Cells(11, 2), etc. jusqu'à trouver une cellule non vide.
    Si ws2.Cells(11, 2) est non vide, alors boucler sur ws2.Cells(11, 3).

    Pour de plus amples informations, tu peux lire mon roman ci-dessous... si trop alambiqué, n'hésite pas à me poser d'autres questions !

    En fait pour faire (très) simple, j'essaie de générer un template. Sur la ws2, tu as un tableau avec colonne A le nom d'une boutique, B le nom d'un fichier source, C le code de la boutique.
    Pour chaque boutique, tu as 3 feuilles (1 : rapport financier, 2 : budget communication, 3 : budget événements) alimentées par le fichier source (une autre macro va chercher les données).
    La liste des boutiques évaluées est variable, le but est donc de créer le nombre de feuilles nécessaires à chaque mise à jour.

    Sur la ws1 tu as tous les verbatim utilisés dans le fichier car c'est un fichier qui sera utilisé par des francophones et des anglophones. Tu trouves l'anglais en colonne A, le français en colonne B et selon la valeur d'une cellule sur une autre feuille (liste déroulante "français, anglais" pour choisir la langue du fichier) la bonne version s'affiche en colonne D. C'est cette version qui est reprise dans tout le fichier à l'aide de formules.

    Dans la macro que j'ai postée hier tu avais :
    For i = 9 To 16 : sur la ws2 mon tableau avec nom boutique (A), nom fichier source (B), code boutique (C) se trouve en A9:C16 (cela correspond à une liste de 8 boutiques)
    For j = 6 To WS_Count : ws1 traduction, ws2 tableau, ws3 feuille 1 rapport financier total cumulé des 8 boutiques, ws4 feuille 2 budget communication total cumulé des 8 boutiques, ws5 feuille 3 budget événement total cumulé des 8 boutiques : je commence avec les feuilles boutiques à partir de la feuille 6 ; To WS_Count car comme je l'ai précisé la liste est variable et donc le nombre de feuilles à générer aussi
    For k = 6 To 8 : sur la ws1 mes traductions colonne D : ligne 6 = "RF" (abrégé de rapport financier), ligne 7 = "BC" (abrégé de budget communication), ligne 8 = "BE" (abrégé de budget évènement)

    Pour mettre à jour le fichier, je vais en ws2. Dans mon tableau qui ne bougera jamais (j'aurais toujours le nom de mes boutiques en colonne A des lignes 9 à 16 & le code de la boutique correspondant en colonne C des lignes 9 à 16), je ne fais que changer le nom du fichier source. Par exemple je veux mettre à jour la Boutique 1, je vais remplacer en B9 "Boutique 1 rapport du 01 01 2018.xlsm" par "Boutique 1 rapport du 15 01 2018.xlsm". Si je ne veux plus évaluer la Boutique 1, je supprime le nom du fichier et je laisse B9 vide.

    J'ai déjà une macro qui compte le nombre de valeurs en B9:B16, et qui crée autant de groupe de 3 feuilles qu'il y a de noms de fichiers en B9:B16. Disons que j'ai 3 noms de fichiers, je crée (3*3) 9 feuilles.

    L'idée de cette macro est de :
    1. Aller en ws2 et regarder si il y a un nom de fichier en B9. Si ce n'est pas le cas, je vais regarder en B10. Si B10 est vide également, je vais voir en B11, et ainsi de suite.
    2. Je trouve une cellule non vide en B11, je commence à boucler sur les 3 feuilles qui correspondent à la boutique de la ligne 11.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    'ignorer car ws2.Cells(9, 2) est vide
    Sheets(6).Name = ws2.Cells(9, 3) & " - " & ws1.Cells(6, 4)
    Sheets(7).Name = ws2.Cells(9, 3) & " - " & ws1.Cells(7, 4)
    Sheets(8).Name = ws2.Cells(9, 3) & " - " & ws1.Cells(8, 4)
     
    'ignorer car ws2.Cells(10, 2) est vide
    Sheets(9).Name = ws2.Cells(10, 3) & " - " & ws1.Cells(6, 4)
    Sheets(10).Name = ws2.Cells(10, 3) & " - " & ws1.Cells(7, 4)
    Sheets(11).Name = ws2.Cells(10, 3) & " - " & ws1.Cells(8, 4)
     
    'ws2.Cells(11, 2) est non vide
    Sheets(12).Name = ws2.Cells(11, 3) & " - " & ws1.Cells(6, 4)
    Sheets(13).Name = ws2.Cells(11, 3) & " - " & ws1.Cells(7, 4)
    Sheets(14).Name = ws2.Cells(11, 3) & " - " & ws1.Cells(8, 4)
    3. Pour la feuille ici nommée Sheets(12) alors que finalement je suis en Sheets(j) et donc dans notre exemple en Sheets(6), je vais donner le nom :
    ws2.Cells(11, 3) = code de la boutique 3 soit "B3"
    ws1.Cells(6, 4) = nom abrégé de la feuille 1 soit "RF"
    Ce qui me donne : "B3 - RF" pour Sheet 6
    Pour la feuille suivante, j'aurais : "B3 - BC" pour Sheet 7
    Pour la 3ème feuille, j'aurais : "B3 - BE" pour Sheet 8

    4. Je passe ensuite à la ws2 ligne suivante : B12 = vide ; je passe à la ligne suivante : B13 = non vide.
    Sheet 9 : B5 - RF
    Sheet 10 : B5 - BC
    Sheet 11 : B5 - BE

    5. Prochaine cellule non vide sur B = B16 donc :
    Sheet 12 : B8 - RF
    Sheet 13 : B8 - BC
    Sheet 14 : B8 - BE

    J'ai 14 feuilles : mes 5 feuilles de départ (ws1 trad, ws2 tableau, ws3 to ws5 cumulé total) + mes 9 feuilles pour mes 3 boutiques

    EDIT : ta macro fonctionne mais par exemple dans le cas où je n'ai que 9 feuilles comme dans cette exemple, au lieu d'attribuer B3, B12 & B16, ta macro va attribuer B1, B2 et B3. Il manque la condition "chercher les lignes non vides et attribuer la boutique correspondante".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Cre_Temp4()
     
    Set ws1 = ThisWorkbook.Sheets(1)
    Set ws2 = ThisWorkbook.Sheets(2)
     
    WS_Count = ActiveWorkbook.Worksheets.Count
     
    For i = 6 To WS_Count
    If ws2.Cells(7 + Int(i / 3), 3).Value = "" Then GoTo Continue Else
    Sheets(i).Name = ws2.Cells(7 + Int(i / 3), 2) & " - " & ws1.Cells(6 + (i Mod 3), 4)
    Continue:
    Next i
     
    End Sub
    ne fonctionne pas... Avec B9 et B10 vide, la macro va bien renommer les 3 dernières feuilles correspondant à B11 non vide. Mais les 6 premières feuilles sont ignorées.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Juste une petite remarque sur la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If ws2.Cells(7 + Int(i / 3), 3).Value = "" Then GoTo Continue Else
    Sheets(i).Name = ws2.Cells(7 + Int(i / 3), 2) & " - " & ws1.Cells(6 + (i Mod 3), 4)
    Continue:

    Pourquoi venir mettre un GoTo au milieu d'un if ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not(ws2.Cells(7 + Int(i / 3), 2).Value = "") then Sheets(i).Name = ws2.Cells(7 + Int(i / 3), 3) & " - " & ws1.Cells(6 + (i Mod 3), 4)
    Sur le fond: j'essaye de comprendre ton exemple, pour l'instant c'est pas clair, aurais-tu la possibilité de mettre des copies d'écran avant/après pour que je comprenne mieux où se trouve l'erreur

    edit: Je crois qu'en fait tu t'es planté sur les indices de colonnes dans ton if, tu teste la case vide en colonne 3 (donc C) et tu prends la valeur de la colonne 2 (donc B) or si j'ai bien compris tes explications c'est l'inverse.

  5. #5
    Membre averti
    Femme Profil pro
    en alternance
    Inscrit en
    Mai 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : en alternance

    Informations forums :
    Inscription : Mai 2018
    Messages : 39
    Par défaut
    Cela fait quelques moi que j'apprends en autodidacte, je reprends souvent des parties de code trouvées sur des fichiers au travail ou sur internet. J'ai trouvé ce GoTo quelque part et j'ai essayé de l'appliquer à mon cas, mais apparemment c'est une mauvaise application aha !

    Par rapport à ton edit : oui tu as raison j'ai inversé...

    Les captures écran demandées :

    Capture écran ws1 :
    Nom : ws1.PNG
Affichages : 106
Taille : 13,8 Ko

    Capture écran ws2 :
    Nom : ws2.PNG
Affichages : 96
Taille : 21,5 Ko

    Capture écran avant lancement macro qui génère les feuilles :
    Nom : before.PNG
Affichages : 103
Taille : 68,6 Ko

    Capture écran après lancement macro qui génère les feuilles :
    Nom : before 2.PNG
Affichages : 98
Taille : 75,1 Ko

    Capture écran après lancement macro dont nous sommes en train de discuter :
    Nom : after.PNG
Affichages : 99
Taille : 71,6 Ko

    Ce que je souhaiterai :
    Nom : target.PNG
Affichages : 96
Taille : 69,4 Ko

Discussions similaires

  1. Boucle et variables
    Par LCL2000 dans le forum ASP
    Réponses: 10
    Dernier message: 16/12/2006, 12h02
  2. [debutant]Boucles et Variables
    Par BlueBill dans le forum Débuter
    Réponses: 4
    Dernier message: 30/10/2006, 18h01
  3. Grand Débutant : problème boucle et variable
    Par carelha dans le forum Langage
    Réponses: 2
    Dernier message: 02/08/2006, 19h33
  4. boucles et variables
    Par pfrib dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 27/07/2006, 09h14
  5. Boucle avec variable à incrémenter
    Par snoop dans le forum Linux
    Réponses: 2
    Dernier message: 19/03/2004, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo