VBA Tableau - Simplification de code Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
K
KAK
Jeune membre
Jeune membre
Messages : 27
Inscrit le : 9 mai 2017
Version d'Excel : 2010

Message par KAK » 1 janvier 2019, 14:31

Bonsoir,

J'ai dois exécuter une macro sur un fichier Excel contenant plus de 200 milles lignes. J'ai fais une macro pour faire le travail, la macro fonctionne bien mais elle prend beaucoup trop de temps (2 à 3h de temps d'exécution : littéralement).
Je pense que c'est possible de diminuer le temps de calcul en utilisant la variable tableau sur Excel mais je n'arrive pas à le faire. Pouvez-vous m'aider svp?
Le fichier est en pièce jointe.

Bonne année
Modifié en dernier par KAK le 11 janvier 2019, 09:22, modifié 1 fois.
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'171
Appréciations reçues : 377
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 1 janvier 2019, 15:51

bonjour,

une proposition

attention ton tableau ne contient pas les données pour des durées >30 et les résultats pourraient être incorrects.

Option Base 1



Sub TarifavecTableau()

    Dim PlageCalcul_Ligne As Long

    Dim a As Long
    Dim dureeinit
    Dim ageassure
    Dim dureepercep
    Dim CIprimepercue
    Dim CRDprimepercue
    Dim montantpret
    Application.ScreenUpdating = False

    t = Timer

    PlageCalcul = Sheets("Ptf adhésions").Range("A" & Rows.Count).End(xlUp).Row - 1


    ageassure = Sheets("Ptf adhésions").Range("E1").Resize(PlageCalcul)
    dureeinit = Sheets("Ptf adhésions").Range("C1").Resize(PlageCalcul)
    dureepercep = Sheets("Ptf adhésions").Range("I1").Resize(PlageCalcul)
    montantpret = Sheets("Ptf adhésions").Range("B1").Resize(PlageCalcul)
    CIprimepercue = Sheets("Ptf adhésions").Range("M1").Resize(PlageCalcul)
    CRDprimepercue = Sheets("Ptf adhésions").Range("N1").Resize(PlageCalcul)
    tabligne40 = Sheets("feuil3").Cells(40, 8).Resize(, 40)
    tab4271 = Sheets("feuil3").Cells(42, 8).Resize(40, 40)

    For i = 2 To PlageCalcul
        montantprete = montantpret(i, 1) / 100000
        CIprimepercue(i, 1) = 0
        CRDprimepercue(i, 1) = 0
        On Error Resume Next
        CIprimepercue(i, 1) = montantprete * tabligne40(1, dureeinit(i, 1)) * dureepercep(i, 1)
        CRDprimepercue(i, 1) = montantprete * suminterval(tab4271, dureeinit(i, 1), dureepercep(i, 1))
        On Error GoTo 0
    Next i
    Sheets("Ptf adhésions").Cells(1, 13).Resize(PlageCalcul) = CIprimepercue
    Sheets("Ptf adhésions").Cells(1, 14).Resize(PlageCalcul) = CRDprimepercue
    Application.ScreenUpdating = True
    MsgBox Timer - t
End Sub

Function suminterval(t, di, dp)
    s = 0
    For i = 1 To dp
        s = s + t(i, di)
    Next i
    suminterval = s
End Function
K
KAK
Jeune membre
Jeune membre
Messages : 27
Inscrit le : 9 mai 2017
Version d'Excel : 2010

Message par KAK » 1 janvier 2019, 15:57

Wow, Merci beaucoup pour le code. Je vais le lancer et Je te dirai ce que ça donne.
Oui, j'ai enlevé certaines valeurs pour alleger le document. Je cherche surtout à trouver la formulation sous forme de Tableau ou une autre methode VBA pour faire le calcul plus vite.
Merci
Bonne année
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message