Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3044 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2227965
courcelpip​of
Posté le 14-05-2014 à 12:00:08  profilanswer
 

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

mood
Publicité
Posté le 14-05-2014 à 12:00:08  profilanswer
 

n°2227982
Laebruhtra
Posté le 14-05-2014 à 13:37:22  profilanswer
 

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
n°2227991
Marc L
Posté le 14-05-2014 à 14:13:23  profilanswer
 

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

n°2227997
courcelpip​of
Posté le 14-05-2014 à 14:30:53  profilanswer
 

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

n°2228027
Marc L
Posté le 14-05-2014 à 15:37:48  profilanswer
 

 
           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 …
 

n°2228085
courcelpip​of
Posté le 15-05-2014 à 07:50:44  profilanswer
 

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

n°2228136
Marc L
Posté le 15-05-2014 à 16:17:28  profilanswer
 

   
           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

n°2228497
courcelpip​of
Posté le 20-05-2014 à 12:42:02  profilanswer
 

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 ?

n°2228543
Marc L
Posté le 20-05-2014 à 16:57:29  profilanswer
 

 
           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 …
 

n°2228547
courcelpip​of
Posté le 20-05-2014 à 17:18:04  profilanswer
 

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

mood
Publicité
Posté le 20-05-2014 à 17:18:04  profilanswer
 

n°2264365
nicolasvba
Salut ! VBA bien ?
Posté le 13-08-2015 à 16:40:41  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[python] nom de champ d'un dictionnaire en variable$variable[col1] fonctionne avec PHP5.2 mais pas en 5.3
problème pour inserer des données dans une table à partir d'un JframeVBA simple : comment faire une série d'identifiant à partir d'un chiff
manipuler le web a partir des graphes ( en c++ )variable dans levariable dans le Filtrer /filtres textuels /contient
passage d'une variable dans une autre FormMacro cpier/coller differents onglets
la variable $_Récupérer variable colonne tableau Batch
Plus de sujets relatifs à : Comment sélectionner des onglets à partir d'une variable


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR