Formules VBA

Bonsoir

j'ai une base de données état civil professionnel que je renseigne par un formulaire.
J'utilise des formule SI et SI(et pour trier les agents par zone d'affectation.

Je me retrouve avec une formule par ligne et multipliée par le nombre de zone et d'agents, Ca monte vite en milliers.

En passant par l'enregistreur de macro, je suis parvenue à trouver un début de solution.

Sub Formules()
With Worksheets("DONNEES")

Range("E2").FormulaR1C1 = _
"=IF(AND(RC[-3]=""infirmiére"",RC[-2]=""ZONE A""),IF(OR(RC[-1]=""titulaire"",RC[-1]=""stagiaire"",RC[-1]=""Contractuel CDI""),1,0))"
Range("E2").FormulaR1C1 = Range("E2").Value

Range("F2").FormulaR1C1 = _
"=IF(AND(RC[-4]=""Agent de Service hospitalier"",RC[-3]=""ZONE A""),IF(OR(RC[-2]=""titulaire"",RC[-2]=""stagiaire"",RC[-2]=""Contractuel CDI""),1))"
Range("F2").FormulaR1C1 = Range("F2").Value

Range("G2").FormulaR1C1 = _
"=IF(AND(RC[-5]=""Aide-Soignant"",RC[-4]=""ZONE A""),IF(OR(RC[-3]=""titulaire"",RC[-3]=""stagiaire"",RC[-3]=""Contractuel CDI""),1))"
Range("G2").FormulaR1C1 = Range("G2").Value
End With
End Sub

Il ne s'applique que sur la première ligne (2)

Comment l'appliquer sur toutes les lignes jusqu'à la dernière non vide ?

Je vous joins un fichier en exemple.

Merci de votre aide

https://www.cjoint.com/?3LjxDJeYbQE

7 réponses

  1. Bonjour
    j'essaye ce code mais la macro ne s'éxexute pas quand la valeur d'une cellule change
    Code placé dans l'évenement worksheets de la feuille données

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Integer
    i = ActiveCell.Row
    If Target.Address = Cells(i, 1).Address Then
    Call MACRO
    End If
    End Sub


    Bien cordialement
    0
  2. Bonjour Gyrus

    Merci de m'aider à trouver une solution

    l'idée du tcd est bonne , mais ne m'arrange pas dans mon cas de figure
    Du fait
    -de l'architecture de mon fichier et des tableaux e bord
    - des formules de calculs de périodes et de dates
    -...

    cordialement
    0
    1. Bonjour Via55

      Oui j'avais pensé et à cette astuce et je l'ai même essayé, mais mon fichier redevient comme avant puisque les formules se retrouvent à nouveau dans les cellules. Du coup mon fichier quadruple de taille et ralentit.

      Un rafraichissement par macro ? Est ce possible ?

      Cordialement
      0
      1. Re

        A ce moment si tu veux simplement rafraichir la ligne où il y a une modif tu peux dans la worksheet de la feuille concernée mettre une macro de ce type :
        Private Sub Worksheet_Change(ByVal Target As Range)
        n=target.row
        With Worksheets("DONNEES")
         .Range("E" & n).FormulaR1C1 = _
                "=IF(AND(RC[-3]=""infirmiére"",RC[-2]=""ZONE A""),IF(OR(RC[-1]=""titulaire"",RC[-1]=""stagiaire"",RC[-1]=""Contractuel CDI""),1,0))"
           .Range("E" & n).FormulaR1C1 = .Range("E" & n).Value
           
          .Range("F" & n).FormulaR1C1 = _
                "=IF(AND(RC[-4]=""Agent de Service hospitalier"",RC[-3]=""ZONE A""),IF(OR(RC[-2]=""titulaire"",RC[-2]=""stagiaire"",RC[-2]=""Contractuel CDI""),1))"
           .Range("F" & n).FormulaR1C1 = .Range("F" & n).Value
          
           .Range("G" & n).FormulaR1C1 = _
                "=IF(AND(RC[-5]=""Aide-Soignant"",RC[-4]=""ZONE A""),IF(OR(RC[-3]=""titulaire"",RC[-3]=""stagiaire"",RC[-3]=""Contractuel CDI""),1))"
              .Range("G" & n).FormulaR1C1 = .Range("G" & n).Value
        End with
        End Sub


        Cdlmnt
        0
      2. @via55Bonsoir

        Lorsque je prolonge cette macro avec toutes mes formules ( environ 300) j'obtiens l'erreur Procedure trop grande . Et je ne peux pas diviser l'événemnt Worksheet_Change(ByVal Target As Range) sur plusieurs macros.

        Comment je pourrais faire pour compiler toutes ces macros en boucle ,?
        Cordialement
        0
    2. Bonjour

      Pour l'instant la macro fige les résultats dans les cellules en remplaçant la formule par le résultat justement
      Il suffit d'enlever les lignes faisant cela pour ne laisser dans les cellules que les formules, ainsi à chaque changement dans le tableau la modification dans les colonnes avec formules se fera

      Donc ta macro sera alors :
      Sub formules ()
      With Worksheets("DONNEES")
      Dim Ligne As Long
      Ligne = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
      For n = 2 To Ligne
          .Range("E" & n).FormulaR1C1 = _
              "=IF(AND(RC[-3]=""infirmiére"",RC[-2]=""ZONE A""),IF(OR(RC[-1]=""titulaire"",RC[-1]=""stagiaire"",RC[-1]=""Contractuel CDI""),1,0))"
         
        .Range("F" & n).FormulaR1C1 = _
              "=IF(AND(RC[-4]=""Agent de Service hospitalier"",RC[-3]=""ZONE A""),IF(OR(RC[-2]=""titulaire"",RC[-2]=""stagiaire"",RC[-2]=""Contractuel CDI""),1))"
         
        
         .Range("G" & n).FormulaR1C1 = _
              "=IF(AND(RC[-5]=""Aide-Soignant"",RC[-4]=""ZONE A""),IF(OR(RC[-3]=""titulaire"",RC[-3]=""stagiaire"",RC[-3]=""Contractuel CDI""),1))"
           
      Next n
             End With
      End sub


      Cdlmnt
      0
      1. Bonjour

        Tous mes remerciements pour ce code que j'ai pu adapter à mes quelques ....2000 formules sur plusieurs procédures.

        Le fichier est moins lourd et s'ouvre plus vite.

        A chaque fois que je change une donnée, il faut que je ré exécute les macros pour voir apparaitre les changements.

        Quel événement je pourrais rajouter dans les macros ou ailleurs pour que les changements apparaissent à temps réels ?

        Merci de votre aide
        0
        1. Bonsoir

          Modifies ta macro ainsi :

          Sub Formules()
          With Worksheets("DONNEES")
          Dim Ligne As Long
          Ligne = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
          For n = 2 To Ligne
              .Range("E" & n).FormulaR1C1 = _
                  "=IF(AND(RC[-3]=""infirmiére"",RC[-2]=""ZONE A""),IF(OR(RC[-1]=""titulaire"",RC[-1]=""stagiaire"",RC[-1]=""Contractuel CDI""),1,0))"
             .Range("E" & n).FormulaR1C1 = .Range("E" & n).Value
             
            .Range("F" & n).FormulaR1C1 = _
                  "=IF(AND(RC[-4]=""Agent de Service hospitalier"",RC[-3]=""ZONE A""),IF(OR(RC[-2]=""titulaire"",RC[-2]=""stagiaire"",RC[-2]=""Contractuel CDI""),1))"
             .Range("F" & n).FormulaR1C1 = .Range("F" & n).Value
             
             
            
             .Range("G" & n).FormulaR1C1 = _
                  "=IF(AND(RC[-5]=""Aide-Soignant"",RC[-4]=""ZONE A""),IF(OR(RC[-3]=""titulaire"",RC[-3]=""stagiaire"",RC[-3]=""Contractuel CDI""),1))"
                .Range("G" & n).FormulaR1C1 = .Range("G" & n).Value
          Next n
                 End With
          End Sub


          Cdlmnt
          0