Présentation sortie VB: fusion et bordures
Bonjour à tous,
J'ai réalisé une macro qui me sort bien ce que je veux.... c'est à dire les personnes qui doivent encore des heures d'animations.
Je galère pour présenter la réponse. La macro dont il est question est AnimDivers() qui écrit dans "Animations Divers".
J'obtiens cette liste:
Et j'aimerais ça:
Pourriez vous m'aider??? D'autre part, je trouve que ma macro d'affichage est très longue à l'exécution... on peut optimiser??
Merci pour votre écoute.
Bonjour evolto, a tester
Sub CalculerHeuresManquantes()
Dim feuille As Worksheet
Dim ligne As Integer
Dim derniereLigne As Integer
Dim Enseignants As New Collection
Dim Enseignant As Variant
Dim HeuresManquantes As Double
' Référence à la feuille de calcul
Set feuille = ThisWorkbook.Sheets("tableau AP")
' Trouver la dernière ligne dans la colonne D
derniereLigne = feuille.Cells(feuille.Rows.Count, "D").End(xlUp).Row
' Parcourir les lignes de 9 à la dernière ligne
For ligne = 9 To derniereLigne
If feuille.Cells(ligne, 37) <> 0 Then
' Récupérer le nom de l'enseignant
Enseignant = feuille.Cells(ligne, 4).Value
' Récupérer le nombre d'heures à ajouter
HeuresManquantes = feuille.Cells(ligne, 37).Value
' Vérifier si l'enseignant est déjà dans la collection
On Error Resume Next
If Enseignants(Enseignant) = "" Then
' Ajouter l'enseignant à la collection avec le nombre d'heures manquantes
Enseignants.Add HeuresManquantes, Enseignant
Else
' Mettre à jour le nombre d'heures manquantes pour l'enseignant existant
Enseignants(Enseignant) = Enseignants(Enseignant) + HeuresManquantes
End If
On Error GoTo 0
End If
Next ligne
' Afficher les enseignants et leurs heures manquantes
For Each Enseignant In Enseignants
MsgBox Enseignant & " doit encore " & Enseignants(Enseignant) & " heures d'animations."
Next Enseignant
End SubMerci Stéphane pour ton retour...
Si j'ai bien compris, tu me proposes une optimisation de mon code???
En fait, ma principale demande est de présenter mes résultats (en fusionnant les noms d'école identique, faisant un quadrillage léger partout, et un cadre épais pour faire ressortir les blocs "Ecoles"... Je n'ai pas l'impression que ta macro fasse de la présentation dans feuille de sortie...
En tout cas merci de t''être penché sur mon cas...
Bonne soirée
J'ai pas bien compris alors a tester et c'est optimisé et l'autre aussi elle est optimisée
Sub FormaterFeuille()
Dim Feuille As Worksheet
Dim DerniereLigne As Integer
Dim Plage As Range
Dim Cellule As Range
Dim NomEcole As String
' Référence à la feuille de calcul
Set Feuille = ThisWorkbook.Sheets("NomDeVotreFeuille")
' Trouver la dernière ligne en colonne A
DerniereLigne = Feuille.Cells(Feuille.Rows.Count, "A").End(xlUp).Row
' Appliquer un quadrillage léger à toute la feuille
Feuille.Cells.BorderAround xlContinuous, xlThin
Feuille.Cells.Borders.LineStyle = xlContinuous
Feuille.Cells.Borders.Weight = xlThin
' Parcourir les cellules en colonne A et fusionner celles avec le même nom d'école
Set Plage = Feuille.Range("A1:A" & DerniereLigne)
NomEcole = Plage.Cells(1, 1).Value
For Each Cellule In Plage
If Cellule.Value = NomEcole Then
' Fusionner les cellules avec le même nom
Cellule.Offset(0, 1).Resize(1, 5).Merge
Else
' Nouveau nom d'école, ajouter un cadre épais
Cellule.BorderAround xlContinuous, xlThick
NomEcole = Cellule.Value
End If
Next Cellule
End SubTu peux faire la première macro et à la fin de ça de la première macro tu mets le nom de la macro pour formater.
Next Enseignant
FormaterFeuille
End SubApplication.ScreenUpdating = False
Application.ScreenUpdating = True+ ça au début de la première macro et à la fin de la deuxième macro
Merci encore pour ton aide...
Malheureusement ce ne ne fonctionne pas du tout (Cela fusionne horizontalement le nom avec la colonne de droite, mais pas les noms d'école)...
Et cela applique un quadrillage sur toute la feuille... alors que je ne voulais appliquer ce quadrillage qu'aux données ajoutées par la macro sur la feuille.
Aucune des deux macros ne fonctionnennt ni ensemble, ni indépendamment...
Encore merci de t'être penché sur mon petit soucis
bonjour evolto,stepaustras,
comme ceci ?
Sub Fusionner()
Set dict = CreateObject("Scripting.dictionary")
dict.comparemode = vbTextCompare
Application.ScreenUpdating = False
With Sheets("Animations Divers")
On Error Resume Next
.AutoFilter.Range.AutoFilter
On Error GoTo 0
With .Range("A8:A" & .Range("A" & Rows.Count).End(xlUp).Row).Resize(, 18) 'vos données + entête
For i = 2 To .Rows.Count 'boucler la colonne A
s = .Cells(i, 1).Value 'école
If s <> "" And Not dict.exists(s) Then 'nouvelle école ?
dict(s) = 0
.AutoFilter 1, s 'filtrer
b = False
For Each ar In .Offset(1).Resize(.Rows.Count - 1, 1).SpecialCells(xlVisible).Areas
If b = False Then i = i + ar.Rows.Count - 1: b = True
Application.DisplayAlerts = False
ar.Merge 'fusionner
Application.DisplayAlerts = True
For Each brder In Array(xlEdgeBottom, xlEdgeTop) 'ces 2 bordures
ar.Resize(, 20).Borders(brder).Weight = xlMedium
Next
For Each brder In Array(xlInsideHorizontal, xlInsideVertical) 'ces 2 bordures
ar.Resize(, 20).Borders(brder).Weight = xlThin
Next
Next
End If
Next
.AutoFilter
End With
End With
End Subre sauf que je galère avec ces fichus bordures sinon ça fait le job
Sub FusionnerCellulesAvecBordures()
Dim Feuille As Worksheet
Dim DerniereLigne As Long
Dim LigneDebut As Long
Dim LigneFin As Long
Dim i As Long
Dim ValeurPrecedente As Variant
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set Feuille = ThisWorkbook.Sheets("Animations Divers")
DerniereLigne = Feuille.Cells(Feuille.Rows.Count, "A").End(xlUp).Row
LigneDebut = 9 ' Commencer à partir de la ligne 9
ValeurPrecedente = Feuille.Cells(LigneDebut, "A").Value
For i = LigneDebut + 1 To DerniereLigne
If Feuille.Cells(i, "A").Value <> ValeurPrecedente Then
If LigneFin > 0 Then
' Fusionner les cellules et appliquer le contour épais à la plage
With Feuille.Range(Feuille.Cells(LigneDebut, "A"), Feuille.Cells(LigneFin, "A"))
.Merge
.Borders.LineStyle = xlContinuous ' Bordure continue
.Borders.Weight = xlMedium ' Épaisseur des bordures
End With
LigneFin = 0
End If
LigneDebut = i
ValeurPrecedente = Feuille.Cells(i, "A").Value
Else
LigneFin = i
End If
Next i
' Fusionner les dernières cellules si nécessaire et appliquer le contour épais
If LigneFin > 0 Then
With Feuille.Range(Feuille.Cells(LigneDebut, "A"), Feuille.Cells(LigneFin, "A"))
.Merge
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlMedium
End With
End If
' Appliquer des bordures légères aux autres cellules
Feuille.Range("A9:O" & DerniereLigne).Borders.LineStyle = xlContinuous ' Bordure continue
Feuille.Range("A9:O" & DerniereLigne).Borders.Weight = xlThin ' Épaisseur des bordures
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End SubRe bien joué BsAlv,
Merci Bart, ta procédure fonctionne impeccablement le top.
Merci Stéphane aussi