Microsoft 365 VBA : Déplacer une sélection de feuilles dans un nouveau classeur

WhatIsVBA

XLDnaute Nouveau
Bonjour,

Voici ma situation : j'ai un classeur excel avec plusieurs feuilles dont en particulier :
  1. Feuille nommée Impression qui contient le bouton de démarrage de la macro (c'est donc notre feuille active lors du début de la séquence) ;
  2. Plusieurs feuilless nommées "XXLEAXX", X étant variable ;
  3. D'autres feuilless de données qu'il ne faut pas toucher
Je cherche à sélectionner toutes les feuilles dont le nom contient "LEA" pour les déplacer dans un nouveau classeur. Ce nouveau classeur devra ensuite être enregistré par l'utilisateur. J'ai donc repris la solution proposée dans ce fil par @laurent3372 en l'adaptant à mon besoin (j'ai dû remplacer "sheet" par "worksheet" dans la première ligne car j'avais un message d'erreur) :

VB:
Dim sh As Worksheet
        For Each sh In Worksheets
          If sh.Name Like "*LEA*" Then
                sh.Select False
          End If
        Next sh

Je cherche ensuite à déplacer cette sélection de feuilles dans un nouveau classeur. Mes problèmes sont les suivants ;
  1. La feuille active étant "impression", la solution précédemment citée garde la feuille dans la sélection alors que je ne veux pas qu'elle soit déplacée dans le nouveau classeur. Il faudrait donc désélectionner cette feuille avant de faire la bascule dans un nouveau classeur.
  2. Je ne sais pas comment demander à excel "prendre la sélection actuelle et déplace la dans un nouveau classeur
Pouvez-vous m'aider à comprendre comment mettre tout ça en place, en sachant que je commence à peine en VBA et que je n'ai aucune formation ?

Merci !
 
Solution
Bonjour,
Essayez ce code :
VB:
Sub MoveSh()
Dim Sh As Worksheet, ShArea As Variant
    For Each Sh In Worksheets
        If Sh.Name Like "*LEA*" Then ShArea = ShArea & IIf(ShArea = "", "", ";") & Sh.Name
    Next Sh
    If ShArea <> "" Then
        ShArea = Split(ShArea, ";")
        Worksheets(ShArea).Copy
        MsgBox "Attention" & vbLf & "Vous êtes dans le classeur " & ActiveWorkbook.Name, vbCritical
        ThisWorkbook.Worksheets(ShArea).Delete
    End If
End Sub

fanch55

XLDnaute Barbatruc
Bonjour,
Essayez ce code :
VB:
Sub MoveSh()
Dim Sh As Worksheet, ShArea As Variant
    For Each Sh In Worksheets
        If Sh.Name Like "*LEA*" Then ShArea = ShArea & IIf(ShArea = "", "", ";") & Sh.Name
    Next Sh
    If ShArea <> "" Then
        ShArea = Split(ShArea, ";")
        Worksheets(ShArea).Copy
        MsgBox "Attention" & vbLf & "Vous êtes dans le classeur " & ActiveWorkbook.Name, vbCritical
        ThisWorkbook.Worksheets(ShArea).Delete
    End If
End Sub
 

WhatIsVBA

XLDnaute Nouveau
Bonjour !

Merci beaucoup, ça fonctionne ! En revanche j'essaye de comprendre ce qui est fait, histoire de ne pas copier bêtement un code.

En gros le code nous dit :
Pour chaque feuille dans le classeur,
Si le nom contient "LEA" alors ?? (définition de la variable shArea mais je ne comprends pas ce qui est défini)

Ensuite si ShArea est différent de vide (là on est en train de dire : ne faire l'action que si une valeur a été attribuée à ShArea, on est d'accord ?)
alors on découpe ShArea en plusieurs morceaux (qui correspondent du coup à mes noms de feuille)

Une boite de dialogue qui signale qu'on est passé sur un classeur différent. vbCritical c'est pour afficher la croix d'erreur, c'est ça ?

Enfin dans le classeur d'origine on supprime les feuilles qui ont été copiées.

Dernière question, je vois souvent l'attribution de noms particuliers (comme ShArea par exemple, ou même sh). Est-ce qu'il y a une raison à utiliser ces noms là ? J'imagine qu'on pourrait utiliser ce qu'on veut, par exemple Feuille (à la place de sh) ou NomDeFeuille (à la place de ShArea) ?
 

fanch55

XLDnaute Barbatruc
Si le nom contient "LEA" alors ?? (définition de la variable shArea mais je ne comprends pas ce qui est défini)
ShArea = ShArea & IIf(ShArea = "", "", ";") & Sh.Name

Si ShArea est vide, on y met le nom de la feuille (sh.name), sinon on va rajouter ce nom à Sharea avec ";" en tant que séparateur .
Ce qui va permettre de découper par la suite shArea en indiquant que le séparateur est ";" .

Dernière question, je vois souvent l'attribution de noms particuliers (comme ShArea par exemple, ou même sh). Est-ce qu'il y a une raison à utiliser ces noms là ? J'imagine qu'on pourrait utiliser ce qu'on veut, par exemple Feuille (à la place de sh) ou NomDeFeuille (à la place de ShArea) ?
Bof, il y a beaucoup de conventions dans le codage, conventions que beaucoup ne respectent pas/plus .
En fait ces conventions servent surtout pour des questions de maintenance pour essayer de reconnaitre visuellement le type de variable et ce à quoi il pourrait faire référence .... Tout à fait variable selon les "usines" à développer ....
Ceci dit, il faut bien donner un nom ... Sh = Sheet , ShArea = ensemble de Sheets, mais tout est en fait au gré du développeur ....
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 909
Membres
101 836
dernier inscrit
karmon