Macro VBA Actualisation automatique Formule mensuelle

Macro VBA Actualisation automatique Formule mensuelle - VB/VBA/VBS - Programmation

Marsh Posté le 10-04-2012 à 21:53:32    

Bonjour, :hello:  
 
J'aimerais développer une macro sous Excel mais j'ai un peu de mal avec sa programmation.
J'ai une feuille n°1 excel de gestion préparé avec tous les mois de l'année que je remplis au fur et à mesure toutes les fin de mois.
J'ai une autre feuille n°2 qui utilise ces données mensuelles afin de calculer la marge que j'ai par rapport au prévisionnel de mon projet.  
 
J'aimerais qu'à chaque fois que je rentre des données dans mon mois écoulé, le calcul de cette marge se fasse automatiquement sans que j'ai besoin de changer les colonnes dans ma formule.  
 
Par exemple, Feuil2!Marge Mars = Feuil1!Réalisé Mars - Feuil2!Prévisionnel Mars
 
Une fois que j'ai copié mes données du mois d'Avril, j'aimerais que ma macro s'éxécute et que la cellule qui contenait ma Marge de Mars soit remplie automatiquement par la Valeur de ma Marge en Avril. Peut-être qu'il faudrait que Excel fasse le calcul pour Mars tant que Avril est vide par exemple et ainsi de suite pour tous les mois mais je n'y arrive pas à rendre ça automatique.
 
J'aimerais ensuite étendre ce calcul à plusieurs projets qui sont alignés ligne par ligne mais je pense pouvoir m'en sortir si j'ai le début du code pour une cellule.
 
J'espère avoir été clair sinon je peux m'expliquer plus en détail.  
J'aimerais que vous me donniez des pistes pour le code afin que je puisse implémenter ça à mon tableur.
 
Merci énormément pour votre aide  :D  

Reply

Marsh Posté le 10-04-2012 à 21:53:32   

Reply

Marsh Posté le 11-04-2012 à 07:43:08    

Bonjour,
 
Voici comment tu pourrais boucler sur tes feuilles pour trouver la dernière renseignée :

Code :
  1. Sub test()
  2. Dim mois(5) As String ' à modifier pour mettre mois(11) + le nom des onglets dans l'ordre
  3.      mois(0) = "janvier"
  4.      mois(1) = "fevrier"
  5.      mois(2) = "mars"
  6.      mois(3) = "avril"
  7.      mois(4) = "mai"
  8.      '... etc
  9. Dim sh As Worksheet
  10. Dim i As Integer
  11. For i = 0 To 4 ' à modifier en "... To 11"
  12.     If Sheets(mois(i - 1)).Cells(1, 1).Value = "" Then
  13.         Set sh = Sheets(mois(i-1))
  14.         Exit For
  15.     End If
  16. Next i
  17. MsgBox "La page non vide est : " & sh.Name
  18. Set sh = Nothing
  19. End Sub


 
En gros, tu crées un tableau contenant tous tes noms d'onglet. Le tableau va de 0 à 11 => 1 par mois.
Tu boucle sur les noms de feuilles de 0 à 11 et dès que tu trouves une cellule non renseignée (j'ai mis cells(1, 1) dans l'exemple = A1) tu récupères la feuille d'avant (Set sh = Sheets(mois(i-1))).
 
Il faudra penser à gérer les erreurs car dans cet exemple, si le premier onglet est vide, ça doit planter. Le cas où il n'y a aucun onglet de vide n'est pas géré non plus.
 
Ensuite, si tu veux que la macro se lance à chaque modification, il faudra que tu la mettes dans ThisWorkbook, dans l'événement SheetSelectionChange ou autre, tu trouvera facilement sur google.


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

Marsh Posté le 11-04-2012 à 20:31:11    

Merci beaucoup de ta proposition mais ce n'est pas exactement ce que je veux. Mes données de tous les mois sont dans une seule et même feuille c'est seulement ma marge qui est dans une autre... Mais ce n'est pas mon problème principal.
 
C'est plutôt de faire une boucle qui part de décembre et qui dit tant que le mois m n'est pas rempli je passe au mois précédent m-1. A chaque fois que je rentre des nouvelles données mensuelles, il faut que la macro le voit et qu'elle recalcule ma marge.
 
J'ai essayé d'écrire une macro mais j'ai un problème avec mes boucles imbriquées. On me dit qu'il manque un End For ou qqchose.  
Si vous pouviez m'aider à la corriger, je vous remercie d'avance.
 

Code :
  1. Sub Worksheet_Change(ByVal Target As Range)
  2.    If Target.Address = "$C11:CS43" Then
  3.        For i = 0 To 11
  4.            If Sheets("Feuil1" ).Cells(11, 12 - i).Value = "" Then Next i
  5.            Else: Sheets("Feuil2" ).Cells(8, 17).Value =Sheets("Feuil1" ).Cells(11, 12 - i).Value -Sheets("Feuil1" ).Cells(11, 12 -  (i - 1)).Value
  6.            End If
  7.    End If
  8.    Sheets("Feuil2" ).Select
  9. End Sub

Reply

Marsh Posté le 11-04-2012 à 20:39:07    

Il manque un next i entre les 2 end if.


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

Marsh Posté le 11-04-2012 à 20:45:10    

Ok super pour ta réponse rapide. Je vais tester ça demain au boulot!
Je laisse le Next i après le Then quand même du coup ou pas?
Qu'est-ce que je mets à la place du coup?
 
Merci d'avance

Reply

Marsh Posté le 12-04-2012 à 07:07:27    

Ah ouais, je l'avais pas vu celui là.
Tu vires cette condition et tu mets juste :

Code :
  1. For i = 0 To 11
  2.            If Sheets("Feuil1" ).Cells(11, 12 - i).Value <> "" Then
  3.                   Sheets("Feuil2" ).Cells(8, 17).Value =Sheets("Feuil1" ).Cells(11, 12 - i).Value -Sheets("Feuil1" ).Cells(11, 12 -  (i - 1)).Value
  4.            End If
  5. Next i


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed