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. 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
    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. 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 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 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
            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