Article épinglé

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