IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Un problème de boucles


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut Un problème de boucles
    Bonjour à tous,

    j'en appelle à votre aide pour arriver à automatiser une tâche.
    Sur la première feuille de mon classeur se trouve une liste d'élèves et la classe correspondante.

    la macro consiste à créer une feuille d'émargement en listant les élèves d'une classe.

    Un userform me permet de sélectionner la classe pour laquelle je souhaite créer une feuille d'émargement.

    Ca fonctionne comme il faut si je sélectionne une seule classe MAIS je voudrais pouvoir sélectionner plusieurs classes (souvent toutes) pour pouvoir imprimer les feuilles d'émargement correspondantes.

    Je ne parviens pas à créer la boucle qui permettrait de sélectionner chaque classe , d'imprimer et de passer à la classe suivante.

    J'ai essayé les boucles for Next et Do Loop dans tous les sens possibles !

    Merci pour votre aide.

    Pardonnez des réponses tardives, j'ai très très peu de réseau chez moi.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut autre piste de réflexion
    Bonjour à tous,

    serait-il envisageable de procéder comme suit ?:

    1 Affichage de mon USF
    2 Saisie du titre
    3 Affichage si besoin de la date
    4 Sélection des classes à traiter

    et maintenant ça se complique !
    5 Sélection des élèves sur la base de données feuille 1 en fonction des classes sélectionnées
    6 Copie des informations dans un tableau à 2 dimensions ? 3 dimensions (1 par classe)
    7 impression des données des tableaux.
    fin

    Cette manière de procéder me permettrait je crois d'éviter la boucle qui me pose problème.
    J'ai réalisé précédemment un macro qui utilise une feuille par classe et qui l'imprime.
    Ca fonctionne mais c'est peu agréable à utiliser en raison des allers retours incessant entre les feuilles du classeur.
    qu'en pensez vous ?

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ca fonctionne mais c'est peu agréable à utiliser en raison des allers retours incessant entre les feuilles du classeur.
    Ce que vous décrivez là, provient certainement des méthodes Select, Activate que vous utilisez sans doutes dans votre code.
    En VBA ces méthodes sont inutiles et chronophages
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut
    Bonjour,
    Oui, c'est bien ainsi que j'avais procédé.
    Mais comment faire autrement qu'en activant les feuilles sur lesquelles on souhaite travailler ?
    Getobject? Je ne l'ai jamais utilisé, je continue à chercher.
    Merci pour cette piste.

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai relu vos explications et je pense avoir compris ce que vous vouliez faire.

    Voici un classeur exemple avec un code qui si j'ai bien compris votre demande doit faire ce que vous souhaitez.

    Organisation des données

    Le classeur contient trois feuilles (voir illustration en-dessous) dont la propriété CodeName (entre parenthèses dans la liste ci-dessous) est utilisée dans le programme. La liste des élèves (en bleu) et la table de mapping (en orange) sont des tableaux structurés
    • Liste des élèves (shtStudent) contient la table nommée t_Student
    • Parameter (shtParameter) contient la table de mapping nommée t_Usf permettant de renommer les contrôles CheckBox du UserForm (la 2ème colonne contient le n° des CheckBox) et la plage nommée areaCriteria qui est la zone des critères utilisée pour le filtre avancé (AdvancedFilter)
    • Modèle (shtTemplate) contient la zone d'exportation (areaTarget) qui permet d'exporter la liste des élèves par classe


    Nom : 220921 dvp Liste des élèves.png
Affichages : 262
Taille : 47,7 Ko

    UserForm

    Le formulaire contient cinq CheckBox nommés CheckBox1...CheckBox5 et sont renommés par le programme du nom des classes et deux CommandButton (ANNUL

    Nom : 220921 dvp UserForm.png
Affichages : 263
Taille : 4,3 Ko

    Le UserForm ne contient que les procédures événementielles des deux CommandButton et une variable publique nommée IsValidated

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
    Public IsValidated As Boolean
     
    Private Sub cmdOk_Click()
     IsValidated = True
     Me.Hide
    End Sub
     
    Private Sub cmdCancel_Click()
     Me.Hide
    End Sub
    Procédures du module standard
    • Le module standard nomme mMain contient deux procédures
    • la principale nommée Main modifie les propriété des CheckBox du UserForm après validation des sélections effectue une boucle sur les CheckBox sélectionnés et exporte la liste des élèves dans la feuille modèle (shtTemplate) et exporte la feuille remplie dans un nouveau classeur
    • la seconde nommée CopySheet est une fonction générique qui a pour but de copier des feuilles dans un nouveau classeur et renvoie l'objet dans lequel les feuilles copiées se trouvent


    Main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Sub Main()
     ' Déclaration des variables et constantes
     Const TableStudent As String = "t_Student" ' Table des étudiants
     Const TableUsfPilot As String = "t_Usf"    '
     Const TemplateName As String = "Template"
     Dim rngData As Range      ' plage des données
     Dim rngCriteria As Range  ' plage des critères
     Dim rngTarget As Range    ' plage d'exportation
     Dim wkbTarget As Workbook ' Classeur cible
     Dim tbl As Variant
     Dim Elem As Byte
     ' Assignation des variables objets
     Set rngData = Range("t_Student").CurrentRegion
     Set rngCriteria = Range("areaCriteria")
     Set rngTarget = Range("areaTarget")
     ' Chargement de la table
     tbl = Range("t_Classe").Value
     ' Start
     With usfStd
      ' Changement des propriétés des ChackBox
      For Elem = LBound(tbl) To UBound(tbl)
      .Controls("CheckBox" & Elem).Caption = tbl(Elem, 1)
      Next
      ' Lancement du UserForm
      .Show
      ' Après Retour par Cancel ou confirmation
      If .IsValidated Then
         Application.ScreenUpdating = False
         For Elem = LBound(tbl) To UBound(tbl)
           If .Controls("CheckBox" & Elem).Value Then
              rngCriteria.Offset(1).Resize(1).Value = tbl(Elem, 1)
              ' Exportation des données suivant critères vers la feuille shtTemplate
              rngData.AdvancedFilter Action:=xlFilterCopy, _
                                      CriteriaRange:=rngCriteria, _
                                      CopyToRange:=rngTarget
              ' Copie de la feuille template vers un nouveau classeur en renommant la feuille
              Set wkbTarget = CopySheet(shtTemplate, wkbTarget)
              ActiveSheet.Name = tbl(Elem, 1)
           End If
         Next
      End If
     End With
     Unload usfStd         ' fermeture du UserForm
     ' Fin du programme
     Application.ScreenUpdating = True
     Set wkbTarget = Nothing: Set rngData = Nothing: Set rngCriteria = Nothing: Set rngTarget = Nothing
    End Sub
    CopySheet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function CopySheet(oSheet As Worksheet, Optional oWkb As Workbook) As Workbook
      ' Fonction de copie d'une feuille vers  un classeur
      ' Renvoie le nom du classeur
      ' Arguments
      ' oSheet  objet feuille à copier
      ' [oWkb]  objet classeur où doit être copié la feuille
      '               si Nothing création la feuille est copiée dans un nouveau classeur
      ' philippe tulliez www.magicoffice.be
      If oWkb Is Nothing Then
         oSheet.Copy: Set CopySheet = ActiveSheet.Parent
       Else
         oSheet.Copy before:=oWkb.Sheets(1): Set CopySheet = oWkb
      End If
    End Function
    Documentation

    Tutoriels et billets sur les matières utilisées dans l'exemple, à lire éventuellement


    Comme tous les codes que je publie, celui-ci a fait l'objet de tests mais il est toujours possible que quelque chose m'ait échappé.
    Fichiers attachés Fichiers attachés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 510
    Par défaut
    Salut le fil,
    Bon Philippe a été bien plus rapide que moi
    Une autre façon de voir les choses, je travaille avec des tableaux structurés, J'ai un peu modifier le formulaire, à voir si cela te convient. j'ai mis la possibilité d'enregistrer les feuilles au format PDF dans un répertoire sélectionné à l'avance.
    La feuilles paramètres et les noms systèmes sont cachés il faut passer par VBE pour les afficher. J'ai pas tout tester possibilité de bug...

    Voilà bonne prog.

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut
    Bonjour Philippe, bonjour Altraze,

    Un grand merci pour votre aide.
    Je vais grandement progresser en essayant de comprendre vos propositions.
    j'attends un peu avant de marquer la discussion comme résolue.

    à bientôt.

Discussions similaires

  1. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  2. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39
  3. Problème de boucle
    Par TheUltimaSephiroth dans le forum C
    Réponses: 8
    Dernier message: 10/10/2005, 13h58
  4. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  5. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo