Test affichage onglet

Je remplace quoi précisément par ce code ?

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
    With Worksheets("Calcul").Range("P33")
        If n = 1 Then .Value = v Else .Value = CVErr(xlErrNA)
    End With
End Sub

La macro bug violemment ! Je l'ai vu buguer en étant dans l'onglet Calcul, et en fait la cellule P33 passe de la valeur à NA, et de NA à la valeur dans une boucle infinie et à grande vitesse !


Peut-être faut-il utiliser Workbook_SheetChange plutôt que Workbook_SheetCalculate ?

Ça n'a pas l'air de boguer, si ça bogue, ça s'arrête... elle se déclenche à chaque recalcul de feuille...

Je n'aime pas en principe utiliser Calculate parce qu'en effet on ne maîtrise pas l'exécution...

Mais le problème était qu'on n'a pas d'appui pour utiliser un évènement Change, les variations de résultats de formules ne le déclenchent pas, il faudrait donc avoir le fait générateur qui constitue le changement provoquant ces variations de résultats ?

Sinon, tu as dit que la la feuille était masquée, donc jamais visible ! Dans ce cas, comment et à quels moments est utilisée la valeur de la cellule P33 ?

Autre élément à voir : comment interviennent les masquages-démasquages des 4 feuilles source... ?

Désolé de ma réponse si tardive, j'ai repoussé le problème en avançant sur d'autres points, mais me revoilà !

J'ai eu cette erreur par un moment : erreur d'éxecution '-2147417848 (80010108)'

J'ai eu quelques fois cette partie surligné en jaune également :

        If n = 1 Then .Value = v Else .Value = CVErr(xlErrNA)

La cellule P33 de l'onglet Calcul déclenche d'autres calculs dans ce même onglet, les résultats de ces calculs sont à nouveau rapatriés (pour être utilisés dans d'autres calculs encore...) dans les onglets qui s'affichent et se masquent.

Les masquages/démasquages des 4 feuilles sont réalisés grâce à un userform. L'utilisateur choisi l'onglet qui lui convient, et les 3 autres restent masqués. Dans chacun des 4 onglets il peut faire appel à cet userform qui peut l'emmener à nouveau dans l'un des 3 autres.

Info supplémentaire : Ca ne marche pas avec l'onglet Calcul affiché ou masqué, dans la pratique, je le souhaite masqué.

Le problème est que continuer à proposer des solutions sans une vue de la configuration dans laquelle tu opères est une intervention reposant principalement sur des éléments aléatoires ! Si ça marche très bien, on laisse les questions de côté, sinon savoir pourquoi relève de la divination !

J'ai eu cette erreur par un moment : erreur d'éxecution '-2147417848 (80010108)'

Ça, c'est une erreur inattendue (pour Excel)... un composant ActiveX ou autre objet OLE ne supporte pas une manipulation ou le contexte dans lequel elle s'opère. Cela se recherche dans le fichier, je n'ai aucune idée de l'objet susceptible d'être en cause, aucun n'a été évoqué jusqu'ici...

If n = 1 Then .Value = v Else .Value = CVErr(xlErrNA)

se surligne en jaune. Il faut indiquer le numéro d'erreur, ainsi que les valeurs de n et de v au moment où survient l'erreur, sans quoi on n'a pas l'ombre du premier indice de la raison de la chose !

Utiliser Calculate ne convient apparemment pas dans ton classeur, donc si les erreurs se produisent dans une procédure liée à cet évènement, rien de bien grave puisqu'on savait déjà qu'il fallait chercher à procéder autrement...

On découvre aussi , que de nombreux calculs s'opèrent à partir de la cellule qu'on modifie ! il est peut -être temps d'en savoir plus à ce sujet !

Et aussi que le masquage-démasquage se fait à partir de Userform !

C'est de toute évidence à ce niveau qu'une mise à jour de P33 doit être opérée...

On va donc attendre d'avoir une idée exacte de la mécanique à l'oeuvre... sinon cela revient à tenter de réparer un moteur sans savoir de quoi il est composé et comment il est construit...

Allez, je balance le code de l'userform Si ça peut aider

Private Const SC_CLOSE = &HF060&                                                        'Désactive totalement la croix rouge
Private Const MF_BYCOMMAND = &H0&                                                       'Désactive totalement la croix rouge

Private Declare Function GetSystemMenu Lib "user32" _
        (ByVal hwnd As Long, ByVal bRevert As Long) As Long                             'Désactive totalement la croix rouge

Private Declare Function RemoveMenu Lib "user32" _
        (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long    'Désactive totalement la croix rouge

Private Declare Function FindWindowA Lib "user32" _
  (ByVal lpClassName As String, ByVal lpWindowName As String) As Long                   'Désactive totalement la croix rouge

Private Sub UserForm_Initialize()
Dim hSysMenu As Long                                                        'Désactive totalement la croix rouge
Dim MeHwnd As Long                                                          'Désactive totalement la croix rouge
    MeHwnd = FindWindowA(vbNullString, Me.Caption)                          'Désactive totalement la croix rouge
    If MeHwnd > 0 Then                                                      'Désactive totalement la croix rouge
        hSysMenu = GetSystemMenu(MeHwnd, False)                             'Désactive totalement la croix rouge
        RemoveMenu hSysMenu, SC_CLOSE, MF_BYCOMMAND                         'Désactive totalement la croix rouge
    Else
        MsgBox "Handle de " & Me.Caption & " Introuvable", vbCritical       'Désactive totalement la croix rouge
    End If
    Me.Height = 205
    Me.Width = 620

End Sub

Private Sub CommandButton1_Click()

    Application.ScreenUpdating = False 'Supprime la mise à jour de l'affichage entre chaque opération, et diminue considérablement le temps de la macro

    Sheets("Valorisation").Range("E3") = ActiveSheet.Range("E3")
    Sheets("Valorisation").Range("I3") = ActiveSheet.Range("I3")
    Sheets("Valorisation").Range("E5") = ActiveSheet.Range("E5")
    Sheets("Valorisation").Range("E6") = ActiveSheet.Range("E6")
    Sheets("Valorisation").Range("E10") = ActiveSheet.Range("E10")

    ActiveWorkbook.Unprotect Password:="test" 'Déprotége le classeur pour afficher/masquer les feuilles

    Sheets("Valorisation").Visible = True
    Sheets("Valorisation CSF-CV").Visible = False
    Sheets("Valorisation CSFCVMC-CVEFFAM").Visible = False
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Visible = False
    Sheets("Transport").Visible = False
    Sheets("Transport CSF-CV").Visible = False
    Sheets("Transport CSFCVMC-CVEFFAM").Visible = False
    Sheets("Transport CSF-CVMC-CVEFFAM").Visible = False
    Sheets("Valorisation").Select
    Range("E12").Select
    Selection.Value = "Identique"
    Range("E13").Select

    ActiveWorkbook.Protect Password:="test" 'Protége le classeur pour afficher/masquer les feuilles

    Unload Me

End Sub

Private Sub CommandButton2_Click()

    Application.ScreenUpdating = False 'Supprime la mise à jour de l'affichage entre chaque opération, et diminue considérablement le temps de la macro

    Sheets("Valorisation CSF-CV").Range("E3") = ActiveSheet.Range("E3")
    Sheets("Valorisation CSF-CV").Range("I3") = ActiveSheet.Range("I3")
    Sheets("Valorisation CSF-CV").Range("E5") = ActiveSheet.Range("E5")
    Sheets("Valorisation CSF-CV").Range("E6") = ActiveSheet.Range("E6")
    Sheets("Valorisation CSF-CV").Range("E10") = ActiveSheet.Range("E10")

    ActiveWorkbook.Unprotect Password:="test" 'Déprotége le classeur pour afficher/masquer les feuilles

    Sheets("Valorisation").Visible = False
    Sheets("Valorisation CSF-CV").Visible = True
    Sheets("Valorisation CSFCVMC-CVEFFAM").Visible = False
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Visible = False
    Sheets("Transport").Visible = False
    Sheets("Transport CSF-CV").Visible = False
    Sheets("Transport CSFCVMC-CVEFFAM").Visible = False
    Sheets("Transport CSF-CVMC-CVEFFAM").Visible = False
    Sheets("Valorisation CSF-CV").Select
    Range("E12").Select
    Selection.Value = "CSF-CV"
    Range("E13").Select

    ActiveWorkbook.Protect Password:="test" 'Protége le classeur pour afficher/masquer les feuilles

    Unload Me

End Sub

Private Sub CommandButton3_Click()

    Application.ScreenUpdating = False 'Supprime la mise à jour de l'affichage entre chaque opération, et diminue considérablement le temps de la macro

    Sheets("Valorisation CSFCVMC-CVEFFAM").Range("E3") = ActiveSheet.Range("E3")
    Sheets("Valorisation CSFCVMC-CVEFFAM").Range("I3") = ActiveSheet.Range("I3")
    Sheets("Valorisation CSFCVMC-CVEFFAM").Range("E5") = ActiveSheet.Range("E5")
    Sheets("Valorisation CSFCVMC-CVEFFAM").Range("E6") = ActiveSheet.Range("E6")
    Sheets("Valorisation CSFCVMC-CVEFFAM").Range("E10") = ActiveSheet.Range("E10")

    ActiveWorkbook.Unprotect Password:="test" 'Déprotége le classeur pour afficher/masquer les feuilles

    Sheets("Valorisation").Visible = False
    Sheets("Valorisation CSF-CV").Visible = False
    Sheets("Valorisation CSFCVMC-CVEFFAM").Visible = True
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Visible = False
    Sheets("Transport").Visible = False
    Sheets("Transport CSF-CV").Visible = False
    Sheets("Transport CSFCVMC-CVEFFAM").Visible = False
    Sheets("Transport CSF-CVMC-CVEFFAM").Visible = False
    Sheets("Valorisation CSFCVMC-CVEFFAM").Select
    Range("E12").Select
    Selection.Value = "CSFCVMC-CVEFFAM"
    Range("E13").Select

    ActiveWorkbook.Protect Password:="test" 'Protége le classeur pour afficher/masquer les feuilles

    Unload Me

End Sub

Private Sub CommandButton4_Click()

    Application.ScreenUpdating = False 'Supprime la mise à jour de l'affichage entre chaque opération, et diminue considérablement le temps de la macro

    Sheets("Valorisation CSF-CVMC-CVEFFAM").Range("E3") = ActiveSheet.Range("E3")
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Range("I3") = ActiveSheet.Range("I3")
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Range("E5") = ActiveSheet.Range("E5")
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Range("E6") = ActiveSheet.Range("E6")
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Range("E10") = ActiveSheet.Range("E10")

    ActiveWorkbook.Unprotect Password:="test" 'Déprotége le classeur pour afficher/masquer les feuilles

    Sheets("Valorisation").Visible = False
    Sheets("Valorisation CSF-CV").Visible = False
    Sheets("Valorisation CSFCVMC-CVEFFAM").Visible = False
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Visible = True
    Sheets("Transport").Visible = False
    Sheets("Transport CSF-CV").Visible = False
    Sheets("Transport CSFCVMC-CVEFFAM").Visible = False
    Sheets("Transport CSF-CVMC-CVEFFAM").Visible = False
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Select
    Range("E12").Select
    Selection.Value = "CSF-CVMC-CVEFFAM"
    Range("E13").Select

    ActiveWorkbook.Protect Password:="test" 'Protége le classeur pour afficher/masquer les feuilles

    Unload Me

End Sub

Question bonus :

Hier j'ai essayé mon fichier sur mon ordi personnel (Windows 10 et Office 2017, j'ai le 7 au travail avec Office 2010), et c'est loin d'être une bouse. Et bien, le fichier était très lent, le code :

    Application.ScreenUpdating = False

Ne remplissait pas son travail. De plus l'userform n'avait pas tout à fait les mêmes dimensions, il était très légèrement tronqué en bas et à droite.

Bonjour,

Je croyais avoir répondu ! Désolé donc pour le retard ! Je n'ai plus le détail en tête mais il était clair que tu nous réservais d'autres surprises (utilisation d'API, etc.)

Il ressort toutefois de ton code que tu as un bouton pour l'affichage de chacune des 4 feuilles ! Il appartient donc de procéder à la mise à jour de la cellule à partir de chacun de ces boutons ! Pas de difficultés particulières et éliminer toute autre intervention.

Cordialement.

Bonjour,

Je réponds un peu tardivement également, je rentre de vacances.

Effectivement, très bonne idée qui fonctionne très bien et qui simplifie nettement le problème !

Encore merci MFerrand

Bonne continuation !

Rechercher des sujets similaires à "test affichage onglet"