macro qui crée un compte de résultat à partir de balance

luno123

XLDnaute Occasionnel
Bonjour,

Je souhaiterais créer une macro qui me permettrait à partir de ma balance mensuelle, de générer mon compte de résultat mensuel(feuille résulat annuel).
La colonne "C" de l'onglet "résultat annuel" (en vert) permet de savoir les comptes de la balance qui sont utilisés pour aboutir au résultat.

Je vous remercie d'avance pour votre aide précieuse.

Cordialement

Luno

PS/ les chiffres utilisés dans mon exemple sont fictifs.
 

Pièces jointes

  • Compte résultat.xls
    196.5 KB · Affichages: 854

Excel-lent

XLDnaute Barbatruc
Re : macro qui crée un compte de résultat à partir de balance

Salut Luno123,

Regarde le post suivant (le 6ème) : comment gérer deux onglets via une macro

Cela te sera très utile pour ta macro.

Mise en application, avec le lien ci-dessus tu arriveras à écrire le code ci-dessous

VB:
Sub BalanceJanvier()
Sheets("Balance 2012").Select
With Sheets("Résultat annuel")
     .Range("C9:C11,C13:C22,C24:C36,C38:C62,C65:C67,C69:C73").ClearContents
     'pour effacer les données mises précédemment
     .Range("C9") = Range("C257")+Range("C258")+...+Range("C272")-Range("C273")
     .Range("C11") = Range("C274")+Range("C275")+...+Range("C278")
     .Range("C14") = Range("C15")+Range("C16")+Range("C17")+Range("C18")
     ' et ainsi de suite
 End With

Je le conçois, ce code sera long à écrire et fastidieux, mais simple à comprendre et très formateur dans ton apprentissage du VBA.

Et si tu lis l'ensemble du sujet transmis ci-dessus, tu pourras même simplifier ton code de la façon suivante :
VB:
Sub BalanceJanvier()
Sheets("Balance 2012").Select
With Sheets("Résultat annuel")
     .Range("C9:C11,C13:C22,C24:C36,C38:C62,C65:C67,C69:C73").ClearContents
     'pour effacer les données mises précédemment
     .[C9] = [C257]+[C258]+...+[C272")-[C273]
     .[C11] = [C274]+[C275]+...+[C278]
     .[C14] = [C15]+[C16]+[C17]+[C18]
     ' et ainsi de suite
 End With

Au faite, qu'elle sont tes connaissances en VBA? C'est pour savoir les étapes qu'on peut sauter, on s'il faut tout t'expliquer en partant de zéro.

Faut-il partir de vraiment zéro?
-> expliquer où il faut mettre les macros

Et pour la suite? Jusqu'à qu'elle point faut-il détailler les prochaines étapes?
1/ raccourcir ton code en utilisant la formule SOMME() en language VBA
A ce propos, il existe deux méthodes :
-> écrire dans la cellule ... juste le RESULTAT obtenu par la formule
-> écrire dans la cellule ... la formule
2/ expliquer les boucles pour raccourcir le code
3/ le corps de la macro étant faite, compliquer tout cela pour pouvoir gérer les autres mois. En effet, le plus simple serait de recopier EXACTEMENT la même macro que ci-dessus, en remplaçant juste (pour le mois de Février) :
-> les "C" par des "F" pour les références ayant attrait à la feuille "Résultat annuel"
-> les "C" par des "E" pour les références ayant attrait à la feuille "Balance 2012"

Ce qui donnerais pour la seconde macro (celle gérant le mois Février)
VB:
Sub BalanceFévrier()
Sheets("Balance 2012").Select
With Sheets("Résultat annuel")
     .Range("F9:F11,F13:F22,F24:F36,F38:F62,F65:F67,F69:F73").ClearContents
     'pour effacer les données mises précédemment
     .[F9] = [E257]+[E258]+...+[E272")-[E273]
     .[F11] = [E274]+[E275]+...+[E278]
     .[F14] = [E15]+[E16]+[E17]+[E18]
     ' et ainsi de suite
 End With

Bref, tu obtiendras 12 macros!!!!! C'est looooooonnnnnnng et fastidieux à écrire et à lire!

Donc pour éviter cela : 12 macros quasiment identique, nous mettrons en place 2-3 boucles (regarde ce lien, ça t'aidera ;)) permettant d'écrire le code qu'UNE seule fois (et non pas 12), et tout cela dans UNE seule et unique macro.

Evidement pour cela il faudra également utiliser des variables.

Bref, si tu n'as aucune (ou très peu de connaissance en VBA), au lieu de lire juste le post 6 cité au début du message, lis l'intégralité du fil (80% des choses expliquées te seront fort utile pour ta(es) macro(s))

A te lire
Cordialement

PS. : en même temps que répondre à mes diverses questions, pense à nous envoyer ton nouveau fichier (complété par le code que tu auras réussi à écrire grâce aux explications ci-dessus), ainsi que tes questions éventuelles.
 
Dernière édition:

luno123

XLDnaute Occasionnel
Re : macro qui crée un compte de résultat à partir de balance

BonjourExcel - lent,

Tu es vraiment excellent!!! Ta réponseme semble fabuleuse!!!
Pour répondre à ta question sur mon niveau de VBA, je ne dirai pas que je suis un expert là dessus. J'arrive à faire des choses pas très compliqué mais quand ça commence à prendre des proportions comme ce que j'ai voulu demander, je redeviens débutant.
Je pense que je pourrai faire ta macro (longue) dans un premier temps. De toute façon, je vais essayer les 2 et je te tiens au courant. Je te l'accorde ça risque de me prendre beaucoup de temps. Mais je pense que c'est faisable. Pour l'instant je ferai ma macro,maxi sur janvier et février. Si ça fonctionne bien, je "l'étale" sur le reste.
A mon avis, j'aurai besoin de ton soutien et ceux des autres son "Exellence" pour mieux pauffiner tout ça.
Je te tiens au courant

Encore big up et merci beaucoup
 

luno123

XLDnaute Occasionnel
Re : macro qui crée un compte de résultat à partir de balance

Bonjour cher ami,

Voià ce que j'ai commencé, mais j'ai un souci de syntaxe d'entrée!
Je vous joins mon fichier au cas où...

Merci d'avance
 

Pièces jointes

  • Compte résultat avec macro.xls
    202 KB · Affichages: 342

Excel-lent

XLDnaute Barbatruc
Re : macro qui crée un compte de résultat à partir de balance

Bonjour Luno123,


luno123 à dit:
Pour l'instant je ferai ma macro,maxi sur janvier et février. Si ça fonctionne bien, je "l'étale" sur le reste.

Il ne faut faire QUE la macro pour Janvier 2012. Pas la peine de faire les autres mois, car si tu as compris pour Janvier, tu seras faire les autres mois.

Pas la peine de faire les deux versions ci-dessous :
(attention, elles sont légèrement différentes à celles transmises ci-dessus)
VB:
Sub BalanceJanvier()
Sheets("Balance 2012").Select
With Sheets("Résultat annuel")
     .Range("C9:C11,C15:C22,C26:C28,C30:C36,C40:C45,C47:C62,C65:C67,C69:C73").ClearContents
     ' je n'avais pas vu que tu avais des totaux AINSI que des sous totaux!
     ' le code précédemment transmis effacé les sous totaux des cellules
     ' C14 et C25 et C29 et C39 et C46 chose inutile.
    .Range("C9") = Range("C257")+Range("C258")+...+Range("C272")-Range("C273")
     .Range("C11") = Range("C274")+Range("C275")+...+Range("C278")
     ' plus besoin de la ligne  .Range("C14")........
     .Range("C15") = Range("C6")+Range("C7")+Range("C8")+...+Range("C17")
     ' et ainsi de suite
End With

VB:
Sub BalanceJanvier()
Sheets("Balance 2012").Select
With Sheets("Résultat annuel")
     .Range("C9:C11,C15:C22,C26:C28,C30:C36,C40:C45,C47:C62,C65:C67,C69:C73").ClearContents
     'pour effacer les données mises précédemment
    .[C9] = [C257]+[C258]+...+[C272]-[C273]
     .[C11] = [C274]+[C275]+...+[C278]
     .[C15] = [C6]+[C7]+[C8]+...+[C17]
     ' et ainsi de suite
 End With

Si tu as compris la différence entre les deux versions, pas la peine de faire les deux, tu peux passer directement à la deuxième version ;)

A priori, tu as lu les liens transmis mais ne semble pas avoir compris :

Dans la première version ci-dessus nous écrivons l'adresse de la cellule dans sa version longue Range("C9") : qui signifie cellule C9

Et qui dans sa version courte s'écrit [C9] : mais signifie exactement la même chose : cellule C9

luno123 à dit:
j'ai commencé, mais j'ai un souci de syntaxe d'entrée!

Autre point expliqué dans les liens transmis non compris également (à priori) : le point traitant de With...End With.

Nous allons donc décortiquer la seconde macro plus en détail (plutôt que reprendre l'explication, ce sera plus concret) :
VB:
Sub BalanceJanvier()
' La macro s'appelle "BalanceJanvier" : pas le droit de mettre d'espace, d'où l'utilisation de majuscule
' pour séparer les mots.
Sheets("Balance 2012").Select
' sélectionner la feuille (=onglet) "Balance 2012"
' donc à chaque fois que nous mettrons le nom d'une cellule, par exemple [C257]
' sans "point" devant, cela signifiera qu'il s'agit de la cellule C257 de la feuille "Balance 2012"
With Sheets("Résultat annuel")
' cela signifie qu'à chaque fois que nous parlerons des cellules de
' la feuille ("Résultat annuel"), nous mettrons un point devant
     .Range("C9:C11,C15:C22,C26:C28,C30:C36,C40:C45,C47:C62,C65:C67,C69:C73").ClearContents
     ' devant le mot Range il y a un point, donc cela signifie que nous parlons des cellules
     ' de la feuille "Résultat annuel"

     ' le code ".ClearContents" signifie : effacer le contenu des cellules mentionnées juste avant

     ' C9:C11   il y a deux points entre les deux adresses de cellules, cela signifie qu'on
     ' qu'on parle des cellules de C9 jusqu'à C11 : c'est a dire C9, C10 ET C11

     ' C11,C15  il y a une virgule entre les deux adresses de cellules, cela signifie qu'il
     ' s'agit d'une sélection MULTIPLE, c'est a dire qu'on sélectionne C11 ET C15
     ' mais pas la(es) cellule(s) entre les deux, dans notre cas : C12   C13  et C14

     ' Bref, la ligne de code ci-dessus signifie qu'il faut effacer le contenu des cellules
     ' C9 à C11 et C15 à C22 et C26 à C28 et C30 à C36 et C40 à C45 et C47 à C62 et C65 à C67 et C69 à C73

    .[C9] = [C257]+[C258]+...+[C272]-[C273]
     ' il y a un point de [C9], donc cela signifie qu'on parle de la cellule [C9]
     ' de la feuille "Résultat annuel"
     ' devant les autres cellules : [C257] et [C258] et [C272] et [C273]
     ' il n'y a pas de points, donc il s'agit des cellules de la feuille "Balance 2012"

     ' Bref cette ligne signifie : mettre dans la cellule C9 de la feuille "Résultat annuel"
     ' la somme des cellules [C257] et [C258] et ... et [C272] et [C273]
     ' de la feuille "Balance 2012"
     ' bien évidement il faut remplacer les trois petits points par les cellules voulu

     ' bref dans ce cas il fallait remplacer les trois petits points par
    '   [C259]+[C260]+[C261]+[C262]+[C263]+[C264]+[C265]+[C266]+[C267]+[C268]+[C269]+[C270]+[C271]

     ' en C9 de la feuille "Résultat annuel" tu as la formule 
     ' =-SOMME(BalanceAnnuelle!C257:C272)-BalanceAnnuelle!C273
     ' ce qui signifie que dans cette cellule tu veux mettre la somme des cellules
     ' C257 à C272 de la feuille "BalanceAnnuelle" auquel tu retranche la valeur
     ' contenu dans la cellule C273 de cette même feuille

     ' ce qui en language VBA simple s'écrit donc de la façon suivante :
     ' .[C9] = [C257]+[C258]+[C259]+[C260]+[C261]+[C262]+[C263]+[C264]+[C265]+[C266]+[C267]+[C268]+[C269]+[C270]+[C271]+[C272]-[C273]
 
     .[C11] = [C274]+[C275]+...+[C278]
      ' c'est exactement la même logique que la ligne précédente
     ' en C11 de la feuille "Résultat annuel" tu as la formule 
     ' =-SOMME(BalanceAnnuelle!C274:C278)
     ' ce qui signifie que dans cette cellule tu veux mettre la somme des cellules
     ' C274 à C278 de la feuille "BalanceAnnuelle"

     ' ce qui en language VBA simple s'écrit donc de la façon suivante :
     ' .[C11] = [C274]+[C275]+[C276]+[C277]+[C278]

     ' bref dans ce cas il fallait remplacer les trois petits points par 
     ' [C276]+[C277]

     .[C15] = [C6]+[C7]+[C8]+...+[C17]
     ' en C15 de la feuille "Résultat annuel" tu as la formule 
     ' =SOMME(C6:C17)
    ' ce qui signifie que dans cette cellule tu veux mettre la somme des cellules
     ' C6 à C17 de la feuille "BalanceAnnuelle"

     ' ce qui en language VBA simple s'écrit donc de la façon suivante :
     ' .[C15] = [C6]+[C7]+[C8]+[C9]+[C10]+[C11]+[C12]+[C13]+[C14]+[C15]+[C16]+[C17]

     ' bref dans ce cas il fallait remplacer les trois petits points par 
     ' [C9]+[C10]+[C11]+[C12]+[C13]+[C14]+[C15]+[C16]

      ' Maintenant c'est là que commence ton travail il faut que tu traite
      ' les cellules suivantes :

      ' celles où il n'y a pas de totaux : C12, C23, C37, C63, ...
      ' bref les cellules où tu as mis la police en gras et de couleur bleu foncé et noir

      ' celles où il n'y a pas de sous-totaux : C14, C25, C29, C39 et C46
      ' dommage que tu n'es pas mis une police particulière pour les sous-totaux.
      ' cela m'aurais évité de me planter! Ca m'apprendra à lire en diagonale ton fichier

      ' bref il te reste à écrire :
     .[C16] = ...  'n'oublie pas ;) "trois petits points" signifie que tu dois compléter la suite
     ' sans oublier évidement d'effacer ces fameux petits points ;)
     .[C17] = '...
     .[C20] = '...
     .[C21] = '...

     ' et ainsi de suite
 End With

Tu as remarqué? Dans un code VBA :
-> il ne faut pas lésiner sur les retraits de lignes pour rendre le code plus clair
-> lorsqu'on veut écrire un commentaire, pour expliquer à excel qu'il ne s'agit pas d'un code et qu'il ne faut pas en tenir compte on met devant le signe apostrophe : '
-> on peut très bien mettre le signe apostrophe au début de la ligne, mais également au milieu
-> toute la partie commentaire (qui suit l'apostrophe) VBA l'écrit en vert, ce qui permet de bien faire le distingo entre le code et les commentaires.

Il ne faut surtout pas lésiner sur les commentaires. Ecrire ce que fais chaque ligne. Ainsi, lorsque tu retourneras dans ton code dans quelques jours, si tu as oublié la signification de tel ou tel code, tu n'auras qu'à lire le commentaire pour te remettre rapidement dans le bain.

Bonne continuation.

PS. : je regarderais régulièrement ce fil pour continuer à t'aider (en semaine généralement je viens sur le site entre 13H30 et 14H00 et le soir).
 
Dernière édition:

luno123

XLDnaute Occasionnel
Re : macro qui crée un compte de résultat à partir de balance

Son Execel -lence,

Tes explications sont parfaites! C'est vraiment sympa de ta part de te pencher sur mon souci.
J'ai essayé le code VBA et ça marche à merveil!!! Je vais finir ma macro qui va être longue si je veux finir mon tableau de résultat.

Ensuite je la pauffine et je te tiens au courant.

ça fait plaisir de croiser (sur le net) des gens comme toi. Tu ne te contentes pas juste de donner la solution. Tu offres les outils aux gens et ils essaient de progresser en essayant tout seul.


Ci-joint mon nouveau fichier que je vais améliorer

A bientôt.

Merci d'avance
 

Pièces jointes

  • Compte résultat avec macro excel lent.xls
    217 KB · Affichages: 194
  • Compte résultat avec macro excel lent.xls
    217 KB · Affichages: 237
  • Compte résultat avec macro excel lent.xls
    217 KB · Affichages: 212
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : macro qui crée un compte de résultat à partir de balance

Bonsoir Luno123,

Pas de quoi, je continue à suivre ton "post" chaque fois que je peux, pour t'épauler.

J'ai regardé ta pièce jointe, comme tout est parfait pour l'instant, et que je n'ai rien à dire, je profite de l'occasion pour te transmettre cette astuce supplémentaire qui t'aidera sur ce fichier mais également tous les futurs fichiers.

Imaginons que je ne t'ai pas donné le code : .ClearContents qui permet d'effacer le contenu d'une cellule (ou plusieurs cellules).

Que faire? Tout simple :

-> lancer l'enregistreur de macro : cliquer sur "outils" / "macro" / "nouvelle macro..."

-> dans la zone "nom de la macro" : mettre le nom de ta macro (pas le droit aux espaces), par exemple TestEffacementCellules

-> dans la zone Touche de raccourci : pas la peine de renseigner. Rarement utilisé, c'est pour créer un raccourci clavier. Par exemple si tu écris "R", à chaque fois que tu cliqueras sur "Ctrl" + "R", la macro se lancera. Pas utilisé car il faut retenir le raccourci clavier et seul le concepteur du fichier le connaîtra. Donc on préfère mettre des boutons pour lancer une macro, où la faire déclencher automatiquement par exemple à l'ouverture du fichier, à sa fermeture, lorsque l'utilisateur saisie "..." dans la cellule ..., ou tout pleins d'autres méthodes.

-> dans la zone "enregistrer la macro dans" : laisser la valeur par défaut "ce classeur"

-> dans la zone "description" : écrire ce que fera la macro. Là tu as le droit aux espaces et Cie.

-> puis cliquer sur "ok"

-> a partir de maintenant, et jusqu'à ce que tu arrête la macro, Excel enregistrera et traduira toutes tes opérations en language VBA.

-> dans le cas présent, à l'aide de la souri tu sélectionne les cellules : C9 à C11 et C15 à C22 et C26 à C28 et C30 à C36 et C40 à C45 et C47 à C62 et C65 à C67 et C69 à C73

(pour faire une sélection multiple utiliser la touche "Ctrl" -> tu connais déjà je suppose?)

-> puis appuyer sur la touche "suppr" pour effacer le contenu de toutes ces cellules.

-> arrêter la macro (par exemple en cliquant sur "Outils" / "Macro" / "Arrêter la macro"

Ensuite tu vas dans l'éditeur de macro VBA en cliquant sur "Alt" + "F11"

Tu regarde dans Module1 ou Module2 ou Module... ta macro est écrite :)

Dans notre cas, tu verras un code dans ce style :
ActiveWindow.SmallScroll Down:=-15
Range("C9:C11,C15:C22,C26:C28,C30:C36,C40:C45,C47:C62,C65:C67,C69:C73").Select
Range("C69").Activate
Selection.ClearContents

La première ligne de code indique que j'ai utilisé la roulette de ma souris pour descendre de 15 crans vers le bas. Cela ne sert strictement à rien de déplacer la fenêtre vers le bas! Donc on peut supprimer cette ligne purement et simplement.

La seconde ligne signifie qu'on a sélectionné la zone ...

Tu regarde le code et vois qu'il y a entre C9 et C11 ":" or tu sais que tu as sélectionné les cellules C9 à C11.
Donc au cas où tu aurais oublié, tu saisi ainsi que pour sélectionner les cellules C9 à C11 il faut mettre ":" entre les deux adresses.

Moyen mémo technique pour le retenir, lorsque tu utilise la fonction SOMME() dans excel, il utilise exactement la même syntaxe! Pour dire, faire la somme des cellules C9 à C11, tu écris :
=SOMME(C9:C11)

Ensuite, tu regarde le symbole situé entre C11 et C15, c'est une virgule. Donc en déduis très justement que pour séparer chaque zone de sélection, il faut mettre une virgule entre chaque zone (zone C9 à C11 et la zone C15 à C22).

La troisième ligne indique que la cellule active, la cellule où tu te trouve est la cellule C69! Dans notre cas, nous n'avons pas besoin de cela. Donc nous l’effaçons. Rassure toi, au début, savoir distinguer les choses utiles et inutiles est difficile. Bref, mieux vaut trop en laisser qu'enlever un truc utile.

La quatrième ligne indique qu'il faut effacé le contenu des zones précédemment sélectionné.

Bref, après nettoyage on obtient le code suivant :
Range("C9:C11,C15:C22,C26:C28,C30:C36,C40:C45,C47:C62,C65:C67,C69:C73").Select
Selection.ClearContents

A tout hasard, on test la macro ainsi obtenu pour s'assurer que nous n'avons pas enlevé un truc important. Tout fonctionne c'est parfait! (s'il y a un bug, c'est surement que tu as effacé une ligne de code utile, donc il te suffit de revenir en arrière et remettre la dernière ligne de code effacé, et ainsi de suite)

On peut donc maintenant raccourcir un peu le code. Comme indiqué, le fait de sélectionner allonge le code, fait perdre du temps à Excel donc on le supprime.

Nous arrivons donc au code suivant :
Range("C9:C11,C15:C22,C26:C28,C30:C36,C40:C45,C47:C62,C65:C67,C69:C73").ClearContents

Il faut savoir que lorsqu'on ne précise pas le nom de la feuille où il faut effectuer cette opération : effacer le contenu des cellules ... par défaut excel le fera sur la feuille active (la feuille sur laquelle se trouve Excel à ce moment).

Soit c'est la bonne feuille, donc pas la peine d'alourdir ni d'allonger le code pour dire à Excel quelque chose qu'il sait déjà.

Soit tu veux travailler sur une autre feuille, auquel cas tu le précise :
Sheets("nom de ta feuille").Range("C9:C11,C15:C22,C26:C28,C30:C36,C40:C45,C47:C62,C65:C67,C69:C73").ClearContents

Oui mais là tu vas me dire très justement : "je ne connais pas la syntaxe Sheets("nom de ta feuille"). comment je pouvais le deviner?

Tu te place volontairement sur le mauvais onglet, puis tu utilise à nouveau l'enregistreur de macro, et là... tu sera obligé, avant de sélectionner tes cellules, CLIQUER sur l'onglet adéquat.

Et une fois la macro arrêté, lorsque tu iras voir ta macro, tu y verras la solution : Sheets("nom de ta feuille").

Sinon, comme vu précédemment tu peux faire ainsi :
With Sheets("nom de ta feuille")
.Range("C9:C11,C15:C22,C26:C28,C30:C36,C40:C45,C47:C62,C65:C67,C69:C73").ClearContents
End With

Oui mais si tu travail sur la feuille "nom de ta feuille" qu'UNE fois, l'utilisation du With... End With n'est pas rentable. Autant prendre la solution juste au dessus. Plus court à écrire : 2 lignes de code en moins.

Ou bien comme cela :
Sheets("nom de ta feuille").Select
Range("C9:C11,C15:C22,C26:C28,C30:C36,C40:C45,C47:C62,C65:C67,C69:C73").ClearContents

Mais là tu vas me dire, pourquoi sélectionner la feuille? Car imaginons que l'utilisateur est sur un onglet "autre", et qu'à la fin de la macro tu veuille que la macro rende la main à l'utilisateur sur l'onglet "nom de ta feuille". Autant la sélectionner dès le départ. Ca nous arrange pour le code, et cela nous évitera d'avoir à le faire à la fin.

luno123 à dit:
ça fait plaisir de croiser (sur le net) des gens comme toi

Plaisir partagé. Ca fait plaisir de rencontrer quelqu'un qui veut comprendre ce qu'il fait et l'assimiler pour l'utiliser ultérieurement sur d'autres fichiers. Et merci d'avoir fait l'impasse sur mes fautes d'orthographe.

Bon apprentissage et bon courage.
 
Dernière édition:

luno123

XLDnaute Occasionnel
Re : macro qui crée un compte de résultat à partir de balance

Bonsoir Excel - lent,

Encore merci pour toutes ces explications. Tu es ma bible!!! Sinon une petite question: quand je lance ma macro, la mise à jour se fait correctement certes, par contre au lieu d'ouvrir l'onglet "résultat mensuel", elle ouvre systématiquement l'onglet " balance annuelle.
Comment faire? STP...

Merci d'avance.

Je finis de la mettre en place et je reviendrai certainement vers toi pour d'autres questions si tu le permets...

Bonne soirée
 
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : macro qui crée un compte de résultat à partir de balance

Bonsoir Luno123,

luno123 à dit:
au lieu d'ouvrir l'onglet "résultat mensuel", elle ouvre systématiquement l'onglet " balance annuelle.
Comment faire? STP...

Si tu regarde le début du code, tu verras que nous avons écrit :
Sheets("Balance 2012").Select

Donc logique, Excel sélectionne la feuille (onglet) nommé "Balance 2012". Or jusqu'à la fin de la macro, comme il n'y a pas d'autre Sheets("...nom d'onglet...").Select logique, lorsque la macro se termine, nous sommes toujours sur l'onglet sélectionné au départ : "Balance 2012"

La solution la plus simple et la plus rapide à écrire :
Rajouter à la fin de la macro (juste avant End Sub) : merci de bien vouloir sélectionner l'onglet "Résultat mensuel".

Ce qui donne ...
Sheets("Résultat mensuel").Select

Pour trouver la réponse tout seul :
-> se placer sur le mauvais onglet
-> lancer l'enregistreur de macro
-> sélectionner l'onglet "Résultat mensuel"
-> arrêter l'enregistreur de macro

Tu obtiens la macro suivante :
VB:
Sub SélectionnerOngletRésultatMensuel()
'
' Macro enregistré par Excel-lent
' Comment sélectionner l'onglet Résultat mensuel?
'

    Sheets("Résultat mensuel").Select
End Sub

Ensuite il te restait plus qu'à prendre la ligne de code ainsi trouvé : Sheets("Résultat mensuel").Select

Et de la placer à la fin de la macro.

Bon test et à bientôt
 
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : macro qui crée un compte de résultat à partir de balance

Salut Luno123,

luno123 à dit:
Je finis de la mettre en place et je reviendrai certainement vers toi pour d'autres questions si tu le permets...

Ben oui, car après il nous reste à voir :
-> comment créer un bouton
-> comment affecter la macro nouvellement créé à ce bouton
-> puis attaquer le chapitre "boucle" et "variable" pour pouvoir faire les autres mois.

Lorsque tu es prêt, met en ligne ton nouveau fichier avec ta macro et nous passerons à la suite.

Bonne fin de soirée
 

luno123

XLDnaute Occasionnel
Re : macro qui crée un compte de résultat à partir de balance

Excel-lent,

Ci-joint mon fichier que j'ai travaillé (pas fini il me reste à remplir les parties en jaune). Tu me dis ce que tu en penses avant que je te poses des questions...
 

Pièces jointes

  • Compte résultat avec macro excel lent.xls
    211 KB · Affichages: 143
  • Compte résultat avec macro excel lent.xls
    211 KB · Affichages: 171
  • Compte résultat avec macro excel lent.xls
    211 KB · Affichages: 175
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : macro qui crée un compte de résultat à partir de balance

Salut luno123,

Depuis le temps, je croyais que tu t'étais perdu lol

J'ai regardé ton fichier, rien à redire, tout roule pour l'instant, ormis que cela n'a pas avancé bien vite ;)

Mais il faut être patient, Rome ne s'est pas faite en un jour!

Pour te faire gagner du temps, je t'ai légèrement mâché le travail, il te reste plus qu'à compléter le fichier ci-joint et poser ces fameuses questions ;)

Bonne fin de WE.

Edition : je n'avais pas vu, dans certaines cellules tu avais mis un signe (-) devant tes fonctions sommes! J'ai donc corrigé dans le code ci-joint mes erreurs.
Comme tu peux le voir la règle des signes et des parenthèses reste la même que celle apprise au Lycée :
-> le signe moins devant la parenthèse inverses tous les "+" et tous "-" qui se trouvent entre parenthèse
-> la multiplication et la division sont prioritaires sur l'addition et la soustraction
-> on peut imbriquer ou mettre à la suite, autant de parenthèse qu'on le souhaite (ou presque)
 

Pièces jointes

  • Compte résultat avec macro excel lent.xls
    211.5 KB · Affichages: 143
  • Compte résultat avec macro excel lent.xls
    211.5 KB · Affichages: 137
  • Compte résultat avec macro excel lent.xls
    211.5 KB · Affichages: 123
Dernière édition:

luno123

XLDnaute Occasionnel
Re : macro qui crée un compte de résultat à partir de balance

Exel-lent,

Désolé pour ce long silence.
Un peu souffrant ces derniers temps.
Voilà mon fichier.
Maintenant j'aimerai bien stp savoir comment l'affiner en remplissant par exemple les autres mois sans me taper toute la macro à refaire pour les 11 autres.

Merci d'avance
 

Pièces jointes

  • Compte résultat enfin travaille.xls
    229.5 KB · Affichages: 123
  • Compte résultat enfin travaille.xls
    229.5 KB · Affichages: 145
  • Compte résultat enfin travaille.xls
    229.5 KB · Affichages: 148

Gruick

XLDnaute Accro
Re : macro qui crée un compte de résultat à partir de balance

Bonjour Luno, Excel-lent (mais moins en Suzuk...)

Tu trouveras dans le fichier joint une autre macro inspirée de la tienne.
Elle te demandera de cliquer sur le mois que tu veux traiter, et fera la suite.

Le Select Case du début et ce qui suit a pour but de déterminer la colonne de recopie (c) et celle qui doit être recopiée(d).

Le reste n'est que l'adaptation de ta propre macro.
J'ai utilisé Cells, c'est moins ch... à programmer que Range.
J'ai fait mes essais sur le mois de Mai, en reprenant tes chiffres de janvier, ainsi, j'ai pu vérifier si c'est OK.
Je te laisse le soin pour la présentation.

Gruick
 

Pièces jointes

  • Compte résultat enfin travaille.xls
    276 KB · Affichages: 284
  • Compte résultat enfin travaille.xls
    276 KB · Affichages: 300
  • Compte résultat enfin travaille.xls
    276 KB · Affichages: 264

Excel-lent

XLDnaute Barbatruc
Re : macro qui crée un compte de résultat à partir de balance

Bonsoir Gruick,

Gruick à dit:
Excel-lent (mais moins en Suzuk...)

Dommage, car cette marque est très réputé pour sa robustesse, sa fiabilité, et son prix à la portée de toutes les bourses :)

Tu as quel marque? modèle?

Bonsoir Luno123,

Comme tu as pu le remarquer, le code est facile à comprendre et à écrire, mais il est long.

Pour le raccourcir il faut utiliser des variables et des boucles.

Les variables :
il existe plusieurs types de variables, les voici listés et expliqué ici.

Dans notre cas, nous aurions besoin des variable de types : "Long" car ces variable contiendrons le numéro de ligne traité sur la feuille "Résultat Annuel" et "Balance Annuelle", or sur :
-> Excel 2003 : le nombre maximum de ligne est de 65 536
-> Excel 2007 et 2010 : le nombre maximum de ligne est de 1 048 576

Et deux autres variables de type : "Integer" car ces variables contiendrons les numéro de colonne des deux feuille, or sur :
-> Excel 2003 : le nombre maximum de colonne est de 256
-> Excel 2007 et 2010 : le nombre maximum de colonne est de 16 384

Il faut définir les variables au début de ta macro pour lui donner la liste des variables et le type de données qu'elles contiendrons. Pour cela nous procédons ainsi :
Dim NuméroColonneOngletBalanceAnnuelle As Integer
Dim NuméroColonneOngletRésultatAnnuel As Integer
Dim NuméroLigneOngletBalanceAnnuelle As Long
Dim NuméroLigneOngletRésultatAnnuel As Long

Ensuite il ne reste plus qu'à mettre un chiffre dans la variable, et ainsi à chaque que l'on voudra ce chiffre, on mettra dans le code le NOM de la variable. Pour cela on procède ainsi :
'On définit les variables au début de la macro, comme vu ci-dessus

'Puis on dit le chiffre (ou le texte, ou ...) que contiendrons ces variables
NuméroColonneOngletBalanceAnnuelle = 5
NuméroColonneOngletRésultatAnnuel = 2
NuméroLigneOngletBalanceAnnuelle = 55
NuméroLigneOngletRésultatAnnuel = 41

'... suite de ta macro

Autre point important sur ce sujet, comme tu as pu le voir, pour que ton code soit plus facile à comprendre, il faut utiliser des noms de variable parlants. Or comme nous n'avons pas le droit aux espaces et caractères spéciaux, on colle tous les mots, et pour les distinguer les uns des autres, nous mettons une majuscule au début de chaque mot.

Les cellules :
Comme tu as pu le voir, on peut définir en VBA l'adresse d'une cellule de la façon suivante : [A51]

Mais lorsqu'on veut une adresse de cellule qui doit changer, on doit utiliser une variable. Dans ce cas on écrit [A51], de la façon suivante : Cells(51, 1)

Comme tu peux le voir, deux choses différent :
-> le numéro de la ligne n'est pas en seconde position, mais en première. Et pour la colonne c'est l'inverse.
-> au lieu de mettre le nom de la colonne avec une lettre, on l'écrit avec un chiffre. Lorsqu'on parle de la colonne :
----- "A" on écrit 1
----- "B" on écrit 2
----- "Z" on écrit 26
----- "AA" on écrit 27
----- ...

Comme tu peux le voir, c'est beaucoup plus pratique. Car lorsqu'on traite la première fois la colonne A, puis la colonne C, puis la colonne E.

On peut écrire :
NuméroColonne = NuméroColonnePrécédent + 2

Les boucles (voici la liste des principales, ainsi que quelques explications) :

Pour notre part, nous n'allons utiliser que la boucle : For... To... Next

Un exemple concret, simple et expliqué :

VB:
Dim NuméroColonne as Integer
' La variable NuméroColonne va contenir un(des) chiffre(s) entier inclus entre -32 768 et 32 767

NuméroColonne = 0
' Mettre le chiffre 0 dans la variable NuméroColonne

For i = 1 To 12
' La première que nous exécuterons cette boucle, la variable "i" contiendra le chiffre 1
' La seconde fois que nous exécuterons, la variable "i" contiendra le chiffre 2
' ...
' La douzième fois, la variable "i" contiendra le chiffre 12

    Cells(1, NuméroColonne + i ) = "A"
    ' Dans la cellule ayant pour numéro de ligne 1
    ' et pour numéro de colonne : la valeur contenu dans la variable "NuméroColonne" c'est à dire 0
    ' à laquelle on rajoute la valeur contenu dans la variable i (1 la première fois, 2 la seconde fois, ...)
    ' on écrit la lettre A

Next i
' Si la valeur contenu dans "i" est inférieur à 12 on exécute à nouveau le code situé entre "For i = 1 To 12" et "Next i"
' Sinon on sort de la boucle et continuons à lire le code en dessous de cette boucle

Le code ci-dessus permet d'écrire "A" dans les cellules A1, B1, C1, D1, E1, F1, ..., L1

Code sans explication :
VB:
Dim NuméroColonne as Integer

NuméroColonne = 0

For i = 1 To 12
    Cells(1, NuméroColonne + i ) = "A"
Next i

Alors que sans une boucle tu aurais dû écrire :
VB:
Range("A1") = "A"
Range("B1") = "A"
Range("C1") = "A"
Range("D1") = "A"
Range("E1") = "A"
Range("F1") = "A"
Range("G1") = "A"
Range("H1") = "A"
Range("I1") = "A"
Range("J1") = "A"
Range("K1") = "A"
Range("L1") = "A"

Alors imagine s'il avait fallu écrire "A" dans les cellules A1 à AZ1 ;)

Tu trouveras ci-joint ton fichier ainsi modifié

Je te laisse essayer et poser les questions qui te viennent?

Comme tu pourras le voir, la macro a été adapté pour pouvoir accueillir la boucle permettant de traiter tous les mois.

Comme pour les fonctions SI(), et compagnie tu peux imbriquer plusieurs boucles les unes dans les autres. Dans ce cas il est important de bien faire des retraits de lignes pour bien visualiser chaque boucle. Il faut mettre au même niveau le début de la boucle "For i = 1 To 12", que la fin de la boucle "Next i", et le code qui se trouve à l'intérieur, on le pousse vers la droite (à l'intérieur).

Bon apprentissage.
 

Pièces jointes

  • Compte résultat enfin travaille.xls
    219.5 KB · Affichages: 243
  • Compte résultat enfin travaille.xls
    219.5 KB · Affichages: 245
  • Compte résultat enfin travaille.xls
    219.5 KB · Affichages: 252
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 202
Messages
2 086 180
Membres
103 152
dernier inscrit
Karibu