Erreur d’exécution 9 Indice n'appartient pas à la selection

Bonjour à tous,

Je tente de programmer l'impression d'onglets excel à l'aide d'un userform. A cette fin, pour sélectionner mes onglets à imprimer, j'ai fait ce code.

Private Sub CommandButton3_Click() 

    Dim i As Integer
    Dim myPages As Variant

   'Call Impression_feuille ' Programme de mise en forme des feuilles dans un autre module : il marche bien

    If CheckBox1.Value = True Then
        ReDim myPages(i)
        myPages(i) = "1_Presentation_1"
        i = i + 1
    End If

        If CheckBox2.Value = True Then
                If i = 0 Then
                    ReDim myPages(i)
                Else
                   ReDim Preserve myPages(i)
                End If
                myPages(i) = "2_Liste_Perimetre"
                i = i + 1
            End If

                If CheckBox3.Value = True Then
                    If i = 0 Then
                        ReDim myPages(i)
                    Else
                       ReDim Preserve myPages(i)
                    End If
                    myPages(i) = "3_Presentation_2"
                    i = i + 1
                End If

                    If CheckBox4.Value = True Then
                        If i = 0 Then
                            ReDim myPages(i)
                        Else
                           ReDim Preserve myPages(i)
                        End If
                        myPages(i) = "4_Resultats_Prev"
                        i = i + 1
                    End If

                        If CheckBox5.Value = True Then
                            If i = 0 Then
                                ReDim myPages(i)
                            Else
                               ReDim Preserve myPages(i)
                            End If
                            myPages(i) = "5_Resulats_Sante"
                            i = i + 1
                        End If

                            If CheckBox6.Value = True Then
                                If i = 0 Then
                                    ReDim myPages(i)
                                Else
                                   ReDim Preserve myPages(i)
                                End If
                                myPages(i) = "6_Resulats_Techniques"
                                i = i + 1
                            End If

                                If CheckBox7.Value = True Then
                                    If i = 0 Then
                                        ReDim myPages(i)
                                    Else
                                       ReDim Preserve myPages(i)
                                    End If
                                    myPages(i) = "7_Provisions"
                                    i = i + 1
                                End If

                                    If CheckBox8.Value = True Then
                                        If i = 0 Then
                                            ReDim myPages(i)
                                        Else
                                           ReDim Preserve myPages(i)
                                        End If
                                        myPages(i) = "8_Analyses"
                                        i = i + 1
                                    End If

                                        If CheckBox9.Value = True Then
                                            If i = 0 Then
                                                ReDim myPages(i)
                                            Else
                                               ReDim Preserve myPages(i)
                                            End If
                                            myPages(i) = "9_Resultats_C10"
                                            i = i + 1
                                        End If

                                            If CheckBox10.Value = True Then
                                                If i = 0 Then
                                                    ReDim myPages(i)
                                                Else
                                                   ReDim Preserve myPages(i)
                                                End If
                                                myPages(i) = "10_C10"
                                                i = i + 1
                                            End If

                                                If CheckBox11.Value = True Then
                                                    If i = 0 Then
                                                        ReDim myPages(i)
                                                    Else
                                                       ReDim Preserve myPages(i)
                                                    End If
                                                    myPages(i) = "11_C5"
                                                    i = i + 1
                                                End If

                                                    If CheckBox12.Value = True Then
                                                        If i = 0 Then
                                                            ReDim myPages(i)
                                                        Else
                                                           ReDim Preserve myPages(i)
                                                        End If
                                                        myPages(i) = "12_Presentation_Graphiques"
                                                        i = i + 1
                                                    End If

                                                            If CheckBox13.Value = True Then
                                                                If i = 0 Then
                                                                    ReDim myPages(i)
                                                                Else
                                                                   ReDim Preserve myPages(i)
                                                                End If
                                                                myPages(i) = "13_Graph_Prev"
                                                                i = i + 1
                                                            End If

                                                 If CheckBox14.Value = True Then
                                                    If i = 0 Then
                                                     ReDim myPages(i)
                                                    Else
                                                     ReDim Preserve myPages(i)
                                                    End If
                                                    myPages(i) = "14_Graph_Sante"
                                                     i = i + 1
                                                End If

                                      If CheckBox15.Value = True Then
                                        If i = 0 Then
                                         ReDim myPages(i)
                                        Else
                                         ReDim Preserve myPages(i)
                                        End If
                                        myPages(i) = "15_Liste_DC_et_PM"
                                         i = i + 1
                                    End If

                            If CheckBox16.Value = True Then
                                If i = 0 Then
                                 ReDim myPages(i)
                                Else
                                 ReDim Preserve myPages(i)
                                End If
                                myPages(i) = "16_Liste_Deces"
                                 i = i + 1
                            End If

                    If CheckBox17.Value = True Then
                        If i = 0 Then
                         ReDim myPages(i)
                        Else
                         ReDim Preserve myPages(i)
                        End If
                        myPages(i) = "17_Liste_PM"
                         i = i + 1
                    End If

            If CheckBox18.Value = True Then
                If i = 0 Then
                 ReDim myPages(i)
                Else
                 ReDim Preserve myPages(i)
                End If
                myPages(i) = "18_Presentation_Lexique"
                 i = i + 1
            End If

    If CheckBox19.Value = True Then
        If i = 0 Then
         ReDim myPages(i)
        Else
         ReDim Preserve myPages(i)
        End If
        myPages(i) = "19_Lexique"
         i = i + 1
    End If

MsgBox i

 'MsgBox IsEmpty(myPages(i))

       UserForm1.Hide

    ThisWorkbook.Sheets(myPages).Select
       ActiveWindow.SelectedSheets.PrintPreview

End Sub

Le code d'exécute bien, me sélectionne mes onglets stockés dans i. Ca me renvoi bien mes 19 quand tout à sélectionne donc je ne me suis pas trompé dans l'écriture des noms des onglets). Mais pb à l'avant dernière ligne. En gros ce code:

ThisWorkbook.Sheets(myPages).Select

Il ne marche pas. Je l'ai testé dans un autre nouveau classeur ayant les mêmes caractéristiques que ma maquette et il marche bien pourtant!

Mais quand je reviens pour le tester dans ma maquette, cela me renvoi la même erreur 9: l'indice n'appartient pas à la sélection.

Quelqu'un pourrait m'aider ? Merci d'avance.

Vanessa.

Bonjour Vanessa,

Déjà comme ça, ton code peut largement être optimisé, 10/15 lignes max

N'est-il pas possible de nous joindre ton fichier anonymisé ?

@+

Bonjour Vanessa

myPages est un tableau, pas un nom, tu ne peux donc pas écrire ceci :

ThisWorkbook.Sheets(myPages).Select

essaie plutôt de remplacer myPages par myPages.count ou bien Ubound(myPages)

Bonjour Bruno, bien évidemment d'accord avec toi, une fois l'erreur de syntaxe corrigée.

Salut Steelson

J'avoue ne pas avoir fait attention à ça...

Bonjour à tous,

A tester !...

Private Sub CommandButton3_Click()
Dim myPages(1 To 19) As String, sheetArray() As String
Dim I As Long, k As Long

    myPages(1) = "1_Presentation_1"
    myPages(2) = "2_Liste_Perimetre"
    myPages(3) = "3_Presentation_2"
    myPages(4) = "4_Resultats_Prev"
    myPages(5) = "5_Resulats_Sante"
    myPages(6) = "6_Resulats_Techniques"
    myPages(7) = "7_Provisions"
    myPages(8) = "8_Analyses"
    myPages(9) = "9_Resultats_C10"
    myPages(10) = "10_C10"
    myPages(11) = "11_C5"
    myPages(12) = "12_Presentation_Graphiques"
    myPages(13) = "13_Graph_Prev"
    myPages(14) = "14_Graph_Sante"
    myPages(15) = "15_Liste_DC_et_PM"
    myPages(16) = "16_Liste_Deces"
    myPages(17) = "17_Liste_PM"
    myPages(18) = "18_Presentation_Lexique"
    myPages(19) = "19_Lexique"

    For I = 1 To 19
        If Me.CheckBox & I Then
            ReDim Preserve sheetArray(k)
            sheetArray(k) = I
            k = k + 1
        End If
    Next I

    If k > 0 Then ThisWorkbook.Sheets(sheetArray()).PrintPreview

End Sub

Bonjour Jean-Eric,

@ Vanessa : J'ajoute que pour ma part j'évite de mettre en "dur" dans une macro des paramètres ... fais la liste dans un onglet, voire liste ces onglets dans la macro sans les nommer un par un. S'il y a d'autres onglets non concernés, le mieux est d'avoir un code pour les reconnaître ... comme ici un chiffre dans le premier caractère du nom d'onglet.

Re,

@Steelson, totalement d'accord avec toi pour les paramètres

@Vanessa, pour le fun, une autre possibilité avec une ListBox et ses options

@+

Bonjour à vous,

Je vous remercie pour vos différents retours...

@BrunoM45 il est vrai mon code n'est pas du tout optimisé. Je code que depuis récemment et j'apprends bcp sur le tas donc je connais pas bcp de procédure ni de fonctions. J'ai joint, une partie de ma maquette pour exemple.

@Steelson j'ai essayé par .count ou Ubound mais cela ne fonctionne pas. Il a un pb de syntaxe à un niveau mais je ne vois pas où. J'ai éssayé :

   ThisWorkbook(myPages).Count.Select

et

   ThisWorkbook(myPages).Count

Tu trouveras cela dans le code. Merci pour ta remarque sur la liste à ne pas mettre en paramètres. Je savais pas trop comment le faire facilement.

@Jean-Eric, je te remercie ton code est vachement optimisé mais cela me renvoi cette erreur: méthode ou données introuvable au niveau de cette ligne :

If Me.CheckBox & I Then

@BrunoM45 j'avais fait un formulaire à cet effet, qui me permettait plus d'option (tout sélectionner ou encore abandonner la procédure). Mais j'avoue que la checklist n'est pas mal du tout et prends moins de place. J'ai tenté de la reproduire mais je ne sais pas comment tu as inséré les cases à cocher ( dans la checklist). Si tu testes, tu verras qu'il me manque les cases à cocher.

Puis, autre chose, après exécution de ton code (je l'ai collé dans ma maquette d'origine) j'ai souvent l'erreur 7: mémoire insuffisante.

Merci d'avance.

Vanessa.

9maquette-test.zip (655.60 Ko)

Je n'ai pas le temps d'essayer, mais

comme je disais myPages est un tableau, tu ne peux pas le mettre comme un nom de feuille ou de fichier.

Bonjour,

Une petite correction !?

For I = 1 To 19
        If Me.Controls("CheckBox" & I) Then
            ReDim Preserve sheetArray(k)
            sheetArray(k) = I
            k = k + 1
        End If
    Next I

@Steelson j'ai essayé par .count ou Ubound mais cela ne fonctionne pas. Il a un pb de syntaxe à un niveau mais je ne vois pas où. J'ai éssayé :

   ThisWorkbook(myPages).Count.Select

et

   ThisWorkbook(myPages).Count

Vanessa,

je n'avais pas immédiatement pigé que tu sélectionnais plusieurs feuilles.

dans ce cas il manquait juste les parenthèses () après myPages

Sheets(myPages()).Select

exemple

6van.xlsm (14.47 Ko)

Re,

@BrunoM45 j'avais fait un formulaire à cet effet, qui me permettait plus d'option (tout sélectionner ou encore abandonner la procédure). Mais j'avoue que la checklist n'est pas mal du tout et prends moins de place. J'ai tenté de la reproduire mais je ne sais pas comment tu as inséré les cases à cocher ( dans la checklist). Si tu testes, tu verras qu'il me manque les cases à cocher.

Puis, autre chose, après exécution de ton code (je l'ai collé dans ma maquette d'origine) j'ai souvent l'erreur 7: mémoire insuffisante.

Merci d'avance.

Pour ce qui concerne les cases à cocher dans la ListBox, c'est la propriété "ListStyle" qu'il faut changer en la mettant sur fmListStyleOption

image

Ensuite tu dois modifier également la propriété "Multiselect" en la mettant sur fmMultiSelectMulti

image

Pour le problème de mémoire, c'est peut-être parce que je n'efface pas la ListBox avant d'y ajouter les valeurs
A essayer :

Private Sub UserForm_Initialize()
  Dim dLig As Long, Lig As Long
  ' Effacer le contenu de la ListBox avant de la remplir
  Me.ListBox1.Clear
  '
  With ThisWorkbook.Sheets("Params")
    dLig = .Range("A" & Rows.Count).End(xlUp).Row
    For Lig = 2 To dLig
      Me.ListBox1.AddItem .Range("A" & Lig).Value
    Next Lig
  End With
End Sub

@+

Bonjour à vous,

Jean-Eric, j'ai tenu compte de tes corrections. Dans ton code:

Private Sub CommandButton3_Click()

Dim myPages(1 To 19) As String, sheetArray() As String
Dim I As Long, k As Long

myPages(1) = "1_Presentation_1"
myPages(2) = "2_Liste_Perimetre"
myPages(3) = "3_Presentation_2"
myPages(4) = "4_Resultats_Prev"
myPages(5) = "5_Resulats_Sante"
myPages(6) = "6_Resulats_Techniques"
myPages(7) = "7_Provisions"
myPages(8) = "8_Analyses"
myPages(9) = "9_Resultats_C10"
myPages(10) = "10_C10"
myPages(11) = "11_C5"
myPages(12) = "12_Presentation_Graphiques"
myPages(13) = "13_Graph_Prev"
myPages(14) = "14_Graph_Sante"
myPages(15) = "15_Liste_DC_et_PM"
myPages(16) = "16_Liste_Deces"
myPages(17) = "17_Liste_PM"
myPages(18) = "18_Presentation_Lexique"
myPages(19) = "19_Lexique"

    For I = 1 To 19

         If Me.Controls("CheckBox" & I) Then
            ReDim Preserve sheetArray(k)
            sheetArray(k) = I
            k = k + 1
        End If

    Next I
        UserForm1.Hide

    If k > 0 Then ThisWorkbook.Sheets(sheetArray()).PrintPreview
      ActiveWindow.SelectedSheets.PrintPreview

End Sub

Le problème qu'il semble y avoir est le même que je rencontre depuis le début: l'indice n'appartient pas à la sélection....A cette ligne:

If k > 0 Then ThisWorkbook.Sheets(sheetArray()).PrintPreview

C'est l'appel du tableau qui pose problème visiblement.... Pareil, @Steelson ces codes :

'ThisWorkbook.Sheets(myPages()).Select
   'Sheets(myPages()).Select

me renvoient toujours la même erreur : indice n'appartient pas à la sélection.

@BRUNOM45 j'ai aussi tenu compte de tes indications pour la checklist et corrections. Je n'ai pour l'instnat plus de pb de mémoire. Toutefois je rencontre le même pb qu'avec les autres codes ci-dessus... Dans ton code j'ai remplacé :

With ThisWorkbook.Sheets(myPages)

par

With ThisWorkbook.Sheets(myPages())

et rien n'y fait. Ce qui est curieux, c'est que j'ai essayer avec une maquette vide et des feuilles notées de 1 à 19. Ca marchait bien...Même si l'erreur apparaît à cette ligne,

ThisWorkbook.Sheets(myPages())

je me demande si le problème ne vient pas d'ailleurs....

Je vous joins ma maquette test... Merci d'avance.

Vanessa.

4maquette-test.zip (659.99 Ko)

@ Vanessa : J'ajoute que pour ma part j'évite de mettre en "dur" dans une macro des paramètres ... fais la liste dans un onglet, voire liste ces onglets dans la macro sans les nommer un par un. S'il y a d'autres onglets non concernés, le mieux est d'avoir un code pour les reconnaître ... comme ici un chiffre dans le premier caractère du nom d'onglet.

Bingo,

myPages(2) = "2_Liste_Perimetre"

n'existe pas et tu le mentionnes dans ta macro

fais plutôt un test en balayant toutes les pages


autre erreur à mon sens .. tu fais appel à l'indice et pas au nom de la feuille, or elles ne sont pas dans le même ordre et donc tu n'auras pas les bonnes feuilles !

sheetArray(k) = myPages(I)

Ajoute la page 2 et ceci fonctionnera

Private Sub CommandButton3_Click()

Dim myPages(1 To 19), sheetArray() As String
Dim I As Long, k As Long
ReDim sheetArray(1)

myPages(1) = "1_Presentation_1"
myPages(2) = "2_Liste_Perimetre"
myPages(3) = "3_Presentation_2"
myPages(4) = "4_Resultats_Prev"
myPages(5) = "5_Resultats_Sante"
myPages(6) = "6_Resultats_Techniques"
myPages(7) = "7_Provisions"
myPages(8) = "8_Analyses"
myPages(9) = "9_Resultats_C10"
myPages(10) = "10_C10"
myPages(11) = "11_C5"
myPages(12) = "12_Presentation_Graphiques"
myPages(13) = "13_Graph_Prev"
myPages(14) = "14_Graph_Sante"
myPages(15) = "15_Listes_DC_et_PM"
myPages(16) = "16_Liste_Deces"
myPages(17) = "17_Liste_PM"
myPages(18) = "18_Presentation_Lexique"
myPages(19) = "19_Lexique"

    For I = 1 To 19

        If Me.Controls("CheckBox" & I) Then
            ReDim Preserve sheetArray(k)
            sheetArray(k) = myPages(I)
            k = k + 1
        End If

    Next I
        UserForm1.Hide

    If k > 0 Then Sheets(myPages()).PrintPreview
      ActiveWindow.SelectedSheets.PrintPreview

End Sub

Je répète quand même c'est une erreur de mettre 3 fois les mêmes informations : dans les noms d'onglets, dans l'userform et dans la macro.

Et ne confonds pas n° de feuille et nom de feuille, entre I et myPages(I)

Steelson,

Merci pour tes retours. Alors, oui je vais renommer les noms des feuilles au moins dans le formulaire.

Je donnerai la consigne de ne pas modifier le nom des onglets qui feront l'objet d'impression.

Pour l'exemple du lien, je ne sais pas celui dont tu parles précisément. Si c'est la checklist, oui mais j'étais bloquée par la même erreur avant résolution par ta dernière correction. Donc ce code:

For I = 1 To 19

        If Me.Controls("CheckBox" & I) Then
            ReDim Preserve sheetArray(k)
            sheetArray(k) = myPages(I)
            k = k + 1
        End If

    Next I
        UserForm1.Hide

    If k > 0 Then Sheets(myPages()).PrintPreview
      ActiveWindow.SelectedSheets.PrintPreview

me sélectionne bien plusieurs pages et me fait bien l'apercu avant impression....mais seul bémol, toutes mes pages sont sélectionnées du coup!

Vanessa.

Si tu veux, je vais reprendre cela à tête reposée dès que j'ai un moment.

Mon but est de

  1. identifier toutes les feuilles commençant pas un chiffre qui sera le repère des feuilles à sélectionner
  2. lors de la génération de l'userform, reporter ces noms automatiquement sur le formulaire
  3. idem, en tenir compte dans la macro

C'est donc le nom attribué à l'onglet qui drivera le tout. Pas d'autre consignes donc que d'en avoir 19 dont le nom commence par un chiffre ou un nombre de 1 à 19.

For I = 1 To 19

        If Me.Controls("CheckBox" & I) Then
            ReDim Preserve sheetArray(k)
            sheetArray(k) = myPages(I)
            k = k + 1
        End If

    Next I
        UserForm1.Hide

    If k > 0 Then Sheets(myPages()).PrintPreview
      ActiveWindow.SelectedSheets.PrintPreview

mais seul bémol, toutes mes pages sont sélectionnées du coup!.

pour ce soucis, remplace par

If k > 0 Then Sheets(sheetArray()).PrintPreview
      ActiveWindow.SelectedSheets.PrintPreview
Rechercher des sujets similaires à "erreur execution indice appartient pas selection"