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 SubLa 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 !
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
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 SubQuestion 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 = FalseNe 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 !