Pouvez vous m'aider à modifier mon code Macro

Pickis

XLDnaute Nouveau
Je viens de faire ma première macro tout seul comme un grand :) .
J'y connais pas grand-chose.
Je vous ai mis en pièce jointe le fichier car je voudrais modifier dessus quelques trucs.
Mes tableaux de liste de classes seront variables je n'aurai jamais le même nombre d'élèves.
Que faut-il mettre dans le code pour qu'Excel puisse sélectionner automatiquement du 1er eleve au dernier, et qu'il applique à cette sélection une formule.
En gros comment passer de ça ;
Capture d’écran 2020-01-14 à 18.33.16.png

à ca
Capture d’écran 2020-01-14 à 18.34.32.png

de façon automatique.
 

Pièces jointes

  • Liste Eleves Step1.xlsm
    15.2 KB · Affichages: 30

Dudu2

XLDnaute Barbatruc
Bonjour,

Pour passer de ça à ça il point n'est besoin d'une macro sauf si tu veux quelque chose d'un peu plus sophistiqué qui met automatiquement les bordures sur la liste effective.

En feuille Nom Prenom (ce serait mieux avec Nom Prénom et Liste École) en A2 tu places:
=SI('Liste Ecole'!A2<> "" ; 'Liste Ecole'!A2 & " " & 'Liste Ecole'!B2 ; "")
Et en B2 tu places:
=SI('Liste Ecole'!A2<> "" ; 'Liste Ecole'!C2 ; "")
Puis étends ou copies ces formules sur une hauteur qui correspond au maximum d'élèves de l'école avec une petite marge en plus.
 

Dudu2

XLDnaute Barbatruc
Sinon si tu veux vraiment une macro...
VB:
Option Explicit

Sub NomPrenom()
'
' NomPrenom Macro
'
    Dim DernièreLigneListeEcole As Long
    Dim i As Long
  
    'Suppression de la feuille "Nom Prénom" éventuelle
    On Error Resume Next
    Application.DisplayAlerts = False
    ActiveSheet.Parent.Worksheets("Nom Prénom").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0

    'Ajout d'une feuille
    Sheets.Add After:=ActiveSheet
    ActiveSheet.Name = "Nom Prénom"
  
    'Dernière ligne de la feuille Liste Ecole (Attention ! ne marche pas si une colonne est filtrée)
    DernièreLigneListeEcole = ActiveSheet.Parent.Worksheets("Liste Ecole").Cells(Rows.Count, 1).End(xlUp).Row
  
    'Inhibe l'affichage
    Application.ScreenUpdating = False

    'Copie de toutes les lignes de la feuille "Liste Ecole"
    For i = 1 To DernièreLigneListeEcole
        ActiveSheet.Parent.Worksheets("Liste Ecole").Cells(i, 1).Copy ActiveSheet.Cells(i, 1)
        ActiveSheet.Parent.Worksheets("Liste Ecole").Cells(i, 3).Copy ActiveSheet.Cells(i, 2)
      
        'Ligne titre
        If i = 1 Then
            'Copie des lignes de titre
            ActiveSheet.Columns(1).ColumnWidth = 20.29
            ActiveSheet.Cells(1, 1).Value = "Nom Prénom"
        'Ligne élève
        Else
            ActiveSheet.Cells(i, 1).Value = ActiveSheet.Cells(i, 1).Value & " " & _
                                            ActiveSheet.Parent.Worksheets("Liste Ecole").Cells(i, 2).Value
        End If
    Next i
  
    'Désinhibe l'affichage
    Application.ScreenUpdating = True

End Sub
 

Pickis

XLDnaute Nouveau
Bonsoir Dudu62, ta Macro marche niquel.
Une question :
J'ai mis dans la barre d'outils Excel en mode Bouton t'as macro mais je désire que cette macro puisse fonctionner même sans ouvrir le fichier à partir duquel elle a été créée.
Est ce possible?, (comme un script dans Photoshop.)
 

Dudu2

XLDnaute Barbatruc
Bonjour Pickis,

Qu'elle soit en barre d'outils ou sur un bouton, la Macro ne peut s'exécuter que si sont code est accessible, c'est à dire si le classeur qui la contient est ouvert.

Par contre ce qu'on peut faire, c'est placer cette macro dans un classeur dédié pour ça: il ne possède pas la feuille "Liste Ecole" mais peut travailler sur un autre classeur pour générer la liste.
Il faudra donc l'ouvrir au préalable, puis ouvrir le classeur sans macro qui contient la feuille "Liste Ecole" et cliquer sur l'icône créée dans la barre d'outils pour exécuter la macro.
 

Pièces jointes

  • Générer Liste Élèves.xlsm
    23.3 KB · Affichages: 6
  • Liste Eleves Step1-2.xlsx
    9.2 KB · Affichages: 4

job75

XLDnaute Barbatruc
Bonjour Pickis, Dudu2,

Si le tableau source est dans le fichier "Liste Eleves.xlsx" on peut éviter de l'ouvrir en utilisant cette macro :
VB:
Private Sub Workbook_Activate()
Dim s As Boolean, chemin, fichier$, feuille$, f$, h&
s = Me.Saved 'mémorise l'état
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = "Liste Eleves.xlsx" 'à adapter
feuille = "Liste Ecole" 'à adapter
f = "'" & chemin & "[" & fichier & "]" & feuille & "'!"
h = Val(CStr(ExecuteExcel4Macro("MATCH(""zzz""," & f & "C1)"))) - 1
If h < 0 Then h = 0
Application.ScreenUpdating = False
With Feuil1
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    With .[A2] '1ère cellule de destination, à adapter éventuellement
        If h Then
            With .Resize(h, 2)
                .Columns(1) = "=TRIM(" & f & "A2&"" ""&" & f & "B2)"
                .Columns(2) = "=" & f & "C2"
                .Value = .Value 'supprime les formules
                .Columns(2).Replace 0, "", xlWhole 'supprime les zéros (en cas de cellules vides)
                .Borders.Weight = xlThin 'bordures
            End With
        End If
        .Offset(h).Resize(.Parent.Rows.Count - h - .Row + 1, 2).Delete xlUp    'RAZ en dessous
    End With
    .Columns.AutoFit 'ajustement largeurs
    With .UsedRange: End With 'ajuste la barre de défilement verticale
End With
If s Then Me.Saved = True 'évite l'invite à la fermeture si aucune modification
End Sub
Elle est placée dans le ThisWorkbook du fichier de destination et s'exécute quand ce fichier est activé.

Téléchargez les fichiers joints dans le même dossier (le bureau).

Edit : il y avait une coquille dans la macro, j'ai corrigé.

Bonne journée.
 

Pièces jointes

  • Nom Prénom(1).xlsm
    18.8 KB · Affichages: 2
  • Liste Eleves.xlsx
    9.2 KB · Affichages: 2
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour job75,
Cette approche est intéressante car elle permet de lire dans un classeur fermé.
Elle implique, si je ne divague pas, que la liste des élèves générée "Nom Prénom" est sur un classeur destination différent du classeur source "Liste Ecole".

Une autre option dans la 1ère version serait dans la macro, non pas de copier "Liste Ecole" vers "Nom prénom" mais de générer les formules et la ou les MFC dont on parle plus haut, de sorte que toute modification dans "Liste Ecole" serait, grâce aux formules, répercutée automatiquement dans "Nom prénom".

Selon ses besoins, à Pickis de voir ce qui lui convient le mieux.
 

Pickis

XLDnaute Nouveau
Merci a vous 2 pour vos réponses et vos solutions que j'ai lu et relu pour bien assimiler.
Dudu t'as méthode marche niquel.
Pour Job plus intéressant effectivement car gains de temps, mais quand je rajoute des élèves il m'enlève de façon systématique la dernière ligne.
 
Dernière édition:

Pickis

XLDnaute Nouveau
Apres plusieurs utilisation, la solution de Dudu me va mieux car elle verrouille bien et évite les erreurs.

Alors maintenant j'aimerai passer à la phase 2 ! :)
Serai t il possible qu'une fois la liste nom prénom est créé, on puisse l'éclater.
En gros si la liste comporte 4 classes, peut un créer ensuite une liste par classe, soit 4 listes (bien sur utiliser la Colonne C comme référence).
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Voilà le fichier.
Comme je ne savais pas si tu voulais quand même conserver la colonne DIV après le split j'ai mis une constante Private Const GénérerColonneDIV = True à définir True ou False selon ton choix.
 

Pièces jointes

  • Générer Liste Élèves.xlsm
    23.8 KB · Affichages: 5

Discussions similaires

Statistiques des forums

Discussions
312 273
Messages
2 086 702
Membres
103 376
dernier inscrit
marionromeo