Rassembler deux code en un seul

Bonjour le forum

j'aimerais que mes deux code ci joint ne forme qu'un seul code j'ai fait un autre code mais sa me renvoie la mm chose

voici mes code:

Sub NOMBRE_DE_SINISTRES_DECLARES()

    Dim Date_Souscription_Adhésion As Range, Date_Survenance As Range
    Dim DernLigne As Long
    Dim nblignes(1 To 12, 2013 To 2017) As Long
    Dim i, j, k As Integer
    Dim a, b, c, d, e As Integer

    With Worksheets("Sinistre_Historique")
        DernLigne = .Range("A" & .Rows.Count).End(xlUp).Row
        Set Date_Souscription_Adhésion = .Range("G2:G" & DernLigne)
        Set Date_Survenance = .Range("U2:U" & DernLigne)
    End With

    a = LBound(nblignes, 2)
    e = UBound(nblignes, 2)

    For i = 2 To DernLigne
       If a <= Year(Cells(i, 21).Value) And Year(Cells(i, 21).Value) <= e Then
            j = Month(Cells(i, 7).Value)
            k = Year(Cells(i, 7).Value)
            nblignes(j, k) = nblignes(j, k) + 1
        End If
    Next i

    For i = 1 To 12
        For k = a To e
            Sheets("Feuil1").Cells(i + (k - 2013) * 12, 3).Value = nblignes(i, k)
        Next k
    Next i

End Sub
Sub NOMBRE_DE_SINISTRES_ACCEPTES()

    Dim Date_Souscription_Adhésion As Range, Date_Survenance, Statut_Technique_Sinistre As Range
    Dim DernLigne As Long
    Dim nblignes(1 To 12, 2013 To 2017) As Long
    Dim i, j, k As Integer
    Dim a, b, c, d, e As Integer
    Dim s As String

    With Worksheets("Sinistre_Historique")
        DernLigne = .Range("A" & .Rows.Count).End(xlUp).Row
        Set Date_Souscription_Adhésion = .Range("G2:G" & DernLigne)
        Set Date_Survenance = .Range("U2:U" & DernLigne)
        Set Statut_Technique_Sinistre = .Range("V2:V" & DernLigne)
    End With

    a = LBound(nblignes, 2)
    e = UBound(nblignes, 2)

    For i = 2 To DernLigne
        s = Cells(i, "V").Value
        If s = "Terminé - accepté" Then
            If a <= Year(Cells(i, 21).Value) And Year(Cells(i, 21).Value) <= e Then
                j = Month(Cells(i, 7).Value)
                k = Year(Cells(i, 7).Value)
                nblignes(j, k) = nblignes(j, k) + 1
            End If
        End If
    Next i

    For i = 1 To 12
        For k = a To e
            Sheets("Feuil1").Cells(i + (k - 2013) * 12, 4).Value = nblignes(i, k)
        Next k
    Next i

End Sub

et voici le code que j'ai essayé de faire et qu'il me renvoie les même valeurs pour les deux colonne

Sub NOMBRE_DE_SINISTRES_DECLARES()

    Dim Date_Souscription_Adhésion As Range, Date_Survenance As Range
    Dim Statut_Technique_Sinistre As Range
    Dim DernLigne As Long
    Dim nblignes(1 To 12, 2013 To 2017) As Long
    Dim i, j, k, l, m, n As Integer
    Dim a, b, c, d, e As Integer
    Dim s As String

    With Worksheets("Sinistre_Historique_ICICDDE (3)")
        DernLigne = .Range("A" & .Rows.Count).End(xlUp).Row
        Set Date_Souscription_Adhésion = .Range("G2:G" & DernLigne)
        Set Date_Survenance = .Range("U2:U" & DernLigne)
    End With

    a = LBound(nblignes, 2)
    e = UBound(nblignes, 2)

    For i = 2 To DernLigne
       If a <= Year(Cells(i, 21).Value) And Year(Cells(i, 21).Value) <= e Then
            j = Month(Cells(i, 7).Value)
            k = Year(Cells(i, 7).Value)
            nblignes(j, k) = nblignes(j, k) + 1
        End If
    Next i

    For l = 2 To DernLigne
        s = Cells(l, "V").Value
        If s = "Terminé - accepté" Then
            If a <= Year(Cells(l, 21).Value) And Year(Cells(l, 21).Value) <= e Then
                m = Month(Cells(l, 7).Value)
                n = Year(Cells(l, 7).Value)
                nblignes(m, n) = nblignes(m, n) + 1
            End If
        End If
    Next l

    For i = 1 To 12
        For k = a To e
        'condition is si numero contrat fichier tdb = numero police fichier sinistre
        'changer sheets et mettre la bonne feuille
        'condition sur mois et année pour pouvoir effectuer les macros
            Sheets("Feuil1").Cells(i + (k - 2013) * 12, 3).Value = nblignes(i, k)
        Next k
    Next i

    For l = 1 To 12
        For n = a To e
            Sheets("Feuil1").Cells(l + (n - 2013) * 12, 4).Value = nblignes(l, n)
        Next n
    Next l

End Sub

ci joint le fichier

5tdb-exple.xlsm (246.89 Ko)

re-bonjour

je suppose que c'est impossible a faire

Bonjour,

je suppose que c'est impossible a faire

Mauvaise déduction... !

Mais si tu utilises le même tableau à 2 dimensions pour y placer deux fois plus de valeurs, cela ne paraît guère compatible ! Il faut doubler le tableau avec une 3e dimension...

En outre tu ne fais que répéter les deux procédures... Pour que la nouvelle représente un gain, il faut réduire les deux boucles àune seule.

Et une affectation en tableau serait certainement préférable, de même que rendre plus générique la procédure en ne la bloquant pas sur des années prédéfinies...

Cordialement.

merci pour ton aide

comment je pourrais réduire les deux boucles a une seule

En n'opérant qu'un seul parcours ! Et à chaque tour tu peux faire les deux opérations, d'autant que les conditions de dates et le mois et l'année sont commun, ce qui fait autant d'économisé. Il n'y a qu'une condition supplémentaire pour une opération.

Voilà la fusion des 2 procédures...

Sub NombreSinistres(a0 As Integer, a1 As Integer)
    Dim Tdécla(), Taccept(), dln&, i&, a%, m%
    ReDim Tdécla(12, a0 - 1 To a1): ReDim Taccept(12, a0 - 1 To a1)
    With Worksheets("Sinistre_Historique")
        dln = .Range("A" & .Rows.Count).End(xlUp).Row
        For i = 2 To dln
            a = Year(.Cells(i, 21))
            If a >= a0 And a <= a1 Then
                a = Year(.Cells(i, 7)): m = Month(.Cells(i, 7))
                Tdécla(m, a) = Tdécla(m, a) + 1
                If .Cells(i, 22).Value Like "*accepté*" Then
                    Taccept(m, a) = Taccept(m, a) + 1
                End If
            End If
        Next i
    End With
    For i = 1 To 12
        Tdécla(i, a0 - 1) = MonthName(i): Taccept(i, a0 - 1) = MonthName(i)
    Next i
    For i = a0 To a1
        Tdécla(0, i) = i: Taccept(0, i) = i
    Next i
    a = a1 - a0 + 2
    With Worksheets("Feuil1")
        With .UsedRange
            .ClearContents
            .Borders.LineStyle = xlLineStyleNone
            .MergeCells = False
            .HorizontalAlignment = xlLeft
        End With
        With .Cells(1, 1)
            .Value = "Nombre de sinistres déclarés"
            With .Resize(, a)
                .Merge
                .HorizontalAlignment = xlCenter
            End With
        End With
        With .Cells(2, 1).Resize(13, a)
            .Value = Tdécla
            .Columns.AutoFit
            With .Borders
                .LineStyle = xlContinuous: Weight = xlThin
            End With
            .Offset(, 1).HorizontalAlignment = xlCenter
        End With
        With .Cells(1, a + 2)
            .Value = "Nombre de sinistres acceptés"
            With .Resize(, a)
                .Merge
                .HorizontalAlignment = xlCenter
            End With
        End With
        With .Cells(2, a + 2).Resize(13, a)
            .Value = Taccept
            .Columns.AutoFit
            With .Borders
                .LineStyle = xlContinuous: Weight = xlThin
            End With
            .Offset(, 1).HorizontalAlignment = xlCenter
        End With
        .Activate
    End With
End Sub

Sub Test()
    NombreSinistres 2013, 2017
End Sub

Bouton sur feuille Hisorique.

On constitue les deux tableaux simultanément.

Cela raccourcit assez nettement... A partir du moment où l'on passe sur la feuille1, l'affectation occupe 2 lignes et tout le reste du code n'est que la mise en forme des tableaux.

La variabilité des années prélevées est assurée par une procédure de lancement (appelée Test ici), qui lance la procédure en lui passant l'année début et l'année fin. C'est là qu'on les change s'il y a lieu.

Cordialement.

ouahhh c magnifiqueee

je comprend pas pourquoi il n'y a pas as quelque chose

 Dim Tdécla(), Taccept(), dln&, i&, a%, m%

Il n'y a pas quoi ?

merciiii bcppp

Tu ne me dis pas ce qui semble te manquer ?

je comprend pas pourquoi il y a pas as integer, double ...

Ah ! Il y a 2 variables Long : & = As Long, et 2 variables Integer : % = As Integer.

Ces caractères accolés à un nom de variable sont ce que l'on appelle des caractères de déclaration de type.

Il y en a quelques autres pour Single, Double, Currency et String.

Cela permet de raccourcir assez sensiblement les déclarations.

Les tableaux sont déclarés en tableaux dynamiques (le nombre d'années pouvant varier) et sont de dimensionnés à l'exécution (avec ReDim). De type Variant (quand on n'indique pas de type, la variable est de type Variant, note que dans tes déclarations de groupe où tu listes des variables et n'indique qu'une fois le type à la fin, seule la dernière est alors typée, les autres sont Variant car toutes les variables doivent se typer individuellement...) pour accueillir des types de données différents.

ah d’accord

encore mercii pour toute tes explications

Rechercher des sujets similaires à "rassembler deux code seul"