Rapport de message :*
 

Re: Tri de tableaux de longueurs variables sur différentes feuilles

Titre du sujet : Re: Tri de tableaux de longueurs variables sur différentes feuilles
par myDearFriend! le 06/08/2009 22:59:57

Bonsoir GGlyon, le Forum,

Tu trouveras ci-joint une proposition pour ta demande, en espérant que j'ai bien interprété tes indications...

N'ayant pas compris pourquoi tu avais scindé le traitement en 3 phases (3 boutons) alors que visiblement elles devaient être lancées successivement, et pour simplifier le code, j'ai rassemblé l'ensemble du traitement (Finance, Commandes et Factures) en une seule procédure "Traitement()" que tu trouveras toujours dans le module de code de la feuille "Finances". L'ensemble se déclenche donc avec l'unique bouton "Actualiser".

Je te laisse prendre connaissance du code VBA utilisé.
Pas franchement convaincu par le choix de certaines de tes variables (je pense notamment à X, Z, n, k par exemple), je les ai toutefois laissées telles quelles pour que tu puisses conserver tes repères dans tout ceci.

Sub Traitement()
'----------------------------------------------------------
'   myDearFriend! - www.mdf-xlpages.com
'   06/08/2009
'----------------------------------------------------------
Dim Sh As Worksheet
Dim DateFinProjet As Date, DateVirement As Date, DateCalendrier As Date, DateCommande As Date, DateFacture As Date
Dim DerniereCommande As Long, DerniereFacture As Long
Dim Virement As Single, CommandeTTC As Single, FactureTTC As Single
Dim i As Byte, k As Byte, n As Byte, X As Byte, Z As Byte

    'On fige l'affichage pour accélérer le traitement
    Application.ScreenUpdating = False
    Range("A4:BI69").ClearContents

    Range("A2:J3").Interior.Color = RGB(40, 215, 90)
    'Mise en forme des dates du calendrier pour que celles qui sont dépassées apparaissent en gris
    For Z = 12 To 83
        With Cells(3, Z)
            DateCalendrier = .Value
            Select Case DateSerial(Year(Date), Month(Date), 1)
            Case Is > DateCalendrier
                .Font.ColorIndex = 16
            Case Is = DateCalendrier
                .Font.ColorIndex = 30
            Case Else
                .Font.ColorIndex = 1
            End Select
        End With
    Next Z

    'Couleurs des tableaux
    For k = 4 To 69 Step 3
        'FINANCE--------------------------------------------------------
        Rows(k).Interior.Color = RGB(200, 255, 110)
        'COMMANDES------------------------------------------------------
        Rows(k + 1).Interior.Color = RGB(255, 255, 255)
        Range(Cells(k + 1, 1), Cells(k + 1, 4)).Merge
        Cells(k + 1, 1).HorizontalAlignment = xlRight
        Cells(k + 1, 1).Value = "Commandes"
        Range(Cells(k + 1, 12), Cells(k + 1, 83)).Font.ColorIndex = 3
        'FACTURES-------------------------------------------------------
        Rows(k + 2).Interior.ColorIndex = 34 'RGB(40, 215, 200)
        Range(Cells(k + 2, 1), Cells(k + 2, 4)).Merge
        Cells(k + 2, 1).HorizontalAlignment = xlRight
        Cells(k + 2, 1).Value = "Factures"
        Range(Cells(k + 2, 12), Cells(k + 2, 83)).Font.ColorIndex = 10
    Next k
   
    X = 4
    'recherche sur chacune des feuilles du classeur
    For Each Sh In Worksheets
        If Sh.Name <> "Finances" And Sh.Name <> "Général" Then
            'Savoir si le projet est encore actif
            DateFinProjet = Sh.Range("B13").Value
            If DateFinProjet > Date Then
                'FINANCES-----------------------------------------------------------
                'Récupérer les infos du projet
                Cells(X, 2).Value = Sh.Range("B7").Value    'Organisme financeur
                Cells(X, 3).Value = Sh.Range("L5").Value    'Acronyme Projet
                Cells(X, 4).Value = Sh.Range("K2").Value    'Année du projet
                Cells(X, 5).Value = Sh.Range("B9").Value    'Référence du projet
                Cells(X, 6).Value = Sh.Range("I2").Value    'Gestion
                Cells(X, 7).Value = Sh.Range("B12").Value   'Date de début de projet
                Cells(X, 8).Value = Sh.Range("B13").Value   'Date de fin de projet
                Cells(X, 9).Value = Sh.Range("B24").Value    'Montant total
                For i = 10 To 30 Step 10
                    If Sh.Cells(40 + i, 4).Value = "UMR" Then
                        Cells(X, 10).Value = Sh.Cells(48 + i, 7).Value
                        Exit For
                    End If
                Next i
                'Partie concernant le versement des subventions
                'Ajouter les infos concernant les référence projets répertoriées
                For n = 29 To 34
                    'Trouver les dates de virement et les sommes correspondantes pour un projet
                    With Sh.Cells(n, 11)
                        If .Value <> "" Then
                            DateVirement = .Value
                            DateVirement = DateSerial(Year(DateVirement), Month(DateVirement), 1)
                            Virement = .Offset(0, 1).Value
                        End If
                    End With
                    'Recherche le mois de la date du virement dans la feuille finance et inscrire le montant
                    For Z = 12 To 83
                        DateCalendrier = Cells(3, Z).Value
                        If DateCalendrier = DateVirement Then
                            Cells(X, Z).Value = Virement
                            Exit For
                        End If
                    Next Z
                Next n
                'COMMANDES----------------------------------------------------------
                'Recherche de la dernière cellule remplie pour les commandes
                DerniereCommande = Sh.Cells(Sh.Rows.Count, 18).End(xlUp).Row
                If DerniereCommande > 153 Then
                    'Parcourir toutes les commandes
                    For n = 154 To DerniereCommande
                        With Sh.Cells(n, 18)
                            DateCommande = .Value
                            DateCommande = DateSerial(Year(DateCommande), Month(DateCommande), 1)
                            CommandeTTC = .Offset(0, 1).Value
                        End With
                        'Recherche le mois dans la feuille finances et inscrire le montant de commande
                        'Si < au premier mois du tableau (< 01/2009)
                        If DateCommande < Cells(3, 12).Value Then
                            Cells(X + 1, 11).Value = Cells(X + 1, 11).Value + CommandeTTC
                        Else
                        'Sinon
                            For Z = 12 To 83
                                DateCalendrier = Cells(3, Z).Value
                                If DateCalendrier = DateCommande Then
                                    Cells(X + 1, Z).Value = Cells(X + 1, Z).Value + CommandeTTC
                                    Exit For
                                End If
                            Next Z
                        End If
                    Next n
                End If
                'FACTURES-----------------------------------------------------------
                'Recherche de la dernière cellule remplie pour les factures
                DerniereFacture = Sh.Cells(Sh.Rows.Count, 28).End(xlUp).Row
                If DerniereFacture > 153 Then
                    'Parcourir toutes les factures
                    For n = 154 To DerniereFacture
                        With Sh.Cells(n, 28)
                            DateFacture = .Value
                            DateFacture = DateSerial(Year(DateFacture), Month(DateFacture), 1)
                            FactureTTC = .Offset(0, 7).Value
                        End With
                        'Recherche le mois dans la feuille finances et inscrire le montant de facture
                        'Si < au premier mois du tableau (< 01/2009)
                        If DateFacture < Cells(3, 12).Value Then
                            Cells(X + 2, 11).Value = Cells(X + 2, 11).Value + FactureTTC
                        Else
                        'Sinon
                            For Z = 12 To 83
                                DateCalendrier = Cells(3, Z).Value
                                If DateCalendrier = DateFacture Then
                                    Cells(X + 2, Z).Value = Cells(X + 2, Z).Value + FactureTTC
                                    Exit For
                                End If
                            Next Z
                        End If
                    Next n
                End If
               
                X = X + 3
            End If
        End If
    Next Sh
    Application.ScreenUpdating = True
End Sub
Même si j'ai essayé de le structurer au mieux, je ne vais pas pouvoir te commenter tout ce code, mais je t'invite à revenir si tu souhaites avoir des explications sur tel ou tel point. N'hésite pas.


Par rapport à ton travail, voici quelques infos qui pourront t'être utiles je pense :

Lorsque tu écris par exemple :
Dim DateFinProjet, DateActuelle, DateVirement As Date
Sache que seule DateVirement est déclarée comme type Date. Les autres (DateFinProjet, DateActuelle) seront de type Variant !
Il te faut impérativement écrire :
Dim DateFinProjet As Date, DateActuelle As Date, DateVirement As Date

Par ailleurs, concernant l'utilisation de la propriété ThisWorkbook ou ActiveWorkbook : comme ton code VBA n'agit que sur le classeur dans lequel se trouve le code lui-même, tu n'as pas besoin d'utiliser cette propriété, elle est implicite. Tu verras que je ne l'ai pas utilisé dans le code ci-dessus.
De plus, comme tu as fait le choix de créer ta procédure de traitement dans le module de code Private de la feuille "Finances", tu n'as pas non plus besoin de faire précéder tes Ranges et autres Cells de l'expression Worksheets("Finances"), cette expression est également implicite puisque tu te trouves dans le module de code de cette feuille.

Cordialement,