Excel : execution automatiqued'une macro

mikmak2012 Messages postés 4 Statut Membre -  
m@rina Messages postés 27519 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je cherche à exécuter une macro lors de l'enregistrement du classeur qui la contient. Et je ne trouve pas comment faire ?

Merci de votre aide.
Configuration: Windows XP
Firefox 2.0.0.6

3 réponses

  1. m@rina Messages postés 27519 Date d'inscription   Statut Modérateur Dernière intervention   11 562
     
    Bonjour,

    Il te faut une macro événementielle à mettre dans ThisWorkbook.

    Dans la première liste déroulante, tu choisis Workbook.
    Dans la deuxième liste déroulante, tu choisis BeforeSave

    ce qui te donne :

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    
    End Sub


    Tu n'as plus qu'à insérer ton code.

    m@rina
    1
    1. mikmak2012 Messages postés 4 Statut Membre
       
      Salut Marina et merci pour ta réponse mais... ça marche pas.
      Je me suis planté dans ccm et j'ai mis le post comme résolu !
      Voici mon code. Dis-moi si tu vois ou ça m.....

      Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
      ThisWorkbook.total
      End Sub

      Public Sub total()

      Dim participants, NbColonnes, NbLignes, I, J As Integer
      Dim charges As Double
      Dim fonctionnement As Double
      Dim produits As Double


      Dim numFeuilles As Integer
      Dim numTotal As Integer

      numTotal = Worksheets.Count

      ' Traitement de chaque séjour
      For numFeuilles = 1 To (Worksheets.Count - 1)
      ' intitulé
      Worksheets(numTotal).Cells(numFeuilles + 1, 1) = Worksheets(numFeuilles).Name
      ' total participants prévus
      Worksheets(numTotal).Cells(numFeuilles + 1, 2) = Worksheets(numFeuilles).Range("total_participants").Value
      participants = participants + Worksheets(numFeuilles).Range("total_participants").Value
      ' total charges
      Worksheets(numTotal).Cells(numFeuilles + 1, 3) = Worksheets(numFeuilles).Range("prev_charges").Value
      charges = charges + Worksheets(numFeuilles).Range("prev_charges").Value
      ' total fonctionnement
      Worksheets(numTotal).Cells(numFeuilles + 1, 4) = Worksheets(numFeuilles).Range("prev_fonctionnement").Value
      fonctionnement = fonctionnement + Worksheets(numFeuilles).Range("prev_fonctionnement").Value
      ' % fonctionnement
      Worksheets(numTotal).Cells(numFeuilles + 1, 5) = Worksheets(numFeuilles).Range("prev_fonctionnement").Value / Worksheets(numFeuilles).Range("prev_produits").Value
      ' produits
      Worksheets(numTotal).Cells(numFeuilles + 1, 6) = Worksheets(numFeuilles).Range("prev_produits").Value
      produits = produits + Worksheets(numFeuilles).Range("prev_produits").Value
      ' Solde
      Worksheets(numTotal).Cells(numFeuilles + 1, 7) = Worksheets(numFeuilles).Range("prev_produits").Value - Worksheets(numFeuilles).Range("prev_charges").Value
      ' Solde + fonctionnement
      Worksheets(numTotal).Cells(numFeuilles + 1, 8) = Worksheets(numFeuilles).Range("prev_produits").Value + Worksheets(numFeuilles).Range("prev_fonctionnement").Value - Worksheets(numFeuilles).Range("prev_charges").Value
      Next
      'Totaux
      ' intitulé
      Worksheets(numTotal).Cells(numTotal + 1, 1).Value = "Total"
      ' total participants prévus
      Worksheets(numTotal).Cells(numTotal + 1, 2).Value = participants
      ' total charges
      Worksheets(numTotal).Cells(numTotal + 1, 3).Value = charges
      ' total fonctionnement
      Worksheets(numTotal).Cells(numTotal + 1, 4).Value = fonctionnement
      ' % fonctionnement
      Worksheets(numTotal).Cells(numTotal + 1, 5).Value = fonctionnement / produits
      ' produits
      Worksheets(numTotal).Cells(numTotal + 1, 6).Value = produits
      ' Solde
      Worksheets(numTotal).Cells(numTotal + 1, 7).Value = produits - charges
      ' Solde + fonctionnement
      Worksheets(numTotal).Cells(numTotal + 1, 8).Value = produits + fonctionnement - charges


      NbColonnes = Worksheets(numTotal).UsedRange.Columns.Count
      NbLignes = numTotal + 1
      For I = 1 To NbLignes
      For J = 1 To NbColonnes
      With Worksheets(numTotal).Cells(I, J)
      If .Value < 0 Then
      .Font.ColorIndex = 3
      Else
      .Font.ColorIndex = 1
      End If
      ' format général
      .Borders.ColorIndex = 1
      .Borders.Weight = xlThin
      .Borders.LineStyle = xlContinuous
      .Font.Bold = False
      .Interior.ColorIndex = 2
      ' 1ere ligne
      If I = 1 Then
      .Borders(xlEdgeTop).Weight = xlMedium
      .Interior.ColorIndex = 15
      .Font.Bold = True
      End If
      ' 1ere colonne
      If J = 1 Then
      .Borders(xlEdgeLeft).Weight = xlMedium
      .Font.Bold = True
      End If
      ' derniere ligne
      If I = NbLignes Then
      .Borders(xlEdgeTop).LineStyle = xlDouble
      .Borders(xlEdgeBottom).Weight = xlMedium
      .Font.Bold = True
      End If
      ' derniere colonne
      If J = NbColonnes Then
      .Borders(xlEdgeRight).Weight = xlMedium
      End If
      End With
      Next J
      Next I
      End Sub
      0
  2. m@rina Messages postés 27519 Date d'inscription   Statut Modérateur Dernière intervention   11 562
     
    Bonjour,

    Tu as fait deux macros !
    Je n'ai pas regardé ta macro "total" mais c'est le code de cette macro qui doit se trouver entre l'instruction "Private sub..." et "End sub"

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    
    Dim participants, NbColonnes, NbLignes, I, J As Integer 
    Dim charges As Double 
    Dim fonctionnement As Double 
    Dim produits As Double 
    
    
    Dim numFeuilles As Integer 
    Dim numTotal As Integer 
    
    numTotal = Worksheets.Count 
    
    ' Traitement de chaque séjour 
    For numFeuilles = 1 To (Worksheets.Count - 1) 
    ' intitulé 
    Worksheets(numTotal).Cells(numFeuilles + 1, 1) = Worksheets(numFeuilles).Name 
    
    etc...
    
    End Sub

    m@rina
    0
  3. Sir_DEC Messages postés 143 Statut Membre 75
     
    IL suffit sinon d'appeler total dans le macro BeforeSave -> Call total
    0
    1. m@rina Messages postés 27519 Date d'inscription   Statut Modérateur Dernière intervention   11 562
       
      Oui, tout à fait. Y a même pas besoin de la fonction CALL d'ailleurs, le nom de la macro suffit !

      m@rina
      0