Simplifier une macro pour ouvrir des feuilles avec double clic

Pat2A

XLDnaute Junior
Bonjour,

J'ai actuellemnt une macro qui m'ouvre une feuille différente selon sur quelle cellule d'une ligne je double-clique. Comme j'ai une centaine de feuilles différentes à ouvrir l'écriture de la macro devient fastidieuse. Pour simplifier j'ai copier, sur ma feuille où je double-clique, le nom de la feuille de destination dans une colonne cachée (IV) en face de chaque ligne correspondante.
Grâce à ça je dois pouvoir réduire ma macro à juste quelques lignes par rapport à plus de 300 lignes actuellement.
Je n'arrive malheureusement pas à trouver les termes exact des fonctions à utiliser.

Ce que je cherche à trouver:
Quand je double-clique sur une cellule
Alors j'ouvre la feuille dont le nom est en colonne (IV) de la ligne correspondante à ma cellule sélectionnée.

Ce que j'ai actuellement:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Range("D17:IG212,D503:IU698,D989:IG1184"), Target) Is Nothing Then Exit Sub
Cancel = True
If Target.Row = 18 Or Target.Row = 504 Or Target.Row = 990 Then
Sheets("Feuille2").Visible = True
Worksheets("Feuille2").Select
ElseIf Target.Row = 20 Or Target.Row = 506 Or Target.Row = 992 Then
Sheets("Feuille3").Visible = True
Worksheets("Feuille3").Select
-
-
-
End If
Sheets("Feuille1").Visible = xlSheetVeryHidden
Exit Sub
End Sub

Merci de votre attention
 

pierrejean

XLDnaute Barbatruc
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

bonjour Pat2A

En supposant avoir compris:
A tester

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Range("D17:IG212,D503:IU698,D989:IG1184" ), Target) Is Nothing Then Exit Sub
Cancel = True
Sheets(range("IV" & target.row)).Visible=true
Sheets(range("IV" & target.row)).Select
-
-
End If
Sheets("Feuille1").Visible = xlSheetVeryHidden
Exit Sub
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Bonjour Pat, bonjour le forum,

Peut-être comme ça :
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Range("D17:IG212,D503:IU698,D989:IG1184"), Target) Is Nothing Then Exit Sub
Cancel = True
Sheets(Cells(Target.Row, 256).Value).Visible = True
Worksheets(Cells(Target.Row, 256).Value).Select
Sheets("Feuille1").Visible = xlSheetVeryHidden
End Sub

[Édition]
Bonjour PierreJean... beep..beep...
 

nyko283

XLDnaute Occasionnel
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Bonjour Pat2A, le forum

Tu peut remplacer :
VB:
 If Target.Row = 18 Or Target.Row = 504 Or Target.Row = 990 Then
Sheets("Feuille2").Visible = True
Worksheets("Feuille2").Select
ElseIf Target.Row = 20 Or Target.Row = 506 Or Target.Row = 992 Then
Sheets("Feuille3").Visible = True
Worksheets("Feuille3").Select
-
-
-
End If
par :
VB:
Sheets(Cells(Target.Row, 256).Value).Visible = True
Worksheets(Cells(Target.Row, 256).Value).Select

Pour cette macro il faut obligatoirement que sur chaque ligne il y ai en colonne "IV" le nom de la feuille.

Mais cela réduit le nombre de ligne de code.

Bonne Journée.

edit : Bonjour Pierre Jean ,toujours le plus rapide.
Bonjour Robert, et on se re croise...
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Salut à tous
Le temps que mes petits neurones se mettent en route, déjà plein de réponses. Mais comme je n'aime pas travailler pour rien...
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim X As Long, F As String, Flg As Boolean

If Intersect(Range("D17:IG212,D503:IU698,D989:IG1184"), Target) Is Nothing Then Exit Sub
Cancel = True
X = Target.Row
If Int(X / 2) <> (X / 2) Or X < 18 Then Exit Sub
Select Case X
    Case Is < 504
        F = "feuille" & ((X - 14) / 2)
    Case Is < 990
        F = "feuille" & ((X - 500) / 2)
    Case Else
        F = "feuille" & ((X - 986) / 2)
End Select
Loop
For X = 1 To Sheets.Count
    If Sheets(X).Name = F Then
        Sheets(X).Visible = True
        Sheets(X).Activate
        Sheets("Feuille1").Visible = xlSheetVeryHidden
        Exit Sub
    Else
        Flg = True
    End If
Next X
If Flg Then MsgBox "pas de feuille trouvée !"
End Sub
Ne pouvant tirer des infos intéressante que de la macro, je ne me suis pas préoccupé du texte. Mais j'ai de sérieux doutes sur la justesse de ce qui est donné.
- Les noms des feuilles et leurs positions
- La séquence fournie : 2 ne me semble pas suffisant
- Les limites : on exclu de D17 à IG212 => que doit-il se passer sur double-click en A17 ou IH17 ?

J'ai donc mis des garde-fou, limitant la macro.
A+
 
Dernière édition:

Pat2A

XLDnaute Junior
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Merci messieurs pour vos réponses, j'ai utilisé le code le plus simple, celui de Robert et nyko283, celui de pierrejean ne fonctionnant pas dans mon exemple. Ca fonctionne très bien sauf si je double-clique sur des cellules protégées il va alors ouvrir la feuille correspondant à la cellule précédemment sélectionnée.
Je pensait que le
Code:
If Intersect(Range("D17:IG212,D503:IU698,D989:IG1184" ), Target) Is Nothing Then Exit Sub
limitait l'utilisasion de la macro uniquement si je double-clique dans cette plage de cellules??
Qu'en pensez-vous?
Y-a-t-il un moyen simple de limiter la macro à cette plage?

Concernant le code de Gorfael, je vais déjà essayer de le comprendre avant de l'utiliser. Mais peut-être répond-t-il à mon intérrogation?

Merci encore pour votre aide précieuse.
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Bonjour le fil, bonjour le forum,

Le code fonctionne bien chez moi, si je double-clique sur une cellule ne faisant pas partie de la plage ça va bien à Exit Sub... Es-tu sûr de la plage ?
 

Pat2A

XLDnaute Junior
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Bonjour le fil, bonjour le forum,

Le code fonctionne bien chez moi, si je double-clique sur une cellule ne faisant pas partie de la plage ça va bien à Exit Sub... Es-tu sûr de la plage ?
Bonjour à tous,

En fait cela est dû au fait que toutes mes cellules en dehors de la plage sont protégées et si je déprotège la feuille alors il n'y a plus le problème mais j'aimerai éviter d'en arriver là.
Merci pour ton aide.
 

nyko283

XLDnaute Occasionnel
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

En effet, si ce que tu souhaite est que :

Si tu double clic sur n'importe quelle cellule de la feuille en dehors des plages citées dans le code a savoir "D17:IG212,D503:IU698,D989:IG1184" alors le code est correct.

Mais si tu veux que la macro se lance uniquement si tu double clic sur une cellule à l'interieur de l'une de ces plages alors il faut rajouter "Not" apres le "If" pour donner:
VB:
 If Not Intersect(Range("D17:IG212,D503:IU698,D989:IG1184" ), Target) Is Nothing Then Exit Sub
 

nyko283

XLDnaute Occasionnel
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Ah sinon pour eviter que le curseur ne rentre dans la cellule lors du double clic il va falloir annuler le double clic dans la procédure,

Grace au paramètres "Cancel" de la procédure évènementielle
VB:
 Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean

Comme l'avais suggérer tous le monde dans leur code sauf moi....:eek: car même dans ton code d'origine il y était.
 

Pat2A

XLDnaute Junior
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

En effet, si ce que tu souhaite est que :

Si tu double clic sur n'importe quelle cellule de la feuille en dehors des plages citées dans le code a savoir "D17:IG212,D503:IU698,D989:IG1184" alors le code est correct.

Mais si tu veux que la macro se lance uniquement si tu double clic sur une cellule à l'interieur de l'une de ces plages alors il faut rajouter "Not" apres le "If" pour donner:
VB:
 If Not Intersect(Range("D17:IG212,D503:IU698,D989:IG1184" ), Target) Is Nothing Then Exit Sub

Je viens d'essayer mais que ce soit en dehors où dans la plage, la macro ne se lance pas...
Merci quand même.
 

Pat2A

XLDnaute Junior
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Ah sinon pour eviter que le curseur ne rentre dans la cellule lors du double clic il va falloir annuler le double clic dans la procédure,

Grace au paramètres "Cancel" de la procédure évènementielle
VB:
 Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean

Comme l'avais suggérer tous le monde dans leur code sauf moi....:eek: car même dans ton code d'origine il y était.
J'ai bien gardé cette procédure dans mon
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
   If Intersect(Range("D17:IG212,D503:IU698,D989:IG1184"), Target) Is Nothing Then Exit Sub
     Cancel = True
     Sheets(Cells(Target.Row, 256).Value).Visible = True
     Worksheets(Cells(Target.Row, 256).Value).Select
     Sheets("SAMP Mamba").Visible = xlSheetVeryHidden
   Exit Sub
End Sub
Le problème vient certainement des cellules protégées car le double clic n'a aucun effet sur elles, la cellule sélectionnée précédente dans la plage active reste sélectionnée et le programme pense que le double clic s'est fait sur elle, il ouvre alors la feuille correspondante. Je ne vois pas d'autre explication...
 

nyko283

XLDnaute Occasionnel
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Regarde le fichier joint,

La feuil 1 et 2 sont 2 exemple différent suivant si tu veux que la macro se lance à l'interieur ou l'extérieur de la zone non protéger, le reste de la feuille est verrouiller.

si le code est lancé alors la feuille 4 est masqué et la feuille 3 est affiché.

clique sur le bouton de la feuille 3 pour réaffiché la feuille 4.
 

Pièces jointes

  • Classeur1.xls
    44 KB · Affichages: 141
  • Classeur1.xls
    44 KB · Affichages: 138
  • Classeur1.xls
    44 KB · Affichages: 146

Pat2A

XLDnaute Junior
Re : Simplifier une macro pour ouvrir des feuilles avec double clic

Ok, j'ai vérifier, cela fonctionne bien sur ton classeur.
J'ai peut-être un conflit avec la macro de protection automatique du classeur. C'est une hypothèse, je ne sais plus trop d'où cela vient...
En tout cas merci pour votre aide.
 

Discussions similaires