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
	
	
	
	
	
		
	
		
			
		
		
	
				
			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 
	 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		