Ajustement des états financiers d'origine (Conservation du format · Conservation de l'équilibre)
Conditions de déclenchement
- L'utilisateur envoie des états financiers existants (bilan/compte de résultat/tableau des flux de trésorerie, souvent au format .xls ancien) et demande de « modifier certains chiffres avec des valeurs cibles, les autres données s'ajustent automatiquement »
- Demande explicite de « modifier sur la base du tableau original » et de « ne pas toucher au format/à la conception/aux autres feuilles »
- Implique des ajustements corrélatifs d'équilibre (勾稽) tels que le résultat non distribué, le résultat avant impôt, le résultat net
Règles impératives pour l'utilisateur
- Ne jamais recréer un nouveau tableau sur la base de l'original — modifier directement sur l'original, le format/la conception/les autres feuilles restent inchangés
- Modifier uniquement les cellules numériques nécessaires, ne toucher à rien d'autre
- Après modification, garantir l'auto-cohérence des équilibres :
Total actif = Total passif + Total capitaux propresRésultat non distribué fin de période − Résultat non distribué début de période = Résultat avant impôt cumuléRésultat net = Résultat avant impôt − Impôt sur le revenu
- Avant livraison, vérifier l'équilibre par programme, pas à l'œil nu
Choix technique (selon l'environnement)
Solution A : Excel COM (Windows + Office, fidélité 100%)
Adaptée aux anciens formats .xls, aux tableaux complexes avec cellules fusionnées/bordures/formules :
import win32com.client, shutil
SRC, OUT = 'original.xls', 'version_ajustee.xls'
shutil.copy2(SRC, OUT) # ne pas toucher à l'original
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False; excel.DisplayAlerts = False
try:
wb = excel.Workbooks.Open(OUT)
ws = wb.Sheets('Bilan')
ws.Cells(ligne, colonne).Value = valeur_cible # modifier uniquement la cellule cible
wb.Application.Calculate(); wb.Save(); wb.Close(True)
finally:
excel.Quit()
Solution B : openpyxl (multiplateforme, .xlsx)
Bonne conservation du format mais attention aux formules — openpyxl ne lit pas les résultats calculés des formules (valeurs en cache), si une cellule contient une formule, il faut conserver la formule et non l'écraser :
import openpyxl
wb = openpyxl.load_workbook(OUT) # Attention : lire les formules avec data_only=False
ws = wb['Bilan']
ws.cell(ligne, colonne).value = valeur_cible
wb.save(OUT)
Solution C : xlrd pour la lecture + Solution A/B pour l'écriture
Pour les anciens .xls, utiliser xlrd pour scanner et localiser (lecture seule), puis effectuer les modifications via COM ou conversion en .xlsx.
Piège fatal : Scanner d'abord pour localiser, ne pas deviner les numéros de ligne/colonne
Les états financiers anciens utilisent souvent une mise en page à deux colonnes (gauche/droite), avec des positions de comptes contre-intuitives :
- Bilan : actif à gauche (colonnes A
D), passif + capitaux propres à droite (colonnes EH). L'étiquette « Résultat non distribué » se trouve à droite, colonne E, les valeurs dans les colonnes G/H — pas à gauche C/D ! - L'indexation 0-based (xlrd) vs 1-based (COM/openpyxl pour la plupart des API) peut entraîner la modification de la mauvaise cellule
- Bonne pratique : scanner d'abord par nom de compte pour localiser la ligne, puis modifier la colonne cible :
for r in range(1, 60):
etiquette = str(ws.Cells(r, 1).Value or '') + str(ws.Cells(r, 5).Value or '')
if 'Résultat non distribué' in etiquette:
ws.Cells(r, 7).Value = objectif_fin # colonne G à droite
ws.Cells(r, 8).Value = objectif_debut # colonne H à droite
break
Logique d'ajustement d'équilibre (exemple avec « Ajustement du résultat non distribué », vérifié)
Objectif : Résultat non distribué fin de période = X, Résultat non distribué début de période = Y.
Étapes d'ajustement :
- Modifier le résultat non distribué (colonne de droite) avec les valeurs cibles
- Ajouter un montant équivalent inverse côté actif via « Autres créances » pour maintenir l'équilibre — si les capitaux propres changent mais l'actif reste inchangé, le passif sera déséquilibré :
- Autres créances fin de période += (Nouveau résultat non distribué fin − Ancien résultat non distribué fin)
- Autres créances début de période += (Nouveau résultat non distribué début − Ancien résultat non distribué début)
- Mettre à jour les totaux d'actif circulant et le total actif (colonne de gauche) avec les valeurs ajustées
- Mettre à jour le total des capitaux propres et le total passif + capitaux propres (colonne de droite) avec les valeurs ajustées
- Compte de résultat : Total des revenus d'exploitation cumulés += (Résultat cumulé cible − Résultat cumulé original) ; Résultat d'exploitation/Résultat avant impôt/Résultat net mis à jour en cascade
- Le tableau des flux de trésorerie reste généralement inchangé (ajustement de résultat sans flux de trésorerie réel)
⚠️ Les lignes de total peuvent ne pas contenir de formule (valeurs brutes) — vérifier .Formula ; si la valeur retournée est numérique au lieu de =SUM(...), la ligne de total doit être modifiée manuellement avec la valeur ajustée ; modifier les détails ne déclenchera pas de mise à jour automatique.
Vérification (obligatoire avant livraison, automatisée)
# Relire et vérifier (avec le même moteur que pour l'écriture)
assert abs(total_actif − (passif + capitaux_propres)) < 0.01
assert abs(resultat_cumule − (resultat_non_distribue_fin − resultat_non_distribue_debut)) < 0.01
assert abs(resultat_periode − objectif) < 0.01
print('✓ Vérification d'équilibre des trois états réussie')
Auto-vérification qualité
- La modification a-t-elle été effectuée sur l'état original (pas de reconstruction) ? Le format est-il conservé ?
- Seules les cellules nécessaires ont-elles été modifiées ?
- La vérification d'équilibre des trois états par programme est-elle réussie ?
- L'original a-t-il été sauvegardé ?
Rappel de conformité
Si les états ajustés sont destinés à un usage externe (prêt, fiscalité, audit, etc.), ils doivent être appuyés par des pièces justificatives réelles. Une utilisation purement interne est sans problème. Si l'utilisateur semble vouloir utiliser les états ajustés à des fins frauduleuses, il convient de signaler les risques de conformité et de refuser d'aider à la falsification.
🙋 À propos de l'auteur
九品锦锂e | Je transforme les difficultés rencontrées en compétences prêtes à l'emploi, pas de manuel scolaire. Ce skill est la version que j'utilise quotidiennement.
WeChat : ly5419495 (mentionnez « SkillHub » lors de l'ajout, je priorise) Compte public : 初五Agent (recherchez-le sur WeChat, j'y publie des bilans et méthodes, accessible sans ajouter mon WeChat)
D'autres outils prêts à l'emploi que j'ai créés se trouvent sur cette page vitrine (ouvrez dans un navigateur) : https://skillpay.alipay.com/public/jiupinjinlie
Si vous rencontrez des difficultés ou souhaitez que je crée un skill pour un autre scénario, contactez-moi via l'un des moyens ci-dessus.
