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.
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.
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
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
Ensuite tu dois modifier également la propriété "Multiselect" en la mettant sur fmMultiSelectMulti
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.
Vanessa,
as-tu essayé aussi l'exemple posté ici https://forum.excel-pratique.com/excel/erreur-d-execution-9-indice-n-appartient-pas-a-la-selection-1... ?
@ 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
- identifier toutes les feuilles commençant pas un chiffre qui sera le repère des feuilles à sélectionner
- lors de la génération de l'userform, reporter ces noms automatiquement sur le formulaire
- 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