XL 2016 Pb de tri et sous totaux

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Gestionnaire_rh

XLDnaute Nouveau
Bonjour tous le monde,
Je pense avoir bien avancé sur mon sujet, reste juste le tri et sous totaux qui ne fonctionne toujours pas
VB:
Sub RemplirBalanceAvecFeuilles()
    Dim wsBalanceN As Worksheet
    Dim wsBalanceN_1 As Worksheet
    Dim wsDest As Worksheet
    Dim i As Long
    Dim DernLigne As Long
    Dim feuilleNom As String
    Dim montantN As Double
    Dim montantG As Double
    Dim difference As Double
    Dim lastRow As Long
    Dim LastRowDest As Long
    Dim compteRecherche As String
    Dim cell As Range
    Dim dataIndex As Long
    Dim rowData(1 To 10) As Variant
    Dim destRow As Long
    
    Dim lastRowDict As Object
    Set lastRowDict = CreateObject("Scripting.Dictionary")
    
    ' Définir les feuilles de travail (Balance N et Balance N-1)
    Set wsBalanceN = ThisWorkbook.Sheets("Balance N")
    Set wsBalanceN_1 = ThisWorkbook.Sheets("Balance N-1")
    
    ' Trouver la dernière ligne non vide de la colonne A dans la feuille Balance N
    lastRow = wsBalanceN.Cells(wsBalanceN.Rows.Count, "A").End(xlUp).Row
    
      For i = 2 To lastRow
        ' Vérifier si la colonne K est positive ou égale à 0, puis récupérer le nom de la feuille
        If wsBalanceN.Cells(i, 11).Value >= 0 Or (wsBalanceN.Cells(i, 11).Value < 0 And UBound(Split(wsBalanceN.Cells(i, 12).Value, "/")) = 0) Then 
            feuilleNom = wsBalanceN.Cells(i, 14).Value 
        Else 
            feuilleNom = wsBalanceN.Cells(i, 15).Value 
        End If
        
        ' Définir la feuille de destination
        On Error Resume Next
        Set wsDest = ThisWorkbook.Sheets(feuilleNom)
        On Error GoTo 0
        
        ' Vérifier si la feuille de destination existe
        If wsDest Is Nothing Then
            MsgBox "La feuille " & feuilleNom & " n'existe pas.", vbCritical
            GoTo NextIteration
        End If
        
        ' Ajouter les en-têtes dans la ligne 10 si ce n'est pas déjà fait
         If wsDest.Cells(10, 1).Value <> "A10" Then
            wsDest.Cells(10, 1).Value = "A10"
            wsDest.Cells(10, 2).Value = "Account Name"
            wsDest.Cells(10, 3).Value = "Pre-adjusted"
            wsDest.Cells(10, 4).Value = "Adjustments"
            wsDest.Cells(10, 5).Value = "Adjusted Current Year"
            wsDest.Cells(10, 6).Value = "Interim"
            wsDest.Cells(10, 7).Value = "Prior Year"
            wsDest.Cells(10, 8).Value = "Variance"
            wsDest.Cells(10, 9).Value = "In %"
            wsDest.Cells(10, 10).Value = "J10"
            wsDest.Cells(10, 11).Value = "K10"
            wsDest.Cells(10, 12).Value = "Xref"
        End If
        
        ' Collecter les données pour cette ligne
        rowData(1) = wsBalanceN.Cells(i, 1).Value ' Colonne A (Numéro de compte)
        rowData(2) = wsBalanceN.Cells(i, 2).Value ' Colonne B (Valeur correspondante)
        rowData(3) = CDbl(wsBalanceN.Cells(i, 11).Value) ' Colonne K
        rowData(4) = 0 ' Colonne D vide
        rowData(5) = CDbl(rowData(3) + rowData(4)) ' Colonne E (C+D)
        rowData(6) = "" ' Colonne F vide
        rowData(10) = wsBalanceN.Cells(i, 12).Value
        ' Recherche du montant dans la Balance N-1 basé sur la colonne A (Numéro de compte)
        compteRecherche = rowData(1) ' Numéro de compte dans Balance N
        Set cell = wsBalanceN_1.Range("A2:A" & wsBalanceN_1.Cells(wsBalanceN_1.Rows.Count, "A").End(xlUp).Row).Find(compteRecherche, LookIn:=xlValues, LookAt:=xlWhole)
        
        ' Si trouvé, récupérer la valeur correspondante de la colonne K de la Balance N-1
        If Not cell Is Nothing Then
            montantG = cell.Offset(0, 10).Value ' Colonne K de Balance N-1 (colonne A + 10 = colonne K)
            rowData(7) = CDbl(montantG) ' Colonne G
        Else
            rowData(7) = "Non trouvé" ' Si non trouvé, afficher "Non trouvé"
        End If
        
        ' Calculer la différence entre E et G (H = E - G)
        montantN = rowData(5)
        rowData(8) = CDbl(rowData(5) - rowData(7))
        'rowData(8) = difference ' Colonne H
        
        ' Utiliser la fonction SI pour gérer l'erreur de division par zéro pour le taux d'erreur (Colonne I)
        If rowData(7) <> 0 Then
           rowData(9) = rowData(8) / rowData(7)
        Else
           rowData(9) = "" ' Erreur si G = 0
        End If
        
        ' Vérifier et récupérer la dernière ligne disponible de la feuille de destination
        If Not lastRowDict.exists(feuilleNom) Then
            lastRowDict.Add feuilleNom, 11 ' Si c'est la première ligne, commencer à la ligne 11
        End If
        
        ' Incrémenter la dernière ligne pour cette feuille
        DernLigne = lastRowDict(feuilleNom)
        
        ' Insérer les données collectées dans la feuille de destination
        
        'wsDest.Rows("11:250").Delete shift:=xlUp
                
        wsDest.Cells(DernLigne, 1).Value = rowData(1)
        wsDest.Cells(DernLigne, 2).Value = rowData(2)
        wsDest.Cells(DernLigne, 3).Value = CDbl(wsBalanceN.Cells(i, 11).Value)
        wsDest.Cells(DernLigne, 4).Value = 0
        wsDest.Cells(DernLigne, 5).Value = CDbl(rowData(3) + rowData(4))
        wsDest.Cells(DernLigne, 6).Value = 0
        wsDest.Cells(DernLigne, 7).Value = rowData(7)
        wsDest.Cells(DernLigne, 8) = CDbl(rowData(5) - rowData(7))
        wsDest.Cells(DernLigne, 9) = rowData(9)
        wsDest.Cells(DernLigne, 12) = rowData(10)
        
    ' Mettre à jour la dernière ligne pour cette feuille
      lastRowDict(feuilleNom) = DernLigne + 1
NextIteration:
      Next i
    
' Déterminer la dernière ligne dans la colonne A avec des données
    destRow = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Row

    wsDest.Sort.SortFields.Clear
    
    ' Appliquer le filtre automatique à la plage incluant l'en-tête
    'wsDest.Range("A10:L" & destRow).AutoFilter Field:=12, Criteria1:="<>", Operator:=xlFilterValues

    wsDest.Sort.SortFields.Add key:=wsDest.Range("L10:L" & destRow), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    
    ' Effectuer le tri
    With wsDest.Sort
        .SetRange wsDest.Range("A10:L" & destRow)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ' Application des sous-totaux
   wsDest.Range("A10:L" & destRow).Subtotal GroupBy:=12, _
       Function:=xlSum, _
       TotalList:=Array(3, 4, 6, 7), _
       Replace:=True, _
       PageBreaks:=False
End Sub
 
Bonjour,

Mlagré que j'ai retiré beaucoup informations et feulles pour l'alleger, j'arrive tojours pas a joindre le fichier.

Malgré le fait que j'ai retiré beaucoup d'informations et de feuilles pour alléger le fichier, je n'arrive toujours pas à le joindre.
Je peux fournir tout le code du fichier si cela peut aider à mieux comprendre mon problème.
 
J'en profite pour poser la question suivante
est ce que c'est gênant si je te propose une solution à base de Tables Structurées? (plus facile à gerer pour l'ajout de lignes)

et peux tu aussi expliqure l'utilisation du fichier?
les onglets Balance N et N-1 sont remplis comment? par une extraction? un copier coller?
ensuite, je crois voir que les autres onglets D, V, ... sont des extractions des balances..??
 
en attendant.. une 1ere grosse simplification de ta première macro

VB:
Sub RechercherEtRécupérer()
    Dim WsParam As Worksheet
    Dim WsBalanceN As Worksheet
    Dim WsBalanceN_1 As Worksheet
    Dim numCompte As String
    Dim resultD As Variant
    Dim resultF As Variant
    Dim compteRecherche As String
    Dim found As Boolean
    Dim balanceRow As Long
    Dim i As Long
    Dim lastRow As Long
    Dim valuesL As Variant
    Dim valuesM As Variant
    Dim valueR As Variant
    Dim indexValue As Variant
    
    ' Définir la feuille de travail (Paramétrage des leads)
    Set WsParam = ThisWorkbook.Sheets("Paramétrage des leads")
    
    ' Définir les feuilles de résultats (Balance N et Balance N-1)
    Set WsBalanceN = ThisWorkbook.Sheets("Balance N")
    Set WsBalanceN_1 = ThisWorkbook.Sheets("Balance N-1")
    
    ' Trouver la dernière ligne non vide dans la colonne A de la feuille "Balance N" en excluant la ligne des totaux
    lastRow = WsBalanceN.Cells(WsBalanceN.Rows.Count, "A").End(xlUp).Row
    
    ' Parcourir toutes les lignes non vides
    For i = 2 To lastRow
        numCompte = WsBalanceN.Cells(i, 1).Value ' Lire le numéro de compte depuis la colonne A de "Balance N"
        
        ' Initialiser les variables de résultats
        resultD = "Non trouvé"
        resultF = "Non trouvé"
        found = False
                
        compteRecherche = Left(numCompte, 3) ' Étape 1 : Recherche avec les 3 premiers caractères
        resultD = RechercheCompte(compteRecherche, WsParam, 4) ' Recherche pour la colonne D (ancien résultat)
        resultF = RechercheCompte(compteRecherche, WsParam, 6) ' Recherche pour la colonne F (nouveau résultat)
        found = (resultD <> "Non trouvé" Or resultF <> "Non trouvé")
        
        If Not found Then ' Si non trouvé, étape 2 : Recherche avec les 2 premiers caractères
            compteRecherche = Left(numCompte, 2)
            resultD = RechercheCompte(compteRecherche, WsParam, 4) ' Recherche pour la colonne D (ancien résultat)
            resultF = RechercheCompte(compteRecherche, WsParam, 6) ' Recherche pour la colonne F (nouveau résultat)
            found = (resultD <> "Non trouvé" Or resultF <> "Non trouvé")
            If Not found Then
                compteRecherche = Left(numCompte, 1) ' Si non trouvé, étape 3 : Recherche avec le 1er caractère
                resultD = RechercheCompte(compteRecherche, WsParam, 4) ' Recherche pour la colonne D (ancien résultat)
                resultF = RechercheCompte(compteRecherche, WsParam, 6) ' Recherche pour la colonne F (nouveau résultat)
                found = (resultD <> "Non trouvé" Or resultF <> "Non trouvé")
            End If
        End If
                
        If found Then
            ' Placer les résultats dans les colonnes L et M de Balance N et Balance N-1
            balanceRow = TrouverLigne(WsBalanceN, numCompte)
            If balanceRow > 0 Then
                If resultD <> "Non trouvé" Then WsBalanceN.Cells(balanceRow, 12).Value = resultD ' Colonne L est la 12ème colonne
                If resultF <> "Non trouvé" Then WsBalanceN.Cells(balanceRow, 13).Value = resultF ' Colonne M est la 13ème colonne
            End If
            
            balanceRow = TrouverLigne(WsBalanceN_1, numCompte)
            If balanceRow > 0 Then
                If resultD <> "Non trouvé" Then WsBalanceN_1.Cells(balanceRow, 12).Value = resultD
                If resultF <> "Non trouvé" Then WsBalanceN_1.Cells(balanceRow, 13).Value = resultF
            End If
        End If
        
        If Not found Then ' Si toujours pas trouvé, indiquer "Non trouvé"
            balanceRow = TrouverLigne(WsBalanceN, numCompte)
            If balanceRow > 0 Then
                WsBalanceN.Cells(balanceRow, 12).Value = "Non trouvé"
                WsBalanceN.Cells(balanceRow, 13).Value = "Non trouvé"
            End If
            
            balanceRow = TrouverLigne(WsBalanceN_1, numCompte)
            If balanceRow > 0 Then
                WsBalanceN_1.Cells(balanceRow, 12).Value = "Non trouvé"
                WsBalanceN_1.Cells(balanceRow, 13).Value = "Non trouvé"
            End If
        End If

        ' Éclatement des valeurs des colonnes L et M en fonction du slash (/) dans Balance N
        valuesL = Split(WsBalanceN.Cells(balanceRow, 12).Value, "/")
        If UBound(valuesL) >= 0 Then WsBalanceN.Cells(balanceRow, 14).Value = valuesL(0) ' Colonne N
        If UBound(valuesL) >= 1 Then WsBalanceN.Cells(balanceRow, 15).Value = valuesL(1) ' Colonne O
        
        valuesM = Split(WsBalanceN.Cells(balanceRow, 13).Value, "/")
        If UBound(valuesM) >= 0 Then WsBalanceN.Cells(balanceRow, 16).Value = valuesM(0) ' Colonne P
        If UBound(valuesM) >= 1 Then WsBalanceN.Cells(balanceRow, 17).Value = valuesM(1) ' Colonne Q
        
        ' Éclatement des valeurs des colonnes L et M en fonction du slash (/) dans Balance N-1
        valuesL = Split(WsBalanceN_1.Cells(balanceRow, 12).Value, "/")
        If UBound(valuesL) >= 0 Then WsBalanceN_1.Cells(balanceRow, 14).Value = valuesL(0) ' Colonne N
        If UBound(valuesL) >= 1 Then WsBalanceN_1.Cells(balanceRow, 15).Value = valuesL(1) ' Colonne O
        
        valuesM = Split(WsBalanceN_1.Cells(balanceRow, 13).Value, "/")
        If UBound(valuesM) >= 0 Then WsBalanceN_1.Cells(balanceRow, 16).Value = valuesM(0) ' Colonne P
        If UBound(valuesM) >= 1 Then WsBalanceN_1.Cells(balanceRow, 17).Value = valuesM(1) ' Colonne Q

        ' Calculer la valeur de la colonne R pour Balance N et Balance N-1
        ' Calcul pour Balance N
        indexValue = Application.WorksheetFunction.Index(WsParam.Range("B6:B156"), Application.WorksheetFunction.Match(WsBalanceN.Cells(balanceRow, 12).Value, WsParam.Range("D6:D156"), 0))
        WsBalanceN.Cells(balanceRow, 18).Value = indexValue
        
        ' Calcul pour Balance N-1
        indexValue = Application.WorksheetFunction.Index(WsParam.Range("B6:B156"), Application.WorksheetFunction.Match(WsBalanceN_1.Cells(balanceRow, 12).Value, WsParam.Range("D6:D156"), 0))
        WsBalanceN_1.Cells(balanceRow, 18).Value = indexValue
    Next i
    Call RemplirBalanceAvecFeuilles
End Sub
 
RE,
Je te remercie pour ton retour. Concernant le fichier, il permet de regrouper les comptes comptables par familles pour deux exercices : l'année N et l'année N-1, ce qui est particulièrement utile pour le contrôle et la vérification des écritures avant le dépôt des bilans.

Il reste à ajuster les colonnes L des feuilles Destinations selon les conditions mentionnées en P1 et Q1 sur la feuille Balance N. Si tu as une idée sur la meilleure manière d'aborder cette étape ou sur la façon de faire le tri et les sous-totaux dans la fonction RemplirBalanceAvecFeuilles, ton expertise serait vraiment appréciée 🙂
 
regarde la PJ

1) j'ai transformé tes tableaux en Table Structurée (TS)
2) j'ai créé une feuille Modèle (avec les entetes que tu remets dans le code)

pour la démo
3) j'ai vidé les colonnes M à R des TS balance N et N-1
4) j'ai supprimé toutes les feuilles F, SS,....

j'ai modifié le code pour exploiter les tables et l'optimiser (beaucoup de boucles "redondantes")
ex: tu fais une boucle sur le nombre de lignes de la balance N, MAIS dans cette boucle, tu travailles aussi sur la balance N_1 en faisant une sorte de "aparthé" dans la boucle
j'ai donc modifié pour faire UNE boucle qui travaille sur UNE table

regarde le code, j'y ai mis des commentaire
dans la seconde macro "RemplirBalanceAvecFeuilles",
j'ai pas encore bien compris comment tu remplissais le RowData
==> quand tu remplis le RowData(10), tu as commenté la partie "else" du if ==> du coup.. le if ne sert à rien
 

Pièces jointes

ah et dans la macro "RechercherEtRécupérer"

VB:
indexValue = Application.WorksheetFunction.Index(TSParam.ListColumns(2).Range, Application.WorksheetFunction.Match(resultD, TSParam.ListColumns(4).Range, 0))
tu as bien conscience que cette instruction cherche la feuille dans la la colonne D de paramétrage pour te donner la valeur de la colonne Azerty2 (colB)
MAIS que ca te donne la première occurence..
 
Dernière version ici
reste 2 points à éclaircir/confirmer

1) ce que je t'ai indiqué dans le post 14
2) macro RemplirBalanceAvecFeuilles: remplissage du rowsource(10)
ne serait ce pas exactement la meme chose que le test que tu fais juste un peu avant pour avoir "feuilleNom" ??
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
66
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
280
  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
515
Retour