Test affichage onglet

Bonjour,

Je possède cinq onglets dans un classeur. Sur les quatre premiers, un seul est affiché. Dans le cinquième, je souhaite rapatrier la cellule E9 de l'onglet (parmi les quatre premiers) qui est affiché. Je me place donc en P33 de mon cinquième onglet où j'écris :

=INDIRECT(P32&"!E9")

Je souhaite donc trouver une formule en P32, toujours de ce cinquième onglet, qui me permet d'inscrire le nom parmi les quatre premiers onglets de l'onglet affiché.

Je vous remercie d'avance.

Cordialement.

Bonjour,

Une suggestion :

Private Sub Worksheet_Activate()
    Dim ws As Worksheet, n%, v
    For Each ws In Worksheets
        Select Case ws.Name
            Case Me.Name
            Case Else
                If ws.Visible = xlSheetVisible Then
                    v = ws.Range("E9"): n = n + 1
                End If
        End Select
    Next ws
    If n = 1 Then Me.Range("P33") = v Else Me.Range("P33") = CVErr(xlErrNA)
End Sub

Procédure à placer dans le module de la feuille 5. Elle mettra P33 à jour à l'activation de la feuille...

Cordialement.

Bonjour MFerrand,

Est-il possible de réaliser cette procédure sans passer par du VBA ?

Si non, comment adapter votre code VBA à mon classeur sachant que, avant les quatre onglets en question, il y a 2 onglets qui précédent, après chacun des quatre onglets, il y a un onglet, (on en est donc à 10 onglets), puis à nouveau 5 onglets, avant de terminer par le "cinquième" onglet dont je parlais ?

Dans ce cas, il faut faire :

...
        Select Case ws.Name
            Case "Feuil1", "Feuil2", "Feuil3", "Feuil4" 'à remplacer par les noms des 4 onglets...
                If ws.Visible = xlSheetVisible Then
                    v = ws.Range("E9"): n = n + 1
                End If
        End Select
...

Je ne connais pas de fonction permettant de savoir si un onglet est visible ou non...

Cordialement.

C'est merveilleux, ça fonctionne parfaitement !

Merci beaucoup MFerrand


Il me vient une autre question. La macro se lance à quel moment ? Quand je me rends sur l'onglet en question ?

Oui ! Lors de l'activation... C'est à priori le meilleur moment, car pour voir la valeur tu dois aller sur l'onglet ! Et inversement quand tu es sur l'onglet, tu ne fais en principe rien pour modifier la valeur...

Cordialement.

Le hic, c'est que la cellule de rapatriement dans le cinquième onglet, est un paramètre dans un tableau de l'onglet. Les données de ce tableau sont ensuite utilisées dans les plusieurs autres onglets dont les quatre onglets qui s'affichent et se masquent automatiquement (selon d'autres paramètres encore, mais ce n'est pas la question).

Dans le fonctionnement, le "cinquième" onglet sera un onglet masqué et on ne pourra pas y accéder avec la protection de classeur.

Cependant, d'après mes tests, il n'y a pas besoin d'aller sur ce "cinquième" onglet pour que le rapatriement se fasse, la MAJ du tableau de données du cinquième onglet, et donc la MAJ des données dans les autres onglets. Néanmoins, je n'ai pas testé avec ce "cinquième" onglet masqué.

Mon test contredis votre dernier message... Je veux être sûr de mon coup. Je veux bien plus d'informations !

Si l'onglet est masqué et le reste, il ne sera jamais activé... ! Il faut donc basculer sur un évènement qui, lui, se produira.

Peut-être Change ciblé sur la cellule E9 des 4 onglets en cause, à conditions que le changement de valeur ne soit pas provoqué par une formule.

Le changement de la cellule E9 se fait par une formule justement, qui dépend de plusieurs paramètres faisant également appel à d'autres onglets. Oai ça fait usine à gaz dit comme ça

Comment faire ?

Bon ! On va alors basculer sur Calculate...

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    Dim n%, v, ws As Worksheet, nf$
    nf = "Feuil1 Feuil2 Feuil3 Feuil4"
    Select Case Sh.Name
        Case "Feuil1", "Feuil2", "Feuil3", "Feuil4" 'à remplacer par les noms des 4 onglets...
            For Each ws In Worksheets
                If Instr(nf, ws.Name) > 0 Then
                    If ws.Visible = xlSheetVisible Then
                        v = ws.Range("E9"): n = n + 1
                    End If
                End If
            Next ws
    End Select
    If n = 1 Then Me.Range("P33") = v Else Me.Range("P33") = CVErr(xlErrNA)
End Sub

Cette version est à placer dans le module ThisWorkbook.

Dans la troisième ligne du code, le nom des feuilles n'est séparé en rien (comme dans la cinquième ligne par exemple) ?

Oui ! On fait un méga nom avec les 4 et on vérifie si le nom testé s'y trouve inclus... !

A quel endroit dans ce code je renseigne le nom de l'onglet (le "cinquième" onglet) ?

Oh ! Je n'ai pas corrigé la dernière ligne !

    If n = 1 Then Worksheets("Feuil5").Range("P33") = v Else Me.Range("P33") = CVErr(xlErrNA)

C'est justement ce qui manquait ! Tu remplaces Feuil5 par le nom de cet onglet.

Quand je lance la macro, il me surligne en jaune cette ligne :

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

Il me sélectionne ce morceau de ligne :

.Range("P33") =

Et m'indique dans une boîte de message :

"Erreur de compilation:

Membre de méthode ou de données introuvable"

Es-tu sûr que :

1) Devant .Range("P33") on trouve bien le nom de la feuille [Worksheets(".........")] et qu'il est bon ?

2) Que la procédure est dans ThisWorkbook ?

1) C'est la seconde partie avec le "Me" qui est sélectionnée.

2) Oui.

Dans ThisWorkbook, Me désigne le classeur, pas une feuille !

Relis mon post d'hier : j'ai bien mentionné : Worksheets("Feuil5") et indiqué qu'il fallait remplacer Feuil5 par le NOM de la feuille !

Comment veux-tu que VBA trouve ce que tu ne lui indiques pas !

    If n = 1 Then Worksheets("Calcul").Range("P33") = v Else Me.Range("P33") = CVErr(xlErrNA)

Oui j'ai bien fait comme tu m'as dit, tout est dans ThisWorkbook.

Il me surligne en jaune la première ligne, et me sélectionne le

.Range("P33") =

qui se trouve après

Else Me

Il faut le remplacer aussi ! Ecris donc ainsi :

    With Worksheets("Calcul").Range("P33")
        If n = 1 Then .Value = v Else .Value = CVErr(xlErrNA)
    End With
Rechercher des sujets similaires à "test affichage onglet"