Fonction mal écrite (Calcul intérêts variables - VBA)

Salut ici,

Quelques années après ce post, pendant lesquelles j'ai largement utilisé le dit fichier, j'aimerais le moderniser en utilisant des fonctions (j'ai pour l'instant des classeurs couverts de dizaines de colonnes pour les calculs, c'est très fonctionnel, mais pas pratique pour plusieurs utilisations).

J'ai commencé mes devoirs, lu sur les sub/fonctions... mais je bloque évidemment rapidement.

=> Dans un premier temps, j'ai fais une macro qui fonctionne très bien, pour me faire la main. Les calculs sont exacts, pas de problème de ce côté.

Mais je ne veux pas d'une macro, mais plutôt d'une fonction que je peux ainsi adapter très facilement.

J'essaie pour l'instant d'entrer ma fonction avec une seule variable renseignée, les autres données étant "fixes" (ce ne sera pas le cas à terme, bien sur). Mais j'ai systèmatiquement une erreur "#valeur" .... et je ne parviens pas à comprendre pourquoi.

=> Je veux que la cellule me renvoie la valeur X.

Auriez vous une idée ??

56test-public.xlsm (42.63 Ko)

Function CalculIntDéb(Base_Calcul As Currency) As Currency

Dim DateDeb As Date 'date début du calcul d'intérêt

Dim DateFin As Date 'date fin de calcul des intérêts

Dim numero_ligne As Integer 'numéro de ligne dans la base de données des intérêts

Sheets("Intérêts").Activate

numero_ligne = 7

DateDeb = Cells(69, 8)

DateFin = Cells(69, 9)

DebInt = Cells(numero_ligne, 1)

x = Range("H68")

'Nous allons chercher le premier trimestre ou le taux s'applique

Do Until Cells(numero_ligne + 1, 1) > DateDeb

numero_ligne = numero_ligne + 1

Loop

' A enlever juste pour les tests

Range("G59").Value = Cells(numero_ligne, 1)

'Lancement d'une boucle pour calculer les intérêts débiteurs

Do Until DateFin < Cells(numero_ligne, 1)

'On calcul taux d'intérêt sur ce trimestre

'Cas ou le calcul d'intérêt se termine dans ce trimestre

If DateFin < (Cells(numero_ligne + 1, 1)) Then

'1 - cas ou le calcul d'intérêt débute ET se termine dans ce même trimestre

If DateDeb > (Cells(numero_ligne, 1)) Then

x = x * (1 + (Cells(numero_ligne, 4))) ^ (DateFin - DateDeb) - Base_Calcul

'Le temps de la vérif :

Range("G49").Value = x

Else

'2 - cas ou le calcul d'intérêt se termine dans ce trimestre mais a débuté avant ce trimestre

x = x * (1 + (Cells(numero_ligne, 4))) ^ (DateFin - Cells(numero_ligne, 1)) - Base_Calcul

End If

Else

'3- Cas ou le calcul d'intérêt commence dans ce trimestre mais fini plus tard

If DateDeb > (Cells(numero_ligne, 1)) Then

x = x * (1 + (Cells(numero_ligne, 4))) ^ (Cells(numero_ligne + 1, 1) - DateDeb)

Else

'4- Si trimestre "complet" (le calcul ne débute ni ne termine dans ce trimeste) (a revoir, devrait être 1...) :

x = x * (1 + (Cells(numero_ligne, 4))) ^ (Cells(numero_ligne + 1, 1) - Cells(numero_ligne, 1))

End If

End If

'On continue à calculer dans le prochain trimestre, sauf si la date de fin de calcul se situe dans le trimestre en cours.

If DateFin > Cells(numero_ligne, 1) Then

numero_ligne = numero_ligne + 1

End If

Loop 'fin total du calcul d'intérêt débiteur

'Range("G63").Value = x ' A enlever juste pour les tests (inscris le montant total des intérêts)

CalculIntDéb = x

End Function

Bonjour,

supprime les lignes du type Range("G59").Value = Cells(numero_ligne, 1).

Une fonction ne peut que retourner une valeur et jamais modifier son environnement.

Evite les .Activate et .Select inutiles dans 99% des cas, voire même gênants et problématiques.

eric

haaaaa super effectivement.

Merci beaucoup Eriic

Juste pour le principe : eriiic, j'ai aussi suivi vos conseils en utilisant "set" pour définir le classeur et éviter .activate, et effectivement je trouve cela plus lisible et sûrement plus efficace.

Merci encore.

En plus les .Select prenne énormément de temps.

Il ne faut le faire que quand tu n'as pas le choix.

En plus les .Select prenne énormément de temps.

Il ne faut le faire que quand tu n'as pas le choix.

On a besoin obligatoirement des .Select (et .Activate) dans quels cas particuliers ?

Bonjour Eric,

Une fonction ne peut que retourner une valeur et jamais modifier son environnement.

Exact ! sauf un cas exceptionnel que j'exploite pour produire un QRCode ... mais tu as raison sur la règle de base.

Bonjour,

On a besoin obligatoirement des .Select (et .Activate) dans quels cas particuliers ?

de mémoire sur des opérations un peu spéciales, sur certains tris par exemples qui réclament que la feuille soit active.

Tu t'en aperçois de toute façon : soit tu asd une erreur, soit ça ne le fait pas.

Exact ! sauf un cas exceptionnel que j'exploite pour produire un QRCode ... mais tu as raison sur la règle de base.

On peut changer la couleur de la police aussi. Un bug (?) qui peut rendre service aussi

eric

Rechercher des sujets similaires à "fonction mal ecrite calcul interets variables vba"