Activer plusieurs onglets dans une macro

Activer plusieurs onglets dans une macro - VB/VBA/VBS - Programmation

Marsh Posté le 17-08-2005 à 09:24:10    

Bonjour à tous,
 
Comment peut-on sélectionner un ou plusieurs onglet d'un fichier Excel, dans une macro sans passer par une fonction "If ... Sheets(Array("feuil2 ..." .  
En fait, en fonction d'un nombre (entre 1 et 10) que j'indique dans un fichier Excel (par l'intermédiaire d'un UserForm), la macro sélectionne le nombre d'onglet défini, et active l'onglet "feuil1" pour rentrer les données (ce qui me permet de renseigner tout les onglets sélectionnés). (voir l'exemple ci-dessous)
 
   ElseIf Range("R5" ) = 2 Then
        Workbooks.Open Filename:="toto.xls"
        Sheets(Array("feuil2_1", "feuil1_2" )).Select
        Sheets("feuil1_1" ).Activate

 
Le problème et que ma macro est trés longue et j'aimerais savoir si il n'y a pas un moyen plus rapide de définir cette fonction.
J'attends vos idées avec impatience ...
 
Merci d'avance,
 
Titoche28


---------------
Titoche28
Reply

Marsh Posté le 17-08-2005 à 09:24:10   

Reply

Marsh Posté le 21-08-2005 à 12:57:55    

Titoche28 a écrit :

Bonjour à tous,
 
 
   ElseIf Range("R5" ) = 2 Then
        Workbooks.Open Filename:="toto.xls"
        Sheets(Array("feuil2_1", "feuil1_2" )).Select
        Sheets("feuil1_1" ).Activate



si j'ai bein compris, lorsque tu sélectionnes la valeur dans r5, tu selectionnes les onglets 1_valeur et valeur_1
je te propose ceci :

Code :
  1. Workbooks.Open Filename:="toto.xls"
  2. Sheets(Array("feuil"&range("r5" ).value&"_1", "feuil1_"&range("r5" ).value)).Select
  3. Sheets("feuil1_1" ).Activate


cela correspond à tes attentes?
bon dimanche :hello:  

Reply

Marsh Posté le 12-09-2005 à 15:34:32    

Bonjour jpcheck,
 
Merci pour l'info, c'est presque ce que je voulais, j'ai essayé et le seul Hic, est que si dans ma case "r5", j'ai 3, il me sélectionne bien l'onglet 1 et 3, mais pas le 2. Du même coup, si j'ai 5 dans "r5", il me selectionne les onglets 1 et 5, mais pas les 2, 3 et 4. Mais c'est un bon début ...
Je te remercie de ton aide...
 
 :)  
 
@+


---------------
Titoche28
Reply

Marsh Posté le 13-09-2005 à 12:38:59    

Salut Titoche,
 
J'ai trouvé une petite astuce pour programmer en VBA ton array sur les feuilles de ton classeur. j'ai pas pris ton exemple de nom de feuilles mais je suis passée par le numérodes feuilles. en l'adaptant tu devrais réussir à faire ta sélection
 
Pour mon exemple j'ai mis en Cellule A5 de la feuille 1 la valeur à écrire, et en B5 de la même feuille le nombre d'onglets à selectioner.
Ce code rempli la cellue B6 des onglets sélectionnés.

Code :
  1. Sub onglet()
  2.      Dim Feuil, i
  3. 'Feuil est le nom de l'array
  4.      Feuil = Array(Sheets(1).Name)
  5. 'redimensioner l'array pour qu'il contienne le nombre de données
  6. 'correspondant au nombre d'onglets voulus
  7. 'Valeur - 1 car array commence à 0
  8.      ReDim Preserve Feuil(Sheets(1).Range("B5" ).Value - 1)
  9. 'Ajout des données dans l'array
  10.      For i = 1 To Sheets(1).Range("B5" ).Value
  11.           Feuil(i - 1) = Sheets(i).Name
  12.      Next i
  13. 'Selection pour remplissage
  14.      Sheets(Feuil).Select
  15.      Sheets(1).Activate
  16.      Range("B6" ).Select
  17.      ActiveCell.Formula = Sheets(1).Range("A5" ).Value
  18. End Sub


 
Bon courage

Reply

Marsh Posté le 09-01-2019 à 14:27:22    

Bonjour,  
 
je reprends ce poste car il s'adapte presque à ce que je veux faire.
 

Citation :

Salut Titoche,
 
J'ai trouvé une petite astuce pour programmer en VBA ton array sur les feuilles de ton classeur. j'ai pas pris ton exemple de nom de feuilles mais je suis passée par le numérodes feuilles. en l'adaptant tu devrais réussir à faire ta sélection
 
Pour mon exemple j'ai mis en Cellule A5 de la feuille 1 la valeur à écrire, et en B5 de la même feuille le nombre d'onglets à selectioner.
Ce code rempli la cellue B6 des onglets sélectionnés.
 
Code :
 
    Sub onglet()
         Dim Feuil, i
    'Feuil est le nom de l'array
         Feuil = Array(Sheets(1).Name)
    'redimensioner l'array pour qu'il contienne le nombre de données
    'correspondant au nombre d'onglets voulus
    'Valeur - 1 car array commence à 0
         ReDim Preserve Feuil(Sheets(1).Range("B5" ).Value - 1)
    'Ajout des données dans l'array
         For i = 1 To Sheets(1).Range("B5" ).Value
              Feuil(i - 1) = Sheets(i).Name
         Next i
    'Selection pour remplissage
         Sheets(Feuil).Select
         Sheets(1).Activate
         Range("B6" ).Select
         ActiveCell.Formula = Sheets(1).Range("A5" ).Value
    End Sub
 
 
 
Bon courage


 
 
Dans ce code les feuilles sélectionnées sont la feuilles d'index 1 jusqu'à la feuille d'index contenu dans la cellule B5 de la feuille Feuil1.
 
Qu'en est-il si on veut sélectionner par exemple la feuille d'index 4 à la feuille d'index 9 par exemple ? Ces valeurs (4 et 9) seront contenues dans des cellules de la feuille Feuil1 par exemple.
 
Merci de votre réponse


Message édité par hmcirta le 09-01-2019 à 14:36:08
Reply

Marsh Posté le 09-01-2019 à 14:35:19    

Bonjour,
 
Et tu veux faire quoi ? Parce que là ça a l'air d'être du grand n'importe quoi ce que je vois...


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 09-01-2019 à 15:19:42    

Bonjour Maybe
 
Merci pour votre reponse.
 
Ce que je veux faire au fait c'est consolider avec VBA via Consolidate Sources:= une plage de cellules d'un nombre de feuilles qui peut être différent à chaque fois, sachant que les feuilles à consolider sont successives.
 
Merci de votre aide


Message édité par hmcirta le 09-01-2019 à 15:24:45
Reply

Marsh Posté le 09-01-2019 à 16:29:16    

Ah ok ce serait pour ça l'intérêt d'utiliser un tableau, mais bon les "select" et "active" sont quand même inutiles.

 

Voici un exemple fonctionnel :

Code :
  1. Sub ConsolidateMacro()
  2.     Dim myMasterSheet As String
  3.     Dim myTarget As Range
  4.     Dim myArray() As String
  5.     Dim i As Integer
  6.     Dim myRange As String
  7.     With ThisWorkbook
  8.         myMasterSheet = Application.ActiveSheet.Name
  9.         Set myTarget = .Sheets(myMasterSheet).Range("A1" )
  10.    
  11.         ReDim myArray(.Windows(1).SelectedSheets.Count - 2)
  12.    
  13.         myRange = "!R1C1:R11C1"
  14.    
  15.         i = 0
  16.         For Each mySheet In .Windows(1).SelectedSheets
  17.             If mySheet.Name <> myMasterSheet Then
  18.                 myArray(i) = mySheet.Name & myRange
  19.                 i = i + 1
  20.             End If
  21.         Next
  22.    
  23.         myTarget.Consolidate _
  24.          Sources:=myArray, _
  25.          Function:=xlSum
  26.     End With
  27. End Sub


1- se mettre sur la feuille maitre
2- sélectionner en plus les feuilles à ajouter dans la consolidation (à l'aide de Ctrl ou Maj.)
3- exécuter la macro

 

Après on peut ajouter des étapes en fonction des besoins pour déterminer la cellule cible et la plage qui sont des paramètres rentrés en dur dans la macro.


Message édité par MaybeEijOrNot le 09-01-2019 à 16:30:15

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 09-01-2019 à 18:20:38    

Après plusieurs tests ça marche impeccable sur un nouveau classeur (je fais un copier/coller de ma plage de cellules de l'un de mes fichier sur un nouveau classeur au même endroit que sur mes fichiers), mais quand je fait ça sur un exemple concret (sur mes fichiers) en adaptant myRange à ma plage de cellules (M13:U45 en R13C13:R45C21) j'ai un soucis sur la ligne  myArray(i) = mySheet.Name & myRange.


Message édité par hmcirta le 09-01-2019 à 18:44:17
Reply

Marsh Posté le 09-01-2019 à 22:53:58    

Tu n'as pas oublié le point d’exclamation ?
Tu te places bien sur la feuille "maître" ?
 
Quelle est l'erreur ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 09-01-2019 à 22:53:58   

Reply

Marsh Posté le 10-01-2019 à 09:43:26    

Oui le point d'exclamation est là, et je me place bien sur la feuille maitre.
 
Et en faisant des tests ce matin la ligne ou ça bloque maintenant est : ReDim myArray(.Windows(1).SelectedSheets.Count - 2)
 
 
   

Reply

Marsh Posté le 10-01-2019 à 09:56:54    

MaybeEijOrNot a écrit :

Quelle est l'erreur ?



---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 10-01-2019 à 16:22:32    

Il m'affiche
 
erreur d’exécution '9'
L'indice n'appartient pas à la sélection

 
 
 
Mais j'ai trouvé la source du problème ... il fallait créer un module dans mon fichier et non pas dans un autre classeur.
 
Donc il faut créer un module dans chaque classeur où doit se faire la consolidation.

Reply

Marsh Posté le 10-01-2019 à 20:11:19    

Oui, je ne suis pas assez expert dans la portée du VBA, cela doit être possible de faire ça dans un seul fichier et de l’exécuter dans les autres mais de toute manière ça demanderait surement de complexifier le script.

 

Là je proposais une solution assez généraliste, évidemment en fonction de la structure des classeurs, et notamment des noms ou de l’agencement des onglets il y a possibilité de faire plus simple et/ou efficace.


Message édité par MaybeEijOrNot le 10-01-2019 à 20:12:57

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 11-01-2019 à 10:20:11    

Bonjour,  
 

Citation :

Oui, je ne suis pas assez expert dans la portée du VBA


En tout cas votre solution je la cherchais depuis un bon moment déjà sans avoir obtenu satisfaction.
 
 
Votre solution est vraiment très satisfaisante et elle est flexible pour sélectionner les feuilles désirées.... Elle répond très bien à mes besoins.
 
Il reste plus qu'à peaufiner le tout dans une table de correspondance et ça sera parfait.
 
Merci de votre aide, et merci surtout d'avoir trouver une solution à mon problème. Ça va me faire gagner un temps énorme.
 
Merci encore.

Reply

Marsh Posté le 13-01-2019 à 14:42:10    

Bonjour,  
 
Encore une petite chose .... Comment désélectionner les autres feuilles pour ne laisser que le feuille "Maitre" active ??

Reply

Marsh Posté le 13-01-2019 à 15:08:55    

Je pense qu'il suffit de resélectionner la feuille maître.
Avant la fin du With, placer :

Code :
  1. .sheets(myMasterSheet).select


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 13-01-2019 à 15:40:26    

Impeccable  !!
 
 
Merci


Message édité par hmcirta le 13-01-2019 à 15:41:00
Reply

Sujets relatifs:

Leave a Replay

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