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 :

Création onglet avec condition en VBA [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    SANS
    Inscrit en
    Juillet 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : SANS
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 69
    Par défaut Création onglet avec condition en VBA
    Bonjour
    Pour créer des onglets à partir de deux modèles (QUANTI ou QUALI)

    J'ai mis ce code pour l'onglet rapport

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    Private Sub Worksheet_Change(ByVal Target As Range)
        Trouv = False
        'Test si la cellule est bien en colonne P (colonne 16 )
        If Target.Column = 16 Then
            'Test si la cellule est bien avant la ligne (pas de génération de feuille dont le nom est : " ")
            If Target.Row < 283 Then
                Onglet = Cells(Target.Row, 1).Value
                'Test si la cellule contient "quanti" (Lcase met obligatoirement en minuscule toute chaine de caractère)
                If LCase(Target.Value) = "quanti" Then
                    'on test le nom des feuilles et si on la trouve alors Trouv = True
                    For Each Sheet In Sheets
                        If Sheet.Name = Onglet Then
                            Trouv = True
                            Exit For
                        End If
                    Next
                    'Si on l'a trouvé on l'affiche sinon il faut la créer
                    If Trouv = True Then
                        Sheets(Onglet).Visible = True
                    Else
     
                        'on copie la feuille Model en dernier
                        Sheets("MODELCOMPQUANTI").Visible = True
                        Sheets("MODELCOMPQUANTI").Copy After:=Sheets(Sheets.Count)
                        Sheets("MODELCOMPQUANTI").Visible = False
                        'on renomme cette derniere
                        Sheets(Sheets.Count).Name = Onglet
                        Sheets(Sheets.Count).Visible = True
                    End If
                 Else
                    For Each Sheet In Sheets
                        If Sheet.Name = Onglet Then
                            Trouv = True
                            Exit For
                        End If
                    Next
                    'Si on l'a trouvé on l'affiche sinon il faut la créer
                    If Trouv = True Then
                     Sheets(Sheets.Count).Visible = True
                    End If
                 End If
            End If
        End If
     Trouv = False
        'Test si la cellule est bien en colonne Q (colonne 17 )
        If Target.Column = 17 Then
            'Test si la cellule est bien avant la ligne (pas de génération de feuille dont le nom est : " ")
            If Target.Row < 283 Then
     
                Onglet = Cells(Target.Row, 1).Value
                'Test si la cellule contient "quali" (Lcase met obligatoirement en minuscule toute chaine de caractère)
                If LCase(Target.Value) = "quali" Then
                    'on test le nom des feuilles et si on la trouve alors Trouv = True
                    For Each Sheet In Sheets
                        If Sheet.Name = Onglet Then
                            Trouv = True
                            Exit For
                        End If
                    Next
                    'Si on l'a trouvé on l'affiche sinon il faut la créer
                    If Trouv = True Then
                        Sheets(Onglet).Visible = True
                    Else
     
                        'on copie la feuille Model en dernier
                        Sheets("MODELCOMPQUALI").Visible = True
                        Sheets("MODELCOMPQUALI").Copy After:=Sheets(Sheets.Count)
                        Sheets("MODELCOMPQUALI").Visible = False
                        'on renomme cette derniere
                        Sheets(Sheets.Count).Name = Onglet
                        Sheets(Sheets.Count).Visible = True
                    End If
                 Else
                    For Each Sheet In Sheets
                        If Sheet.Name = Onglet Then
                            Trouv = True
                            Exit For
                        End If
                    Next
                    'Si on l'a trouvé on l'affiche sinon il faut la créer
                    If Trouv = True Then
                     Sheets(Sheets.Count).Visible = True
                    End If
                 End If
            End If
        End If
    End Sub
    Il fonctionne si au départ de l'utilisation les onglets MODELCOMPA QUANTI ET MODELCOMPAQUALI ne sont pas cachés , mais je souhaiterai pouvoir les cacher dès le début mais dans ce cas les onglets créés ne sont pas bons . Création du dernier onglet et non pas des onglets qui intéressement .
    Je ne trouve pas l'erreur, mais je ne suis pas très douée...
    Si quelqu'un peut m'aider
    Je vous joins en pj mon tableur
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Le post est illisible, merci d'utiliser les balises CODE :
    http://club.developpez.com/aidenouve...es/Balises.gif
    https://www.developpez.net/forums/d3...-balises-code/

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour pour tester si un sheets existe tu n'est pas forcé de boucler sur tout les sheets et vérifier leur nom
    une simple petite formule évaluée avec evaluate
    ici si le sheets toto n'existe pas ca te donnera faux sinon vrai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    MsgBox Not IsError(Evaluate("='" & "toto" & "'!A1"))
    End Sub
    et surtout combien même il serait caché ,si il existe se sera "vrai" !!
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    une simple petite formule évaluée avec evaluate
    Bonjour,

    La simplicité ne se mesure pas au nombre de lignes de code.
    Et si la cellule A1 de la feuille contient une erreur ?
    Formule simple, oui mais erronée.

    Sinon : entrer en debug pas à pas pour analyser ce qui passe.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re

    bonsoir Arkham

    que cela te tienne
    on evalue plus une valeur mais un object range 2d msgbox a l'appui si le premier ne renvoie pas d'erreur le 2d renvoie bien un object range

    que pense tu de celle ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test2()
    MsgBox Not IsError(Evaluate("='" & "toto" & "'!A1:z100"))
    MsgBox TypeName(Evaluate("'toto'!A1:z100"))
    End Sub
    JE viens de tester avec des #REF,#VALEUR,etc...

    l'évaluation renvoie une erreur ou un object range

    pour le coup effectivement plus de soucis avec les cellules avec des erreurs éventuelles

    dans une fonction ca donnerait ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function sheetsExiste(sname As String)
    sheetsExiste = Not IsError(Evaluate("='" & sname & "'!A1:z100"))
    End Function
    '
    '
    Sub test3()
    MsgBox sheetsExiste("titi")
    MsgBox sheetsExiste("toto")
    End Sub
    j'avais péché la première sur le net il y a longtemps
    pour le coup merci de m'avoir mis le doigt sur un point que je n'avais pas envisagé
    du coup je vais changer ca dans mes fichiers pour la mienne yes!!
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    et donc si j'ai bien compris les intention de la demande

    je remplace tout son code par ceci
    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
    Function sheetsExiste(sname As String)
        sheetsExiste = Not IsError(Evaluate("='" & sname & "'!A1:z100"))
    End Function
    '
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim onglet$
        'Test si la cellule est bien en colonne (16 ou 17 )
        Select Case Target.Column
        Case 16, 17
            If Target.Row < 283 Then
                onglet = Cells(Target.Row, 1).Value
                Select Case LCase(Target.Value)
                Case "quanti", "quali"
                    If sheetsExiste(onglet) Then
                        Sheets(onglet).Visible = True
                    Else
                        'on copie la feuille Model en dernier
                        Sheets("MODELCOMP" & UCase(Target.Value)).Visible = True
                        Sheets("MODELCOMP" & UCase(Target.Value)).Copy After:=Sheets(Sheets.Count)
                        Sheets("MODELCOMP" & UCase(Target.Value)).Visible = False
                        'on renomme cette derniere
                        Sheets(Sheets.Count).Name = onglet
                        Sheets(Sheets.Count).Visible = True
                    End If
                End Select
            Else
                If sheetsExiste(onglet) Then' la je pige pas trop ce else mais je n'ai pas tout le contexte
                    Sheets(Sheets.Count).Visible = True
                End If
            End If
     
        End Select
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    @Patrick,

    C'est effectivement une solution, mais l'idée de départ c'est de détecter la présence d'une feuille de calcul (Worksheet et pas d'un objet représentant une feuille quelconque).
    Donc sur ton idée et utilisable dans une feuille de calcul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function ExisteWorksheet(nomFeuille As String) As Boolean
      On Error Resume Next
      ExisteWorksheet = Worksheets(nomFeuille).Name = nomFeuille
      On Error GoTo 0
    End Function
    Un feuille de macro MS Excel 4 c'est une feuille dans la quelle on édite le code des macros Excel 4, c'était avant l'apparition du VBE, ça fonctionne toujours mais ces macros ne peuvent pas être signées numériquement. Il y a aussi les feuilles Graphiques qui ne sont pas des Worksheets mais des Charts

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour patrice
    Un feuille de macro MS Excel 4 c'est une feuille dans la quelle on édite le code des macros Excel 4, c'était avant l'apparition du VBE, ça fonctionne toujours mais ces macros ne peuvent pas être signées numériquement. Il y a aussi les feuilles Graphiques qui ne sont pas des Worksheets mais des Charts
    Cordialement,
    je suis curieux ????
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    l'idée générale est surtout d'éviter de recréer une roue qui est utilisée partout, et qui fonctionne parfaitement, avec le code de Patricem, plutôt que d'encore une fois faire un gloubi-boulga de code, qui "marche jusqu'à preuve du contraire"
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  10. #10
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonjour le forum,
    @ Jean-philippe André, dans votre signature, vous avez écrit:
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise
    Qu'entendez vous exactement par refactoriser ? Cela serais gentil d'éclairer ma lanterne.
    Cordialement

  11. #11
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

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

Discussions similaires

  1. Création tableau avec conditions date
    Par souris123 dans le forum Excel
    Réponses: 1
    Dernier message: 29/03/2015, 03h05
  2. [XL-2010] supprimer des onglets avec condition
    Par jkiii dans le forum Excel
    Réponses: 4
    Dernier message: 24/12/2013, 12h02
  3. Réponses: 1
    Dernier message: 29/10/2012, 15h23
  4. Pb vlookUp avec condition en VBA
    Par PJ_VBA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/08/2012, 20h12
  5. création variable avec condition
    Par nawal59 dans le forum SAS Base
    Réponses: 2
    Dernier message: 06/08/2008, 07h34

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