Pages

samedi 11 février 2023

Macro, crédit et LibreOffice

Recueil de liens

Application des macros sur un classeur sur le crédit

Lien vers le classeur avec la macro LibreOffice Calc - classeur avec macro
Lien vers le support de cours sur le crédit Cours sur le crédit

Vidéo de présentation

Rq: Les boutons de la feuille 2 fonctionnent maintenant dès l'ouverture du classeur suite à la suggestion de Prog.amateur sur le forum d'entre aide de Libre Office ;)



Script de la macro commenté

Script commenté en dessous, ' génère une ligne de commentaire!

REM  *****  BASIC  *****

' Script lancé par le bouton Macro - Crédit
Sub Credit
' ------------------- declaration variables
Dim MonDocument As Object
Dim MaFeuille As Object
Dim MaCellule As Object
MonDocument = ThisComponent
MaFeuille = MonDocument.CurrentController.ActiveSheet



' ------------------ recup valeur des cellules et affectation variables
' Principe appliqué ici:
' Se positionner sur la cellule ad hoc avec getCellByPosition(col,ligne)
'         Rq ici (1,3) pour B4
 Affectation de sa valeur avec la propriété .Value
' Les donnees sont dans les cellules des lignes de 1 à 6 
'
MaCellule = MaFeuille.getCellByPosition(1,3)
montant_emprunte = MaCellule.Value
'
MaCellule = MaFeuille.getCellByPosition(1,4)
taux_an = MaCellule.Value
taux_periodique=taux_an/12
'
MaCellule = MaFeuille.getCellByPosition(1,5)
duree_an = MaCellule.Value
duree_mois =duree_an*12



' ------------------ si besoin astuce pour afficher les valeurs 
' Principe : 
' Utilisation du print "texte à afficher";variable
' Affichage pour verifier (a decommenter si necessaire)
'print "nom feuille ";MaFeuille.Name
'print "verif valeurs ";montant_emprunte;taux_an;taux_periodique;duree_an;duree_mois



' ---------------------- calculs echeance, tot credit et tot interet
' Objectif:
' Calculer puis afficher les résultats dans des cellules
' Affichage entre les lignes 10 et 12
' Principe:
' Calculer les valeurs et les affectées a des variables
' Saisir l'etiquette et la valeur avec les proprietes .String pour le texte et .Value pour les nombres


' Déclaration des variables puis calculs
' Currency pour format monetaire
' Propriete .NumberFormat=108 pour affichage au format monetaire (a verifier quand meme)
Dim echeance_maths As Currency
Dim tot_credit As Currency
Dim tot_interet As Currency
'
echeance_maths=(montant_emprunte*taux_periodique)/(1-(1+taux_periodique)^(-duree_mois))
tot_credit=echeance_maths*duree_mois
tot_interet=tot_credit-montant_emprunte

' Affichage pour verifier (a decommenter si necessaire)
'print "echeance=";echeance_maths;"tot credit=";tot_credit;tot_interet

' Affichage des resultats dans cellules de la feuille active
MaCellule = MaFeuille.getCellByPosition(0,9)
MaCellule.String = "Echéance"
MaCellule = MaFeuille.getCellByPosition(1,9)
MaCellule.NumberFormat=108 
MaCellule.Value = echeance_maths
'
MaCellule = MaFeuille.getCellByPosition(0,10)
MaCellule.String = "Total crédit"
MaCellule = MaFeuille.getCellByPosition(1,10)
MaCellule.NumberFormat=108
MaCellule.Value = tot_credit
'
MaCellule = MaFeuille.getCellByPosition(0,11)
MaCellule.String = "Total intérêt"
MaCellule = MaFeuille.getCellByPosition(1,11)
MaCellule.NumberFormat=108
MaCellule.Value = tot_interet

' ------------------- Calcul du tableau d'amortissement
MaCellule = MaFeuille.getCellByPosition(0,16)
MaCellule.String = "Tableau d'amortissement"

' mise en place des étiquettes des colonnes
MaCellule = MaFeuille.getCellByPosition(1,17)
MaCellule.String = "Total"
MaCellule = MaFeuille.getCellByPosition(0,18)
MaCellule.String = "Rang"
MaCellule = MaFeuille.getCellByPosition(1,18)
MaCellule.String = "Restant dû"
MaCellule = MaFeuille.getCellByPosition(2,18)
MaCellule.String = "Intérêt"
MaCellule = MaFeuille.getCellByPosition(3,18)
MaCellule.String = "Principal"
MaCellule = MaFeuille.getCellByPosition(4,18)
MaCellule.String = "Echéance"

' mise en place de la première valeur du restant dû
' Cette valeur ne peut pas être dans la boucle car decalage
MaCellule = MaFeuille.getCellByPosition(1,19)
MaCellule.NumberFormat =108
MaCellule.FormulaLocal = "=B4"


' mise en place de la boucle pour les valeurs du tableau
' Principe:
' Propriété .FormulaLocal pour pouvoir saisir une formule comme dans le classeur
' A noter l'astuce +Ltrim(str... afin de pouvoir faire tourner la valeur de la ligne
' Ex 
' =INTPER(B5/12;A"+Ltrim(str(i+20))+";B6*12;B4) 
'    donnera pour i = 0
' =INTPER(B5/12;A20;B6*12;B4)

Dim i As Integer
for i = 0 to duree_mois-1

MaCellule = MaFeuille.getCellByPosition(0,19+i)
MaCellule.NumberFormat = 1
MaCellule.FormulaLocal=1+i

MaCellule = MaFeuille.getCellByPosition(2,19+i)
MaCellule.NumberFormat = 108
MaCellule.FormulaLocal="=INTPER(B5/12;A"+Ltrim(str(i+20))+";B6*12;B4)"

MaCellule = MaFeuille.getCellByPosition(3,19+i)
MaCellule.NumberFormat = 108
MaCellule.FormulaLocal="=PRINCPER(B5/12;A"+Ltrim(str(i+20))+";B6*12;B4)"

MaCellule = MaFeuille.getCellByPosition(4,19+i)
MaCellule.NumberFormat = 108
MaCellule.FormulaLocal="=VPM(B5/12;B6*12;B4)"

MaCellule = MaFeuille.getCellByPosition(1,20+i)
MaCellule.NumberFormat = 108
MaCellule.FormulaLocal="=B"+Ltrim(str(i+20))+"+D"+Ltrim(str(i+20))+""
Next i

End Sub


'----------------------------------------------------------------------
'----------------------------------------------------------------------
' Script lancé par le bouton Macro - Effacement
Sub Effacement
Dim MonDocument As Object
Dim MaFeuille As Object
Dim MaPlage As Object
MonDocument = ThisComponent
MaFeuille = MonDocument.CurrentController.ActiveSheet

' Efface les donnees numeriques, alphanumeriques et les formules
MaPlage = MaFeuille.GetCellRangeByName ("A10:E1000")
MaPlage.clearContents(com.sun.star.sheet.CellFlags.VALUE OR _
                com.sun.star.sheet.CellFlags.STRING OR _
               com.sun.star.sheet.CellFlags.FORMULA)

End Sub

---------------

Script amélioré 

Car tenant compte des remarques du document https://berma.pagesperso-orange.fr/Files_fr/OOo_API_intro.pdf - voir &2.3 page 12

Script en dessous

REM  *****  BASIC  *****
' Grâce à cette instruction, vous aurez un message d’erreur pour toute variable non définie, ou mal orthographiée.
Option explicit 

' ------------------- declaration variables du module donc pour les 2 macros Sub
Dim MonDocument As Object
Dim MaFeuille As Object
Dim MaCellule As Object
Dim MaPlage As Object



' Script lancé par le bouton Macro - Crédit
Sub Credit

 ' Variable specifique au sous programme
Dim montant_emprunte As Variant, taux_an As Variant, taux_periodique As Variant, duree_an As Variant, duree_mois As Variant


MonDocument = ThisComponent
MaFeuille = MonDocument.CurrentController.ActiveSheet

' ------------------ recup valeur des cellules et affectation variables
' Principe appliqué ici:
' Se positionner sur la cellule ad hoc avec getCellByPosition(col,ligne)
'         Rq ici (1,3) pour B4
'  Affectation de sa valeur avec la propriété .Value
' Les donnees sont dans les cellules des lignes de 1 à 6 
'
MaCellule = MaFeuille.getCellByPosition(1,3)
montant_emprunte = MaCellule.Value
'
MaCellule = MaFeuille.getCellByPosition(1,4)
taux_an = MaCellule.Value
taux_periodique=taux_an/12
'
MaCellule = MaFeuille.getCellByPosition(1,5)
duree_an = MaCellule.Value
duree_mois =duree_an*12



' ------------------ si besoin astuce pour afficher les valeurs 
' Principe : 
' Utilisation du print "texte à afficher";variable
' Affichage pour verifier (a decommenter si necessaire)
'print "nom feuille ";MaFeuille.Name
'print "verif valeurs ";montant_emprunte;taux_an;taux_periodique;duree_an;duree_mois



' ---------------------- calculs echeance, tot credit et tot interet
' Objectif:
' Calculer puis afficher les résultats dans des cellules
' Affichage entre les lignes 10 et 12
' Principe:
' Calculer les valeurs et les affectées a des variables
' Saisir l'etiquette et la valeur avec les proprietes .String pour le texte et .Value pour les nombres


' Déclaration des variables puis calculs
' Currency pour format monetaire
' Propriete .NumberFormat=108 pour affichage au format monetaire
Dim echeance_maths As Currency, tot_credit As Currency, tot_interet As Currency
'
echeance_maths=(montant_emprunte*taux_periodique)/(1-(1+taux_periodique)^(-duree_mois))
tot_credit=echeance_maths*duree_mois
tot_interet=tot_credit-montant_emprunte

' Affichage pour verifier (a decommenter si necessaire)
'print "echeance=";echeance_maths;"tot credit=";tot_credit;tot_interet

' Affichage des resultats dans cellules de la feuille active
MaCellule = MaFeuille.getCellByPosition(0,9)
MaCellule.String = "Echéance"
MaCellule = MaFeuille.getCellByPosition(1,9)
MaCellule.NumberFormat=108
MaCellule.Value = echeance_maths
'
MaCellule = MaFeuille.getCellByPosition(0,10)
MaCellule.String = "Total crédit"
MaCellule = MaFeuille.getCellByPosition(1,10)
MaCellule.NumberFormat=108
MaCellule.Value = tot_credit
'
MaCellule = MaFeuille.getCellByPosition(0,11)
MaCellule.String = "Total intérêt"
MaCellule = MaFeuille.getCellByPosition(1,11)
MaCellule.NumberFormat=108
MaCellule.Value = tot_interet

' ------------------- Calcul du tableau d'amortissement
MaCellule = MaFeuille.getCellByPosition(0,16)
MaCellule.String = "Tableau d'amortissement"

' Mise en place des étiquettes des colonnes
MaCellule = MaFeuille.getCellByPosition(1,17)
MaCellule.String = "Total"
MaCellule = MaFeuille.getCellByPosition(0,18)
MaCellule.String = "Rang"
MaCellule = MaFeuille.getCellByPosition(1,18)
MaCellule.String = "Restant dû"
MaCellule = MaFeuille.getCellByPosition(2,18)
MaCellule.String = "Intérêt"
MaCellule = MaFeuille.getCellByPosition(3,18)
MaCellule.String = "Principal"
MaCellule = MaFeuille.getCellByPosition(4,18)
MaCellule.String = "Echéance"

' Mise en place de la première valeur du restant dû
' Cette valeur ne peut pas être dans la boucle car decalage
MaCellule = MaFeuille.getCellByPosition(1,19)
MaCellule.NumberFormat =108
MaCellule.FormulaLocal = "=B4"


' mise en place de la boucle pour les valeurs du tableau
' Principe:
' Propriété .FormulaLocal pour pouvoir saisir une formule comme dans le classeur
' A noter l'astuce +Ltrim(str... afin de pouvoir faire tourner la valeur de la ligne
' Ex 
' =INTPER(B5/12;A"+Ltrim(str(i+20))+";B6*12;B4) 
'    donnera pour i = 0
' =INTPER(B5/12;A20;B6*12;B4)

Dim i As Integer
for i = 0 to duree_mois-1

MaCellule = MaFeuille.getCellByPosition(0,19+i)
MaCellule.NumberFormat = 1
MaCellule.FormulaLocal=1+i

MaCellule = MaFeuille.getCellByPosition(2,19+i)
MaCellule.NumberFormat = 108
MaCellule.FormulaLocal="=INTPER(B5/12;A"+Ltrim(str(i+20))+";B6*12;B4)"

MaCellule = MaFeuille.getCellByPosition(3,19+i)
MaCellule.NumberFormat = 108
MaCellule.FormulaLocal="=PRINCPER(B5/12;A"+Ltrim(str(i+20))+";B6*12;B4)"

MaCellule = MaFeuille.getCellByPosition(4,19+i)
MaCellule.NumberFormat = 108
MaCellule.FormulaLocal="=VPM(B5/12;B6*12;B4)"

MaCellule = MaFeuille.getCellByPosition(1,20+i)
MaCellule.NumberFormat = 108
MaCellule.FormulaLocal="=B"+Ltrim(str(i+20))+"+D"+Ltrim(str(i+20))+""
Next i

End Sub


'----------------------------------------------------------------------
'----------------------------------------------------------------------
' Script lancé par le bouton Macro - Effacement
Sub Effacement
' Variable specifique au sous programme
MonDocument = ThisComponent
MaFeuille = MonDocument.CurrentController.ActiveSheet

' Efface les donnees numeriques, alphanumeriques et les formules
MaPlage = MaFeuille.GetCellRangeByName ("A10:E1000")
MaPlage.clearContents(com.sun.star.sheet.CellFlags.VALUE OR _
                com.sun.star.sheet.CellFlags.STRING OR _
               com.sun.star.sheet.CellFlags.FORMULA)

End Sub


Aucun commentaire:

Enregistrer un commentaire

Tout commentaire nous engage ;)