Problème de code VBA qui fonctionne à moitié Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
N
Naeqh
Jeune membre
Jeune membre
Messages : 14
Inscrit le : 20 avril 2014
Version d'Excel : 2010

Message par Naeqh » 27 avril 2014, 21:01

Bonsoir,

J'ai actuellement un problème sur mon fichier excel et ses codes VBA associés. Selon moi tout est bon mais la commande que je souhaite réaliser "fonctionne à moitié" :s. Je m'explique. Sur mon fichier (http://cjoint.com/data3/3DBuXpPGRqd.htm), dans l'onglet "Projet" je peux sélectionner le type d'opération souhaité (exemple : hébergement, enseignement, etc). Chacun des types doit masquer tous les onglets sauf deux (correspondant à chaque fois au type d'opération choisit). Par exemple, si je choisis le type "Bureaux", deux onglets doivent se masquer sauf deux : "Choix Solutions 2" et "EFAE 2". Cependant, d'autres onglets ne se masquent pas.

Je pense que vous comprendrez mieux en utilisant l'outil. Il n'y a des codes VBA que dans l'onglet "Pojet" et le "Module 1".

En espérant que vous pourrez trouver une solution à mon problème.

Je reste à votre disposition

Cordialement.

Naeqh.


PS : Je vous copie/colle les codes VBA, peut être que vous y trouverez une erreur sans même ouvrir le fichier :

Code dans l'onglet "Projet"
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect(Target, [TypeOpération]) Is Nothing Then
Call Masque
End If
    
    If Target.Count > 1 Then End
    If Not Application.Intersect(Target, Range("C8,C10,C11,C13,C14,C16,C17,C19,D21,D22,D23,D24,D25")) Is Nothing Then
        If Not IsEmpty(Target) Then
            Application.EnableEvents = False
            Target.Value = UCase(Target.Value)
            Application.EnableEvents = True
        End If
    Else
    End If
    
End Sub
Code dans le "Module 1"
Sub Masque()
Call AfficheTout
    
    If [TypeOpération].Value = "Habitation / Hébergement" Then
           Sheets(Array(13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)).Visible = False
    End If
    
    If [TypeOpération].Value = "Bureaux" Then
            Sheets(Array(11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)).Visible = False
    End If
    
    If [TypeOpération].Value = "Etablissement d'accueil de la petite enfance" Then
            Sheets(Array(11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)).Visible = False
    End If
    
    If [TypeOpération].Value = "Enseignement" Then
            Sheets(Array(11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)).Visible = False
    End If
    
    If [TypeOpération].Value = "Bâtiment industriel" Then
            Sheets(Array(11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)).Visible = False
    End If
    
    If [TypeOpération].Value = "Equipement sportif" Then
            Sheets(Array(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30)).Visible = False
    End If
    
    If [TypeOpération].Value = "Etablissement de santé" Then
            Sheets(Array(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30)).Visible = False
    End If
    
    If [TypeOpération].Value = "Restauration collective" Then
            Sheets(Array(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 27, 28, 29, 30)).Visible = False
    End If
    
    If [TypeOpération].Value = "Salle de spectacle" Then
            Sheets(Array(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30)).Visible = False
    End If
    
    If [TypeOpération].Value = "Centre culturel" Then
            Sheets(Array(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28)).Visible = False
    End If
   
Sheets(1).Select

End Sub


Sub AfficheTout()
Dim i As Integer
Application.ScreenUpdating = False

For i = 2 To Sheets.Count
With Sheets(i)
.Unprotect Password:="142222"
.Visible = True
.Protect Password:="142222"
End With
Next i

End Sub
B
Benead
Membre fidèle
Membre fidèle
Messages : 478
Appréciations reçues : 2
Inscrit le : 15 octobre 2011
Version d'Excel : 2007 FR 32bits- 2013 FR 64bits

Message par Benead » 28 avril 2014, 00:18

Bonsoir,

Sauf erreur de ma part, tu as 30 feuilles dans ton classeur et tu ne masques que les 20 dernières sous condition :
Sheets(Array(11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)).Visible = False
Dans cette ligne tu ne masques pas les feuilles 2 à 10... Normal ?
Si tu ajoutes cette ligne avant de masquer et que tu crées un point d'arrêt sur la ligne d'après :
Sheets(Array(11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)).Select
Les feuilles qui vont être masquées seront sélectionnées, cela de donneras une idée des feuilles qui seront masquées.

Dans la construction de ton code, pourquoi affiches-tu toutes les feuilles avant de les masquer presque toutes ? Et pourquoi les déprotéger dans AfficheTout ? Pour accélérer l'exécution du code, il est toujours plus rapide de tester (si la feuille est masquée dans ton cas) avant d'exécuter une action de ce type.
A+
Benoît Marchand
[Benead]
N
Naeqh
Jeune membre
Jeune membre
Messages : 14
Inscrit le : 20 avril 2014
Version d'Excel : 2010

Message par Naeqh » 28 avril 2014, 08:26

Bonjour,

En ce qui concerne les feuilles 2 à 10, elles seront déjà masqués ou affichés mais n'entreront pas dans la manipulation souhaité.
C'est bien les feuilles 11 à 30 qui doivent être manipulées selon le choix du type d'opération.

Pour le reste, tous le classeur est de base protégé pour éviter les manipulations des utilisateurs futurs, avec seulement les cases à remplir non protégées. Je n'ai pas constitué tout le code VBA seul, quelqu'un m'a aidé et je ne sais pas vraiment comment te répondre ><.
Pour le fait de "déprotéger les feuilles" avant, je dois bien les déprotéger pour pouvoir les masquer/afficher non ?

J'espère t'avoir éclairer un peu plus :s

Amicalement.
B
Benead
Membre fidèle
Membre fidèle
Messages : 478
Appréciations reçues : 2
Inscrit le : 15 octobre 2011
Version d'Excel : 2007 FR 32bits- 2013 FR 64bits

Message par Benead » 28 avril 2014, 22:52

Bonsoir Naeqh,

Bon j'y vois un peu plus clair : il semblerait que tu aies deux problèmes dans ton code. Le premier est que tu affiches toutes les feuilles avant de masquer avec conditions les feuilles>10, donc si tu ne modifies pas la sub AfficheTout, les feuilles 2>10 s'afficheront toujours.

J'ai modifié la procéture AfficheTout de cette façon :
Sub AfficheTout()
Dim i As Integer
   Application.ScreenUpdating = False
   For i = 2 To ThisWorkbook.Sheets.Count
      With ThisWorkbook.Sheets(i)
         If i < 11 Then .Visible = False Else .Visible = True
      End With
   Next i
   Application.ScreenUpdating = True
End Sub
Le second semble dire que tu confonds l'index des feuilles avec leur CodeName. J'ai créer une routine pour que tu puisses vérifier le contenu de ton classeur. Si tu exécutes la macro suivante, un nouveau classeur va s'afficher avec le nom des feuilles, leur index, leur CodeName et si elles sont visible. Cela te permettras de mieux comprendre ce qui ne va pas dans ton code. Voici la procédure :
Sub IndexFeuilles()
   Dim Sh As Worksheet, Lig As Long, Wbk As Workbook
   Set Wbk = Workbooks.Add
   With Wbk.Worksheets(1)
      Lig = 1
      .Cells(Lig, 1).Value = "Index"
      .Cells(Lig, 2).Value = "Nom feuille"
      .Cells(Lig, 3).Value = "CodeName feuille"
      .Cells(Lig, 4).Value = "Visible"
      With .Rows(Lig).Font
         .Bold = True
         .Underline = True
      End With
      For Each Sh In ThisWorkbook.Worksheets
         Lig = Lig + 1
         .Cells(Lig, 1) = Sh.Index
         .Cells(Lig, 2) = Sh.Name
         .Cells(Lig, 3) = Sh.CodeName
         .Cells(Lig, 4) = (Sh.Visible = True)
      Next Sh
      .Columns.AutoFit
   End With
End Sub
Par exemple, la feuille Choix Solutions 2 à pour CodeName Feuil13 et son index est le numéro 5 :
L'index correspond à l'emplacement de la feuille dans le classeur, quelle soit masquée ou non
Le CodeName est le nom de la Feuille dans VBE (Visual Basic Editor). Cette propriété est très intéressante, car le CodeName ne change pas quand on déplace la feuille ou quand on la renomme. Cela permet d'accepter qu'un utlisateur renomme ou déplace une feuille, sans que cela ne perturbe le bon fonctionnement des macros.
Tu peux renommer le CodeName pour lui donner un nom plus clair, par exemple Feuil13 > ShSolution02. Au niveau du programme, les trois appels de feuille sont équivalents :
ThisWorkbook.Worksheets(5) = ThisWorkbook.Worksheets("Choix Solution 2") = Feuil13

Pour répondre à ta question concernant la déprotection des feuilles avant de les afficher, ma réponse est qu'il est inutile d'oter la protection pour masquer ou afficher une feuille, cela ne concerne que le contenu de la feuille.
A+
Benoît Marchand
[Benead]
N
Naeqh
Jeune membre
Jeune membre
Messages : 14
Inscrit le : 20 avril 2014
Version d'Excel : 2010

Message par Naeqh » 29 avril 2014, 13:45

Bonjour,

Merci pour cette réponse. Je n'avais pas compris tout de suite comment adapter à mon problème et le problème de mon code.
Mais au final je m'en suis sorti en adaptant avec :

Sheets(Array(Feuil2.Name, Feuil.....) etc et j'ai juste changé ton If i < 11 Then en If i < 1 Then et tout me convient.

Merci beaucoup de ton aide car cela faisait déjà pas mal de temps que je me cassais la tête pour quelque chose de pas très compliqué.

Au plaisir.
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message