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 :

Vérifier la présence d'une feuille dans une collection


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut Vérifier la présence d'une feuille dans une collection
    Il me semble bien que Maxence Hubiche a donné la solution mais je la retrouve pas
    Il s'agit de savoir si une donnée appartient à un tableau (en une seule ligne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If "LaDonnée" ?????? LeTableau then
    Par avance, merci

  2. #2
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    C'est Join qui permet de remettre un tableau en un seul string avec séparateur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InStr(1, Join(LeTableau, "|"),LaDonnée) <> 0

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Merci Maxence. J'avais essayé join mais n'ai pas su l'utiliser. L'aide ne donne pas d'exemple très explicite. Il serait peut-être bien de le mettre dans la FAQ.

    J'ai une question subsidiaire : Existe-t-il la même chose pour une collection. Ou comment créer (pour l'utiliser avec Join) un tableau des noms de feuilles d'un classeur en une seule ligne de commande ?
    Ce serait pour remplacer tout ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim Lafeuille as worksheet
        for each lafeuille in Workbooks("Classeur1").worksheets
            if LaFeuille.Name = "Feuil4" then msgbox "C'est tout ce que je veux !"
        next
    ou encore ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim Obj as object, Lafeuille
    set Obj = Workbooks("classeur1").worksheets
        for each LaFeuille In Obj 
            if LaFeuille.name = "Feuil4" then msgbox "C'est tout ce que je veux !"
        Next
        set Obj = nothing
    Par avance merci
    (bien que là j'ai très peu d'espoir )

  4. #4
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    erf !

    Alors, là, par contre ...
    Join ne marchera pas, c'est sûr (il est fait pour tourner avec des tableaux et pas des collections)

    bon... je vais voir si je te trouve une solution à ce problème, mais je suis aussi dubitatif que toi :s

  5. #5
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    bon, ben...
    désolé, j'y arrive pas.

    je te propose une solution intermédiaire :
    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
    36
    37
     
     
    '// Enumération des types de retours possibles
    Public Enum mhReturn
        mhReturnValue
        mhReturnName
    End Enum
     
    '// Fonction renvoyant la chaine, comme pour Join, mais sur une collection
    Function JoinCollection(myCollection As Object, mySeparator As String, what As mhReturn) As String
     
        Dim objTemp     As Object       '// Objet temporaire pour parcourir la collection
        Dim strTemp     As String       '// Chaine temporaire pour la concaténation des valeurs
     
        '// Boucle sur chaque élément de la collectino
        For Each objTemp In myCollection
            '// examiner ce qui est attendu
            Select Case what
     
                '// demande de renvoyer le nom
                Case mhReturnName
                    strTemp = strTemp & mySeparator & objTemp.Name
     
                '// demande de renvoyer la valeur
                Case mhReturnValue
                    strTemp = strTemp & mySeparator & objTemp.Value
     
                '// autre demande ("")
                Case Else
                    strTemp = strTemp & mySeparator & ""
     
            End Select
        Next
     
        '//renvoyer à partir du 2° caractère
        JoinCollection = Mid(strTemp, 2)
    End Function

    Exemples d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Debug.Print JoinCollection(ThisWorkbook.Sheets, ",", mhReturnName)
    Debug.Print JoinCollection(ThisWorkbook.Sheets(1).range("A1:G19"), ",", mhReturnValue)
    désolé !



    ATTENTION !
    Je n'ai pas mis de gestion d'erreur !

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    un tableau des noms de feuilles d'un classeur en une seule ligne de commande
    Je te remercie pour le mal que tu t'es donné, il m'a bien fallu cinq minutes... Dans ce cas là je me résoudrai à tester les noms de feuilles.
    Mais j'avais deux autres propositions pour expliquer ce que je voulais obtenir... sur une ligne
    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
    Sub Lister()
    Dim LaFeuille As Worksheet, liste
    liste = ";"
    For Each LaFeuille In Workbooks("Classeur2").Sheets
        liste = liste & ";" & LaFeuille.Name
    Next
    If InStr(1, LCase(liste), ";feuil1;") <> 0 Then MsgBox "c'est ok !"
    End Sub
     
    Sub Compter()
    Dim LaFeuille As Worksheet, liste
    Dim Col1 As New Collection
    For Each LaFeuille In Workbooks("Classeur2").Sheets
        Col1.Add (LaFeuille.Name)
    Next
    liste = ";"
    For i = 1 To Col1.Count
        liste = liste & Col1(i) & ";"
    Next
    If InStr(LCase(liste), ";feuil1;") <> 0 Then MsgBox "C'est ok !"
    End Sub
    La discussion reste ouverte

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 147
    Points
    20 147
    Par défaut
    bonjour


    J'avais essayé join mais n'ai pas su l'utiliser. L'aide ne donne pas d'exemple très explicite. Il serait peut-être bien de le mettre dans la FAQ.
    http://silkyroad.developpez.com/VBA/...racteres/#LI-W



    S'il s'agit juste de vérifier qu'une feuille existe dans le classeur, sans boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test()
        MsgBox FeuilleExiste(Workbooks("NomClasseur.xls"), "Feuil1")
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'Adapté de Frederic Sigonneau
    Function FeuilleExiste(Wb As Workbook, Nom As String) As Boolean
      On Error Resume Next
      FeuilleExiste = Wb.Sheets(Nom).Name <> ""
      Err.Clear
    End Function
    ps
    la procédure ne vérifie pas si le nom du classeur spécifié est correct ...;o)



    bonne journée
    michel

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Bonjour Michel, et merci
    C'est maintenant que tu arrives ?
    Malheureusement, dans une procédure (plutôt qu'une fonction) et avec le "on error goto" qui suit, ça fait trois lignes.
    C'est effectivement la syntaxe que j'utilise.
    J'aurais dû préciser "sans gestion d'erreur"
    Je donne donc la totalité de ce que je veux remplacer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LaFeuille = "MaFeuilleAmoi"
    On Error Resume Next
        Workbooks("Classeur1").Sheets(LaFeuille).activate
        If Err = 9 Then Workbooks("Classeur1").Sheets.Add
        ActiveSheet.Name = LaFeuille
    On error goto 0
    Et ce que je cherche à obtenir est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If not exist Workbooks("Classeur1").Worksheets(LaFeuille) Then _
                 Workbooks("Classeur1").Sheets.Add
    ActiveSheet.Name = LaFeuille
    Je m'explique : Si on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Feuilles = ActiveWorkbook.sheets
    On a la collection des feuilles du classeur. A partir de cette collection, pourquoi ne peut-on pas tester directement, sur une ligne, sans boucle, la présence d'une feuille ? Ou plutôt, et à défaut de "pourquoi" : Ne pourrait-on pas tester... tcé tes rats...
    Mais là je crois que la question va rester sans réponse.
    Enfin, ça nous aura occupé
    bonne journée à toi aussi.

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

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. Réponses: 4
    Dernier message: 02/07/2008, 11h32
  3. écrire le résultat d'une macro dans une cellule d'une feuille à choisir
    Par ririrourou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/06/2008, 11h56
  4. Insérer une feuille dans une feuille
    Par PsychedeChed dans le forum Excel
    Réponses: 2
    Dernier message: 07/02/2008, 14h01
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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