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 :

Quelle type de boucle ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut Quelle type de boucle ?
    Bonjour à tous.

    J'ai codé une grosse macro qui "subit" des ajouts de bouts de code au fur et à mesure que je rencontre des problèmes.
    Aujourd'hui, je me suis dit qu'il serait préférable, avant de lancer les instructions de traitement d'un fichier, de contrôler si l'utilisateur n'a pas déjà un classeur d'ouvert.
    Je vais donc tester si le classeur ouvert et actif est valide pour que ma macro puisse s'exécuter.
    Évidemment, si l'opérateur a ouvert excel et qu'il y a un classeur vierge d'ouvert avec les 3 feuilles vierges que l'on connait bien ("Feuil1", "Feuil2" et "Feuil3"), ma macro va forcément planter (car elle dépend du contenu du fichier).
    Je me suis donc dit que j'allais faire une boucle sur le nombre de feuilles présentes dans le classeur ouvert actif (tant pis s'il y a plusieurs classeurs d'ouverts) et contrôler le nom de chaque feuille afin de voir s'il y en a une dont le nom correspondrait à un nom requis (exemple: "Suivi actif").

    Je ne parviens pas à traduire cela en algorithme et en boucles.
    J'ai toujours eu l'habitude d'utiliser For Next et il n'y a que peu, que je me suis mis (je me suis obligé) à utiliser Do loop et peut-être les autres.
    Pour de vrai, je n'utilise (en alternative à for next) que Do While loop.

    Je ne sais pas traduire par une boucle tant que le nom de la feuille (n) n'est pas = à "Suivi actif", je continue de scanner les autres feuilles mais si RIEN n'est trouvé alors je sors de ma SUB.

    La contrainte dans tout cela, c'est que je ne veux pas mettre un if et un else en début de procédure et un END IF tout en bas de ma précédure: j'ai peur de galérer en cas de dépannage à retrouver le IF correspondant au END IF.

    L'idéal serait de récupérer le nom de toutes les feuilles et SEULEMENT à la fin de tester si au moins l'une d'entre elles a le nom requis pour continuer l'exécution de la macro sinon, EXIT SUB.
    Mais je n'y arrive pas.
    Si je mets une condition avec un If nom de la Feuille (n) <> "Suivi actif" then Exit Sub, je sors direct de la procédure sans avoir le temps de tester les autres feuilles.

    J'aimerais rajouter un petit"bloc" de code qui teste ça mais sans englober toute ma "géante" macro (si, si je suis modeste) dans ce nouveau IF.

    Si je trouve encore un autre IF à rajouter pour ajouter un nouveau contrôle, je vais me retrouver avec des milliards de If imbriqués, ce que je ne souhaite pas.

    Je passe pas mal de temps sur le tuto e Silkyroad sur la gestion des boucles, mais je ne trouve pas la traduction de ce que je veux faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    'Teste s'il y a plusieurs classeurs d'ouverts au lancement de la macro avec le risque d’exécuter la macro sur le mauvais classeur
    nbClasseurOuverts = Application.Workbooks.Count
    'Teste si le classeur actif est valide en faisant un test sur le nom d'une des feuilles du classeur ("Suivi actif")
    For n = 1 To Application.ActiveWorkbook.Worksheets.Count
        NomSheetClasseurActif = Application.ActiveWorkbook.Worksheets.Item(i).Name
            If NomSheetClasseurActif <> "Suivi actif" Then 'Ne convient forcément pas
                Exit For
            End If
    Next
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'Teste s'il y a plusieurs classeurs d'ouverts au lancement de la macro avec le risque d’exécuter la macro sur le mauvais classeur
    nbClasseurOuverts = Application.Workbooks.Count'Teste si le classeur actif est valide en faisant un test sur le nom d'une des feuilles du classeur ("Suivi actif")
    For n = 1 To Application.ActiveWorkbook.Worksheets.Count
        NomSheetClasseurActif = Application.ActiveWorkbook.Worksheets.Item(i).Name
            Do While NomSheetClasseurActif <> "Suivi actif" Then 'Ne convient forcément pas
                Exit For
            Loop
    Next
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'Teste s'il y a plusieurs classeurs d'ouverts au lancement de la macro avec le risque d’exécuter la macro sur le mauvais classeur
    nbClasseurOuverts = Application.Workbooks.Count'Teste si le classeur actif est valide en faisant un test sur le nom d'une des feuilles du classeur ("Suivi actif")
    Pour toutes les feuilles contenues dans le classeur actif
    If aucun des noms de toute les feuilles du classeur ne correspond à "Suivi actif" alors
    Msgbox "Le classeur actif n'est pas valide. Ouvrez ou activez un fichier valide." 'si le nb de classeurs ouverts est > 1
    Exit Sub
    End If
    Ma macro qui poursuit le traitement
    Si vous avez quelques lumières à jeter sur me zones d'ombre...

    Merci d'avance.

  2. #2
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Avec une fonction vous pouvez vous inspirer de ce qui suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ' tester si la feuille existe
    ' ---------------------------
    Function existe_feuille(nom_feuille)
        For i = 1 To Worksheets.Count
            If Worksheets(i).Name = nom_feuille Then
                existe_feuille = True
                Exit Function
            End If
        Next i
        existe_feuille = False
        Exit Function
     End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        'effacer si existe déjà la feuille "Ma_Feuille"
        If existe_feuille("Ma_Feuille") = True Then
           Application.DisplayAlerts = False
           Sheets("Ma_Feuille").Cells.ClearContents
           Application.DisplayAlerts = True
        Else
           Sheets.Add.Name = "Ma_Feuille"
           Sheets("Ma_Feuille").Move After:=Sheets(1)
        End If

  3. #3
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,
    Pourquoi n'utiliserais-tu pas une boucle sur tes feuilles?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim feuillePresente As Boolean
    Dim sh As Worksheet
    feuillePresente = False
    For Each sh In Worksheets
        If sh.Name = "Suivi Actif" Then
            feuillePresente = True
            Exit For
        End If
    Next sh
    MsgBox "La feuille est présente : " & feuillePresente

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut
    Bonjour Riaolle et argoet.

    Merci pour vos solutions qui se rejoignent grâce au subterfuge d'une variable true/false.
    Je suis vraiment une quiche parce que j'ai déjà utilisé ce subterfuge (das une autre macro) mais pas assez pour que ça me saute à la figure.
    Je voulais absolument essayer de passer par une formulation de boucle que je n'ai pas l'habitude ou ne sais pas utiliser.
    Je vais modifier mon code.
    Merci pour vos contributions.

    @riaolle : je passe par une boucle: obligé sinon je ne peux pas scanner toute le feuilles...

  5. #5
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour,

    Pour déterminer l'existence d'une feuille, pas besoin de boucle.
    On peut tenter d'instance une variable contenant cette feuille et utiliser la gestion d'erreur.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function WorkSheet_Exist_1(ByVal NomFeuille As String) As Boolean
        Dim sh As Worksheet
            On Error Resume Next
            Set sh = ThisWorkbook.Sheets(NomFeuille)
            WorkSheet_Exist = Not sh Is Nothing
        Set sh = Nothing
    End Function
    On peut même en imaginer une moins lourde en prenant l'adresse de la cellule A1 de cette feuille (variable String contre Objet WorkSheet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function WorkSheet_Exist_2(ByVal NomFeuille As String) As Boolean
        Dim s$
            On Error Resume Next
            s = ThisWorkbook.Sheets(NomFeuille).Cells(1).Address
            WorkSheet_Exist_2 = s <> ""
    End Function

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut
    Bonjour antonysansh.

    Merci pour ces nouvelles perspectives même si l'on m'a appris et si j'ai cru comprendre qu'il fallait plutôt utiliser les erreurs avec parcimonie.
    En fait, j'utilise déjà dans mon code ce que tu prodigues, notamment pour l'ouverture d'un fichier qui n'existerait pas auquel cas je génère une erreur que j'exploite pas la suite.

    On est quand même bien d'accord que je ne peux pas utiliser de while wend/ do loop/until/while pour traduire l'algorithme (c'est juste pour ma culture d'homme du monde et obliger mon cerveau à traduire un algorithme avec des syntaxes de code différentes).

    Bonne après-midi à tous.

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    on peut même utiliser le B-A-BA à savoir la simple fonction ESTREF de formule de calculs d'Excel
    pour vérifier si un classeur et / ou une feuille de calculs existe ou pas, voir donc cette discussion !
    Sinon un autre exemple ici
    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Stockholm, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    @riaolle ravis de voir que le on error a disparu!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quelle type d'image utiliser?
    Par kalash_jako dans le forum Autres langages pour le Web
    Réponses: 6
    Dernier message: 23/04/2006, 09h53
  2. [GLScene]objet animé:Quelle type choisir?
    Par pointer dans le forum OpenGL
    Réponses: 1
    Dernier message: 31/03/2006, 12h18
  3. Pourquoi 3 types de boucles ?
    Par sami_c dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 15/02/2006, 12h57
  4. Vue et transaction : quelle type de table ?
    Par titoff002 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 08/09/2005, 17h12
  5. Réponses: 3
    Dernier message: 01/08/2005, 12h15

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