Comment sélectionner des onglets à partir d'une variable

Comment sélectionner des onglets à partir d'une variable - VB/VBA/VBS - Programmation

Marsh Posté le 14-05-2014 à 12:00:08    

Bonjour,  
 
Je travaille sous Excel et j'essaie de programmer une sélection d'onglet à partir d'une variable (onglet). L'erreur "l'indice n'appartient pas à la sélection" apparaît pour la dernière ligne de commande :
 
Sub TEST()
 
Dim onglet As String
 
onglet = "1, 2"
 
Sheets(Array(onglet)).Select
 
End Sub
 
Je pense que c'est un problème de type de données. Est-ce que quelqu'un peut m'aider sur ce problème. Merci d'avance

Reply

Marsh Posté le 14-05-2014 à 12:00:08   

Reply

Marsh Posté le 14-05-2014 à 13:37:22    

Salut,  
Tu n'étais pas bien loin en effet.
Le Array va renvoyer à une variable de type variant, à partir d'arguments (arglist). onglet ne peut donc être string.
 
Essaie comme ça:
 

Code :
  1. Sub Select_Onglet()
  2. Dim onglet As Variant
  3. onglet = Array(1, 2, 3)
  4. Sheets(onglet).Select
  5. End Sub

 
 
Au plaisir


Message édité par Laebruhtra le 14-05-2014 à 13:37:46

---------------
Mon topal ACH/VDS
Reply

Marsh Posté le 14-05-2014 à 14:13:23    

 
           Bonjour,
 
           qui plus est peut se faire directement sans variable …
 

Reply

Marsh Posté le 14-05-2014 à 14:30:53    

Merci Laebruhtra pour ta réponse mais cela m'amène à un autre souci :
Ma variable dépend de conditions : En fait, selon les valeurs de certaines cellules je dois imprimer certains onglets.
Voici ci dessous mon programme complet. l'onglet 1 doit être toujours imprimé et les autres onglets dépendent de la valeur des cellules "RESULTxx".
J'ai par ce fait créer une variable de type string.
 
Sub impression()
 
'Création de la variable onglet
 
Dim onglet As String
 
onglet = "1"
 
'Conditions pour la sélection des onglets
 
If Range("RESULT1" ).Value <> 0 Then
onglet = onglet & ", 2"
End If
 
If Range("RESULT2" ).Value <> 0 Then
onglet = onglet & ", 3"
End If
 
If Range("RESULT3" ).Value <> 0 Then
onglet = onglet & ", 4"
End If
 
'etc.......
 
Sheets(onglet).Select
 
'Impression
 
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
        IgnorePrintAreas:=False
 
'Réinitialisation des onglets
 
Sheets(Array(1)).Select
 
End Sub
 
Sincères salutations

Reply

Marsh Posté le 14-05-2014 à 15:37:48    

 
           En fait, il y a maldonne dès la ligne n° …  Ah zut !  Le code n'a pas été balisé !
 
           Merci d'éditer le message et de baliser le code grâce à l'icône dédiée conformément aux règles du forum …
 

Reply

Marsh Posté le 15-05-2014 à 07:50:44    

Désolé, je suis nouveau, je n'ai pas encore l'habitude des us et coutumes de ce site. Voici le code balisé :
 

Code :
  1. Sub impression()
  2. 'Création de la variable onglet
  3. Dim onglet As String
  4. onglet = "1"
  5. 'Conditions pour la sélection des onglets
  6. If Range("RESULT1" ).Value <> 0 Then
  7. onglet = onglet & ", 2"
  8. End If
  9. If Range("RESULT2" ).Value <> 0 Then
  10. onglet = onglet & ", 3"
  11. End If
  12. If Range("RESULT3" ).Value <> 0 Then
  13. onglet = onglet & ", 4"
  14. End If
  15. 'etc.......
  16. Sheets(onglet).Select
  17. 'Impression
  18.     ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
  19.         IgnorePrintAreas:=False
  20. 'Réinitialisation des onglets
  21. Sheets(Array(1)).Select
  22. End Sub

Reply

Marsh Posté le 15-05-2014 à 16:17:28    

   
           Un tableau (Array) est nécessaire mais du texte est utilisé …   La fonction  Split   convertit le texte en tableau :
 

Code :
  1. Sub Impression()
  2.     Onglet$ = "1"
  3.     For N = 1 To 4
  4.         If Range("RESULT" & N).Value <> 0 Then Onglet = Onglet & " " & N + 1
  5.     Next
  6.     Worksheets(Split(Onglet)).Select
  7.     ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
  8.     Worksheets(1).Select
  9. End Sub

Reply

Marsh Posté le 20-05-2014 à 12:42:02    

Marc L a écrit :

   
           Un tableau (Array) est nécessaire mais du texte est utilisé …   La fonction  Split   convertit le texte en tableau :
 

Code :
  1. Sub Impression()
  2.     Onglet$ = "1"
  3.     For N = 1 To 4
  4.         If Range("RESULT" & N).Value <> 0 Then Onglet = Onglet & " " & N + 1
  5.     Next
  6.     Worksheets(Split(Onglet)).Select
  7.     ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
  8.     Worksheets(1).Select
  9. End Sub



 
Merci, pour ton aide mais j'ai un message d'erreur qui apparait :
J'ai retranscrit ton programme, je l' ai adapté à mes besoins ça donne ceci :

Code :
  1. Sub Impression()
  2. 'Création de la variable onglet
  3.     Dim onglet As String
  4.    
  5.     onglet$ = "1"
  6. 'Conditions pour la sélection des onglets
  7.     For N = 1 To 25
  8.         If Range("RESULT" & N).Value <> 0 Then onglet = onglet & " " & N + 1
  9.     Next
  10. ' A effacer
  11. MsgBox onglet
  12.     Worksheets(Split(onglet)).Select
  13. 'Impression
  14.     ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
  15.         IgnorePrintAreas:=False
  16. 'Réinitialisation des onglets
  17.     Worksheets(1).Select
  18. End Sub


 
Cela donne ceci en message box : 1 2 3 5
Et lorsque je valide la box, le message d'erreur apparaît : Erreur d'exécution "9" : L'indice n'appartient pas à la sélection
La ligne 21 se met en surbrillance. Est-ce un problème de format ? ou ne dois-je pas utiliser le format string en ligne 5 ?

Reply

Marsh Posté le 20-05-2014 à 16:57:29    

 
           Autant pour moi, mea culpa !
 
           En fait quand le tableau renvoyé est de type String, VBA s'attend aux noms des feuilles et non à pas leurs numéros (Index) :
 

Code :
  1. Sub Impression()
  2.     Onglet$ = Worksheets(1).Name
  3.  
  4.     For N = 1 To 25
  5.         If Range("RESULT" & N).Value <> 0 Then Onglet = Onglet & "¤" & Worksheets(N + 1).Name
  6.     Next
  7.  
  8.     Worksheets(Split(Onglet, "¤" )).Select
  9.     ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
  10.     Worksheets(1).Select
  11. End Sub

           Le Dim est inutile car déjà compris dans la ligne n°2 (sauf si contrainte instruction Option Explicit) …
 
           Effectuer un double clic dans le cadre du code avant de procéder à sa copie …
 

Reply

Marsh Posté le 20-05-2014 à 17:18:04    

Marc L a écrit :

 
           Autant pour moi, mea culpa !
 
           En fait quand le tableau renvoyé est de type String, VBA s'attend aux noms des feuilles et non à pas leurs numéros (Index) :
 

Code :
  1. Sub Impression()
  2.     Onglet$ = Worksheets(1).Name
  3.  
  4.     For N = 1 To 25
  5.         If Range("RESULT" & N).Value <> 0 Then Onglet = Onglet & "¤" & Worksheets(N + 1).Name
  6.     Next
  7.  
  8.     Worksheets(Split(Onglet, "¤" )).Select
  9.     ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
  10.     Worksheets(1).Select
  11. End Sub

           Le Dim est inutile car déjà compris dans la ligne n°2 (sauf si contrainte instruction Option Explicit) …
 
           Effectuer un double clic dans le cadre du code avant de procéder à sa copie …
 


 
Ah merci beaucoup, ça fonctionne, j'ai été cependant obligé de rajouter le Dim. Et remerci pour avoir utiliser un peu de votre temps à mon problème.
 
Sincères salutations

Reply

Marsh Posté le 20-05-2014 à 17:18:04   

Reply

Marsh Posté le 13-08-2015 à 16:40:41    

Une autre proposition de solution qui fonctionne. :)  
Par exemple, pour copier les onglets qui commencent par "1", puis "2", puis"3"...
 

Code :
  1. Sub test()
  2. Dim MyArray() As String
  3. Dim FileName As String
  4. Dim ws As Worksheet
  5. Dim WB As Workbook
  6. Dim taille, i, X As Integer
  7. '(...)
  8. For i = 1 To 5
  9.     taille = 0
  10.     X = 0
  11.    
  12.     'Dimensionne le tableau à la bonne taille
  13.     For Each ws In Worksheets
  14.         If Left(ws.Name, 1) = CStr(i) Then
  15.             ReDim MyArray(taille)
  16.             taille = taille + 1
  17.         End If
  18.     Next
  19.    
  20.     'Alimente le tableau avec le nom de chaque onglet
  21.     For Each ws In Worksheets
  22.         If Left(ws.Name, 1) = CStr(i) Then
  23.             MyArray(X) = ws.Name
  24.             X = X + 1
  25.         End If
  26.     Next
  27.    
  28.     If X <> 0 Then
  29.         FileName = "C:\Users\Public\Documents\Onglets_" & CStr(i) & ".xlsx"
  30.    
  31.         Sheets(MyArray).Copy
  32.         ActiveWorkbook.SaveAs FileName:=FileName _
  33.             , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
  34.         ActiveWindow.Close
  35.     End If
  36.        
  37. Next
  38. End Sub


Message édité par nicolasvba le 14-08-2015 à 09:08:38

---------------
La cuillère n'existe pas
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed