Bonjour,
Je réalise une macro pour gérer mes comptes.
Je rentre les opérations dans une feuille Opérations avec une ligne par opération, comprenant la date, le montant, le compte ou le poste de provenance, le compte ou le poste de destination. Le programme génère un identifiant unique pour chaque opératino afin de pouvoir gérer les suppressions par ailleurs.
Ensuite, il y a un onglet par compte avec une ligne par opération, avec la date, le montant (positif ou négatif selon qu'il s'agisse d'un débit ou d'un crédit), puis le poste ou le compte de provenance/destination, et enfin le solde résultant, puis la clef de l'opération. Ces valeurs sont en fait appelées depuis la feuille opération par des formules (=Opération.K5), sauf la clef qui est écrite en dur.
Les opérations ne sont pas toujours entrées par ordre chronologique.
Avant tout traitement, le programme trie donc la feuille opération sur les dates, qui sont entrées en tant que chaînes de caractères avec l'année, suivie du mois, puis du jour.
Lors de l'insertion d'une opération dans le compte, le programme se place sur la première opération de ce compte puis compare sa date à celle de l'opération à enregistrer. Si l'opération à enregistrer est postérieure, il passe à la ligne suivante jusqu'à rencontrer une ligne vide, sinon, il s'arrête et insère une nouvelle ligne.
Le code de ce mécanisme est ici :
Pour vérifier si tout marche bien, je trie mes opérations par montant décroissant puis je les insère en deux fois. Lors de la deuxième fois, le programme est supposé insérer les opérations dans les onglets comptes dans l'ordre chronologique parmi celles déjà existantes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 sub EcritOp(a_nblignes as integer, a_compte as string, a_signe as integer, a_devers as string, a_clef as string) ' parcourt les dates d'opérations existantes, et insère la nouvelle opération dans l'ordre chronologique. dim p_Ofl as object dim p_date as string dim p_Nblignes as integer dim p_Formule as string dim p_DateL as string set p_ofl = odoc.sheets.getbyname(a_compte) p_date = ofl.getCellByposition(0,a_nblignes).getformula 'ofl est la feuille opération, a_nblignes est le numéro de ligne de l'opération dans la feuille opération p_nblignes=2 p_dateL = p_ofl.getcellbyposition(0,p_nblignes).getstring do while p_datel <>"" and p_date > p_datel p_nblignes=p_nblignes+1 p_datel = p_ofl.getcellbyposition(0,p_nblignes).getstring loop ' insertion de la ligne p_ofl.rows.insertbyindex(p_nblignes,1) ' remplissage de la date p_ofl.getcellbyposition(0,p_nblignes).setformula("=" & ofl.name & ".a" & a_nblignes+1) ' remplissage du montant p_formule = "=" & ofl.name & ".b" & a_nblignes+1 & "*" & a_signe p_ofl.getcellbyposition(1,p_nblignes).setformula(p_formule) ' remplissage de la provenance/destination p_ofl.getcellbyposition(2,p_nblignes).setformula(a_devers) ' remplissage de la description p_ofl.getcellbyposition(3,p_nblignes).setformula("=" & ofl.name & ".e" & a_nblignes+1) ' insertion d'une clef : numéro de ligne dans la feuille opération p_ofl.getcellbyposition(7,p_nblignes).setformula(a_clef) ' insertion du calcul du solde : p_formule = "=e" & p_nblignes & "+b" & p_nblignes+1 p_ofl.getcellbyposition(4,p_nblignes).setformula(p_formule) ' si le solde d'en dessous n'est pas vide, il faut le recalculer sur la case qu'on vient d'insérer if p_ofl.getcellbyposition(4,p_nblignes+1).getformula <> "" then p_formule = "=e" & p_nblignes+1 & "+b" & p_nblignes+2 p_ofl.getcellbyposition(4,p_nblignes+1).setformula(p_formule) endif ofl.getCellByposition(5,a_nblignes).setformula(a_clef) ' on inscrit la clef de l'opération dans la feuille opération end sub
Or, ce n'est pas le cas, l'ordre chronologique n'est pas toujours respecté, je ne comprends pas pourquoi. Quand j'exécute le programme pasà pas sur un certain nombre d'opérations, tout se passe pourtant bien...
Quelqu'un aurait-il une idée ?
Je précise que toutes les cellules contenant les dates sont bien en format texte.
Bonne fin de journée,
Partager