Formules VBA

kellyy27 Messages postés 7 Statut Membre -  
kellyy27 Messages postés 7 Statut Membre -
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. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  2. kellyy27 Messages postés 7 Statut Membre
     
    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
  3. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  4. kellyy27 Messages postés 7 Statut Membre
     
    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. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      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
      1. kellyy27 Messages postés 7 Statut Membre > via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention  
         
        Bonsoir

        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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kellyy27 Messages postés 7 Statut Membre
     
    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
  7. kellyy27 Messages postés 7 Statut Membre
     
    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