Formules VBA

Fermé
kellyy27 Messages postés 7 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 10 février 2015 - 9 déc. 2014 à 23:23
kellyy27 Messages postés 7 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 10 février 2015 - 14 déc. 2014 à 19:21
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
A voir également:

7 réponses

via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
10 déc. 2014 à 00:22
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
kellyy27 Messages postés 7 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 10 février 2015
11 déc. 2014 à 10:59
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
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
11 déc. 2014 à 11:35
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
kellyy27 Messages postés 7 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 10 février 2015
11 déc. 2014 à 12:50
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
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
11 déc. 2014 à 14:20
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
kellyy27 Messages postés 7 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 10 février 2015 > via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024
14 déc. 2014 à 19:21
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
11 déc. 2014 à 13:53
Bonjour à tous,

Est-ce qu'un simple TCD ne te donnerait pas le résultat attendu ?
Exemple :
https://www.cjoint.com/?DLloaelFCXf

A+
0
kellyy27 Messages postés 7 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 10 février 2015
11 déc. 2014 à 14:28
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
kellyy27 Messages postés 7 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 10 février 2015
13 déc. 2014 à 08:31
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
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
13 déc. 2014 à 09:39
0