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 :

[E-02] Recherche de redondance dans le nom des feuilles d'un classeur


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
    Novembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 57
    Par défaut [E-02] Recherche de redondance dans le nom des feuilles d'un classeur
    Bonjour à tous.

    Je suis une grande débutante en VBA et je suis en train de créer mon premier programme. Mes excuses par avance pour les bêtises que je pourrais écrire.

    J'ai écrit une macro qui crée une nouvelle feuille avec une mise en forme spécifique. Pour nommer la feuille, j'ai créé une InputBox permettant à l'utilisateur de saisir le nom de la feuille (variable "activité").
    Les problèmes arrivent quand je veux éviter que l'utilisateur ne saisissent 2 fois le même nom :
    Je souhaite regarder dans les noms de feuilles existants. Si le nom n'existe pas encore, alors on peut utiliser le nom saisi pour renommer la feuille. Si le nom saisi existe déjà, je le dis à l'utilisateur et je lui demande de saisir un nouveau nom (pour ça j'ai créé une nouvelle variable "ActivitéCorrection") qui me permettra de renommer la feuille, bien sûr en vérifiant que l'utilisateur n'a pas déjà saisi ce nom.

    Je ne trouve pas la syntaxe pour dire à VBA de regarder dans les différents noms de feuille déjà existants. J'ai essayé plein de nom sans succès. Ici, vous avez la version avec Sheets.Name que VBA ne comprend pas. J'ai un résultat quand je lui demande de regarder directement les activités déjà saisies, mais ça plante si je relance ma macro une 2eme fois, et ça ne prend pas en compte les noms éventuellement saisis grâce à la variable ActivitéCorrection.

    Voici l'extrait du code concerné :

    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
    32
    33
    34
    35
    Private Sub AjoutActivité()
    
    'Insère une feuille de calcul après la dernière feuille du classeur
    Dim NouvelleFeuille As Worksheet
    Set NouvelleFeuille = ThisWorkbook.Worksheets.Add(before:=Feuil1)
    
    'code pour la mise en forme de la feuille => OK
    
    'Définition de la variable activité comme 1 chaine de caractères
        Dim Activité As String
        Dim ActivitéCorrection As String
    
    'Création d'une boîte de saisie pour la nouvelle activité
        Activité = Application.InputBox(Activité, "Saisissez le nom de l'activité")
    
    'Test de redondances de noms d'activité
        If Activité = Sheets.Name Then
        'Affichage du msg d'erreur
        MsgBox "Vous avez déjà utilisé " + Activité + " pour nommer une activité. Veuillez saisir nom différent."
        'Nouvelle saisie de l'activité
        ActivitéCorrection = Application.InputBox(Activité, "Saisissez le nom de l'activité")
        'Renommer la feuille avec nom de l'activité initiale
        With NouvelleFeuille
            .Name = ActivitéCorrection
        End With
    
        Else
        'Renommer la feuille avec nom de l'activité initiale
        With NouvelleFeuille
            .Name = Activité
        End With
     
        End If
    
    End Sub
    Ca fait un moment que je tourne et je ne vois pas trop comment m'en sortir.
    Merci d'avance pour votre aide.

    Karatégirl77

  2. #2
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bonjour et bienveenue ici,

    pour tester le nom de l'inputboxc par rapports aux feuilles existantes, tu peux faire comme ceci (entre autres).

    Dans ton code pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if check_feuille_exist(activite) then
          'Affichage du msg d'erreur
        MsgBox "Vous avez déjà utilisé " + Activité + " pour nommer une activité. Veuillez saisir nom différent."
      else
       '....
    endif
    Et tu mets la fonction suivante après tout ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private function check_feuille_exist(activite as string) as boolean
    dim i as integer
    for i = 1 to sheets.count
    if activite = sheets(i).name then
       check_feuille_exist = true
       exit for
    end if
    next i
    check_feuille_exist = false
    end function

  3. #3
    Membre éclairé Avatar de zandru
    Homme Profil pro
    Ingénieur conception mécanique
    Inscrit en
    Mars 2008
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 507
    Par défaut
    Bonjour,

    Ce code devrait pouvoir t'aider (à adapter au tien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Dim feuille As Worksheet
     
        For Each feuille In Worksheets
            If Activité = feuille.Name Then
                MsgBox "Vous avez déjà utilisé " + Activité + " pour nommer une activité. Veuillez saisir nom différent."
                Exit For
            End If
        Next feuille
    Il te permet de parcourir tes feuilles et de comparer leur nom à ta variable "activité".
    il sort du for dès qu'il a trouver une feuille du même nom.

    EDIT: la fonction de Godestla est plus pratique

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 57
    Par défaut
    Merci à tous les 2 pour vos réponses rapides.

    J'ai testé les 2 propositions et j'arrive à faire fonctionner celle de Zandru (et en plus je la comprend bien!). La première partie de mon problème est donc résolue.

    Par contre, mon programme continue de planter si mon utilisateur saisit 2 fois la même activité. Est-ce que je peux m'en sortir sans créer une seconde variable, comme je le fais actuellement? Il faudrait que lorsque l'erreur est constatée , je retourne automatiquement en arrière dans mon programme, au moment où je demande à l'utilisateur de saisir un nouveau nom.
    Je vais continuer mon exploration, mais si vous avez des suggestions, je suis preneuse.

  5. #5
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Re,
    dans ce cas il vaut mieux utiliser ma solutiuon car elle te ramène le status (existe ou pas).

    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
        Dim existe as boolean
        Dim annule as boolean
       
        existe = False
        Annule = false 
        Activité = Application.InputBox(Activité, "Saisissez le nom de l'activité")
       
    do while annule = false and existe = false
         if activite = "" then
           annule = true
          else
           existe = check_feuille_exist(activite)
           if existe then
             Activité = Application.InputBox(Activité, "Saisissez le nom de l'activité")
             else
    '... ici le traitement a faire si la feuille n'existe pas.....
          endif
        endif
    loop
    La boucle s'arrête lorque l'utilisateur fait cancel ou que le nom entré n'existe pas.

  6. #6
    Membre éclairé Avatar de zandru
    Homme Profil pro
    Ingénieur conception mécanique
    Inscrit en
    Mars 2008
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 507
    Par défaut
    Bonjour,

    essai en remplaçant le "exit for" de ma solution par une variable, et de boucler.

    quelque chose comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        existe = 0
        do 
            Activité = Application.InputBox(Activité, "Saisissez le nom de l'activité")
            Dim feuille As Worksheet
            For Each feuille In Worksheets
                existe = 0
                If Activité = feuille.Name Then
                    MsgBox "Vous avez déjà utilisé " + Activité + " pour nommer une activité. Veuillez saisir nom différent."
                    existe = 1
                    exit for
                End If
            Next feuille
        loop While (existe = 0)

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonsoir Tous,

    Il serait peut-être mieux de ne créer et nommer la feuille qu'après le test, non ?
    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
    Sub AjoutActivité()
      Rem ajout 2 variables
      Dim Fait As Boolean, Sh As Worksheet
     
      Dim NouvelleFeuille As Worksheet
      Dim Activité As String
     
      Do
        Fait = False
        Activité = InputBox("Saisissez le nom de l'activité", "")
        If Activité = "" Then Exit Sub
    'Tester la redondances de noms d'activité
         For Each Sh In Worksheets
             If Activité = Sh.Name Then
             'Affichage du msg d'erreur
                MsgBox "Vous avez déjà utilisé ce nom pour nommer une activité." & _
                   Chr(10) & "Veuillez saisir nom différent de " & Activité & ".", , "Attention !"
                Fait = True
             End If
         Next
      Loop While Fait = True
    'Créer et nommer la nouvelle activité
      Set NouvelleFeuille = ThisWorkbook.Worksheets.Add(before:=Feuil1)
      ActiveSheet.Name = Activité
    End Sub

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/08/2015, 00h06
  2. [XL-2007] ajustement automatique des colonnes dans l'ensemble des feuilles d'un classeur
    Par JYPIQ62 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/01/2012, 20h44
  3. [XL-2003] Recherché un terme dans le nom d'un fichier
    Par psychosiffleur dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/06/2009, 16h41
  4. liste déroulante avec les noms des feuilles d'un classeur fermé
    Par winclass dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/12/2008, 22h39
  5. Liste des noms des feuilles d'un classeur
    Par marc56 dans le forum Excel
    Réponses: 10
    Dernier message: 22/09/2007, 15h49

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