Erreur 9 : L'indice n'appartient pas à la sélection

Bonjour au forum,

J'ai un petit souci avec ce code (que Leakim m'a gentiment transmis) :

       Sheets(Format(Date, "mmmm")).Activate
       If Err <> 0 Then MsgBox "L'onglet " & Format(Date, "Mmmm") & " n'existe pas !"

qui permet d'ouvrir mon fichier contenant un onglet par mois sur l'onglet du mois en cours.

Le code fonctionne, c'est à dire que l'ouverture se fait bien sur le mois de février, mais j'ai quand même la MsgBox qui s'affiche : "L'onglet février n'existe pas !"

Auriez-vous une idée du problème ?

Bonjour,

je pense (pas sûr) que l'erreur viens de "If err" qu'il faut remplacer par "Err.Number". Avec ton Exemple :

Sheets(Format(Date, "mmmm")).Activate
If Err.Number <> 0 Then MsgBox "L'onglet " & Format(Date, "Mmmm") & " n'existe pas !"

Cela permet de comparer le numéro de l'erreur ..

Essaye et dis mois !

RemBabar

Salut RemBabar,

Merci pour ta réponse, mais cela ne résout pas le problème.

Un deuxième proposition ..

On error goto 0
On error resume next
Sheets(Format(Date, "mmmm")).Activate
If Err.Number <> 0 Then MsgBox "L'onglet " & Format(Date, "Mmmm") & " n'existe pas !"

Si non, je n'ai plus d'idée..

Rembabar

Re,

Toujours pareil...

Ce qui me perturbe c'est que si je vire cette ligne :

If Err.Number <> 0 Then MsgBox "L'onglet " & Format(Date, "Mmmm") & " n'existe pas !"

pour ne laisser que ça :

Sheets(Format(Date, "mmmm")).Activate

tout fonctionne et je n'ai aucun message d'erreur....

J'aimerais bien comprendre d'où vient le soucis...

Merci quand même RemBabar !

Si quelqu'un d'autre a une idée... ?

Un petit up...

Je n'ai toujours pas résolu ce problème...

Bonjour,

Mets :

Sub Workbook_Open()
On Error Resume Next
Sheets(Format(Date, "mmmm")).Activate
If Err.Number > 0 Then MsgBox "L'onglet " & Format(Date, "Mmmm") & " n'existe pas !"
End Sub

A+

Bonjour Galopin01,

Merci pour ta réponse, mais j'ai toujours la MsgBox qui s'affiche...

Pb actuel

Si code se limite à ce qu'indiquait Galopin, devrait pas y avoir erreur !

Seulement message si feuille n'existe pas !

Bonjour Nrev74 ,

Vérifiez la présence de l'accent sur février ou de majuscule dans votre non de feuille.

Majuscule si dans le code "Format(Date, "Mmmm")" ou mmmm

Toujours avec

Sub Workbook_Open()

On Error Resume Next

Sheets(Format(Date, "mmmm")).Activate

If Err.Number > 0 Then MsgBox "L'onglet " & Format(Date, "Mmmm") & " n'existe pas !"

End Sub

Cordialement

Régis

Bonjour MFerrand, F4crw,

Merci pour vos réponses.

@MFerrand : ci-dessous le code complet de la sub (qui fonctionnait sans erreur mais j'ai peut-être loupé quelque chose...) :

Private Sub Workbook_Open()

Dim Ws As Worksheet

ThisWorkbook.BuiltinDocumentProperties("Author").Value = "xxxx xxxx"

    Application.ScreenUpdating = False

For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "Accueil" Then Ws.Visible = xlSheetVisible
    If Ws.Name = "BD" Then Ws.Visible = xlSheetVeryHidden
Next Ws

With Sheets("Accueil")
    .Visible = xlSheetVeryHidden
    .Protect Password:="mdp"
End With

    Application.ScreenUpdating = True

On Error Resume Next
Sheets(Format(Date, "Mmmm")).Activate
If Err.Number > 0 Then MsgBox "L'onglet " & Format(Date, "Mmmm") & " n'existe pas !"

Workbooks("Menu_CQI.xlsx").Close False

End Sub

@F4crw : j'ai testé toute les conformations, mais rien n'y change...


@Galopin01 : effectivement cela fonctionne avec ton fichier... Ce qui veut dire que c'est le reste de mon code qui pose problème

Je ne comprends pas d'où vient l'erreur car avant l'ajout de ce bout de code, je n'avais pas de message d'erreur...

Re,

Il ne peut y avoir de problème d'accent... Hier (car aujourd'hui 1er mars !), Format(Date, "mmmm") renvoyait février.

(NB- Et le fait de mettre le format sous forme "Mmmm" est indifférent : c'est février qui est renvoyé.)

La feuille se nomme Février. Un nom de feuille n'est pas sensible à la casse.

Donc, la commande Sheets("février").Activate va activer la feuille Février, sans déclencher d'erreur (ni donc message d'inexistence de la feuille.

Cordialement.

Bonjour Nrev74,

[Toujours pas appris à indenter correctement !

ni à qualifier systématiquement tes expressions !! ]

Jusqu'à With Sheets("Accueil") on est dans le classeur qui vient de s'ouvrir et qui contient la macro...

A partir de ce With, Sheets("Accueil") n'est pas qualifiée... S'agit-il bien de la même feuille que précédemment ! C'est en tout cas la même qui va être affectée: le classeur actif n'a pas changé, donc la feuille qu'on a rendu précédemment visible va être maintenant masquée. [C'est les autres qu'on avait rendues visibles...]

La feuille du mois à activer (également non qualifiée) doit aussi être dans le classeur actif...

Et le classeur qu'on ferme était-il ouvert ?

Le code s'exécute dans un environnement, il convient de préciser quel il est !

Bonjour MFerrand,

Merci pour ta réponse !

J'ai tout de même fais des efforts concernant l'indentation et la déclaration de variable, tu ne trouves pas ???

Plus sérieusement, je t'avoue que je ne vois pas ce qui ne va pas dans ma synthaxe... Je prends volontiers tes conseils !

Concernant tes questions sur ce code :

Private Sub Workbook_Open()

Dim Ws As Worksheet

ThisWorkbook.BuiltinDocumentProperties("Author").Value = "xxx xxx"

    Application.ScreenUpdating = False

        For Each Ws In ThisWorkbook.Worksheets
            If Ws.Name <> "Accueil" Then Ws.Visible = xlSheetVisible
            If Ws.Name = "BD" Then Ws.Visible = xlSheetVeryHidden
        Next Ws

With Sheets("Accueil")
    .Visible = xlSheetVeryHidden
    .Protect Password:="mdp"
End With

    Application.ScreenUpdating = True

On Error Resume Next
Sheets(Format(Date, "Mmmm")).Activate
If Err.Number > 0 Then MsgBox "L'onglet " & Format(Date, "Mmmm") & " n'existe pas !"

Workbooks("Menu_CQI.xlsx").Close False

End Sub
MFerrand a écrit :

Jusqu'à With Sheets("Accueil") on est dans le classeur qui vient de s'ouvrir et qui contient la macro...

On est d'accord.

MFerrand a écrit :

A partir de ce With, Sheets("Accueil") n'est pas qualifiée... S'agit-il bien de la même feuille que précédemment ! C'est en tout cas la même qui va être affectée: le classeur actif n'a pas changé, donc la feuille qu'on a rendu précédemment visible va être maintenant masquée. [C'est les autres qu'on avait rendues visibles...]

Sheets("Accueil") --> c'est bien la même feuille que précédemment (du coup faut-il quand même la qualifier...?)

J'ai besoin de cacher cette feuille ("Accueil") à cause de ce code qui s'exécute à la fermeture du classeur :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim Ws As Worksheet

    Application.ScreenUpdating = False

Sheets("Accueil").Visible = xlSheetVisible

For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "Accueil" Then Ws.Visible = xlSheetVeryHidden
Next Ws

    Application.ScreenUpdating = True

ThisWorkbook.Save
End Sub
MFerrand a écrit :

La feuille du mois à activer (également non qualifiée) doit aussi être dans le classeur actif...

C'est le cas.

MFerrand a écrit :

Et le classeur qu'on ferme était-il ouvert ?

Oui.

MFerrand a écrit :

Le code s'exécute dans un environnement, il convient de préciser quel il est !

Je ne comprends pas ce que cela signifie, désolé

Merci pour ton aide !

Bonjour,

L'environnement c'est les questions que j'ai posées, + celles que je n'ai pas pensé à poser !

Ton traitement à part de Accueil fait rustine rajoutée, pas de raison que ce ne soit pas traité avec les autres...

Private Sub Workbook_Open()
    Dim Ws As Worksheet
    ThisWorkbook.BuiltinDocumentProperties("Author").Value = "xxx xxx"
    Application.ScreenUpdating = False
    For Each Ws In ThisWorkbook.Worksheets
        Select Case Ws.Name
            Case "Accueil"
                Ws.Visible = xlSheetVeryHidden
                Ws.Protect Password:="mdp"
            Case "BD"
                Ws.Visible = xlSheetVeryHidden
            Case Else
                Ws.Visible = xlSheetVisible
        End Select
    Next Ws
    Application.ScreenUpdating = True
    On Error Resume Next
    Sheets(Format(Date, "mmmm")).Activate
    If Err.Number > 0 Then
        MsgBox "L'onglet " & StrConv(Format(Date, "mmmm"), vbProperCase) & " n'existe pas !"
        Err.Clear
    End If
    Workbooks("Menu_CQI.xlsx").Close False
End Sub

Aucune modif. sur le fond ci-dessus, l'erreur 9 n'est pas explicable dans le code. (Sauf si classeur "Menu..." non ouvert : qu'est-ce qui garantit qu'il soit ouvert, rien n'y oblige, c'est un fichier sans macro, donc l'ouverture du classeur en cause n'est pas lancée à partir de "Menu...").

En fait, si les macros ne sont pas activées, seule la feuille Accueil est affichée, elle ne l'est pas quand les macros sont activées...

Cordialement.

J'avoue que c'est beaucoup plus clair...

Je ne connais pas encore select case, mais ça m'a l'air très utile pour beaucoup de situations que je rencontre...

Pour le fichier Menu_CQI.xlsx, il doit forcément être ouvert car c'est depuis celui-ci (via un lien hypertexte) qu'est ouvert ce fichier (qui comporte la macro).

Tu penses que le problème vient de là ?

Une erreur 9 est logique si on ouvre le classeur directement... maintenant tu dois savoir comment tu lances son ouverture quand tu le fais !

Sur quelle ligne apparaît l'erreur ?

En fait j'ai créé un fichier Menu_CQI.xlsx dans lequel j'ai insérer une forme avec un lien hypertexte qui ouvre le fichier dans lequel la macro me pose "problème".

Donc ce fichier Menu_CQI.xlsx est forcément ouvert car c'est via le lien hypertexte qu'il contient que l'ouverture du fichier qui pose soucis se fait.

Concernant l'erreur, je n'en ai pas à proprement parlé...

Je m'explique.

Lorsque je clique sur le lien hypertexte de mon fichier Menu_CQI.xlsx, le fichier contenant la macro s'ouvre. L'ouverture se fait sur la Sheet("Accueil"), où j'ai mis un message qui explique qu'il faut impérativement accepter les macros pour pouvoir utiliser le fichier.

L'utilisateur est donc obligé d'activer les macros, et une fois fait, la feuille "Accueil" devient cachée et tout les autres apparaissent (sauf la BD comme c'est écrit dans le code).

Et c'est ici que j'ai le problème : la MsgBox m'affiche que l'onglet mars n'existe pas.

Pour comprendre, j'ai remplacé :

MsgBox "L'onglet " & Format(Date, "Mmmm") & " n'existe pas !"

Par :

MsgBox "Erreur: " & Err.Number & vbCrLf & Err.Description

Et le résultat de cette MsgBox est : Erreur 9, l'indice n'appartient pas à la sélection

Je n'ai rien qui "bloque l'exécution du code, juste cette MsgBox qui s'affiche alors qu'elle ne devrait pas.

Le message intervenant juste après la ligne d'activation, ce ne peut donc être que cette ligne qui déclenche l'erreur !

C'est un peu fort ! car si tu comparais la chaîne Format(Date,"mmmm") qui renvoie mars au nom de feuille qui est Mars, VBA renâclerait à cause de la majuscule (normal).

Mais tu ne compares pas, tu actives "mars", et Excel qui ne saurait accepter 2 feuilles concurrentes (mars et Mars) va en conséquence activer Mars, donc sans erreur (et en effet l'erreur l'apparaît pas chez tous ceux qui ont testé !)

Au vu du code, je ne vois pas quoi d'autre pourrait intervenir !

Rechercher des sujets similaires à "erreur indice appartient pas selection"