Modifier formule en VBA pour lignes différentes

Fermé
Eminini2017 - 19 avril 2017 à 16:07
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 - 20 avril 2017 à 08:13
Bonjour à tous!
Ça fait plusieurs jours que j'essaie de résoudre mon problème et je ne trouve aucune solution dans aucun forum... alors j'ai décidé de demander aux experts ;)

Voila, c'est que j'ai pour au dessus de 100 000 lignes de formules à changer en ajoutant une partie de code au début et à la fin et chacune de ces lignes sont différentes.. alors je ne peux donc pas imbriquer mon code pour qu'il se met automatiquement sur chaque ligne.

Voici à quoi ressemble mes lignes:
=MOYENNE(SI(S2014645A!$MO$5:$MO$8490=1;SI(S2014645A!$E$5:$E$8490="m";SI(S2014645A!$G$5:$G$8490>=40;SI(S2014645A!$G$5:$G$8490<50;S2014645A!$S$5:$S$8490;"");"");"");""))

Les parties qui changent à chaque lignes sont (m=masculin et f=féminin et 40 et 50 sont des intervalles d'âges) et "S2014645A!$S$5:$S$8490" et "S2014645A!$MO$5:$MO$8490" change à chaque 50 lignes environ

Je veux changer ces lignes pour rajouter ceci:
=MOYENNE(SI(S2014645A!$MO$5:$MO$8490=1
;SI(S2014645A!$H$5:$H$8490=1;SI(S2014645A!$E$5:$E$8490="m";SI(S2014645A!$G$5:$G$8490>=40;SI(S2014645A!$G$5:$G$8490<50;S2014645A!$S$5:$S$8490;"");"");"");"");"")).

Voici le code que j'ai essayé de faire mais j'ai toujours un message d'erreur 1004 à cause du ";".. (D’où la raison pour laquelle j'ai décidé de mettre la nouvelle section dans une variable maVal... et je ne suis même pas rendu à mettre le " ;"") " encore car le premier ajout ne fonctionne pas...

Sub Macro2()

Dim i As Single
Dim sht As Worksheet
Dim maVal As String
maVal = ";SI(S2014645A!$H$5:$H$8490=1"


Set sht = ThisWorkbook.Worksheets("MÉD RMB")

With sht
For i = 1 To 49 (*J'essaie pour l'instant que les 50 premières lignes pour être sur que ça fonctionne)
' .Cells(i, 5).Formula = .Cells(i, 4).Formula

.Range("E49").FormulaLocal = Replace(.Range("E49").FormulaLocal, "(SI(S2014645A!$MO$5:$MO$8490=1", "(SI(S2014645A!$MO$5:$MO$8490=1" & maVal) (Ici je n'essaie qu'avec une cellule pour voir mais je devrais mettre .Cell(i,5).FormulaLocal ... sauf si vous me dite que ça ne fonctionne pas)
' .Range("E49").FormulaArray = .Range("E49").FormulaLocal
Next i
End With
End Sub

HELP. Mercii
A voir également:

3 réponses

Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
19 avril 2017 à 18:50
Bonjour
Si j'ai bien compris votre formule vous voulez faire la moyenne de la colonne "S" si toutes les conditions sont réunies. Pourquoi ne pas utiliser la formule suivante qui me semble plus simple:
=SIERREUR(MOYENNE.SI.ENS(S2014645A!$S$5:$S$8490;S2014645A!$MO$5:$MO$8490;1;S2014645A!$H$5:$H$8490;1;S2014645A!$E$5:$E$8490;"m";S2014645A!$G$5:$G$8490;">=40";S2014645A!$G$5:$G$8490;"<50");"")
ce qui donne en VBA:
"=IFERROR(AVERAGEIFS(S2014645A!R5C19:R8490C19,S2014645A!R5C353:R8490C353,1,S2014645A!R5C8:R8490C8,1,S2014645A!R5C5:R8490C5,""m"",S2014645A!R5C7:R8490C7,"">=40"",S2014645A!R5C7:R8490C7,""<50""),"""")"
A adapter selon vos besoins.
Cdlt
0
OUi en effet ça revient au même, mais là j'ai pour 100 000 lignes différentes.. je ne peux pas commencer à les changer une par une avec ta nouvelle formule. Je voudrais simplement rajouter aux formules déjà existantes mes parties soulignées exactement à ces endroit.
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
20 avril 2017 à 08:13
Bonjour
    maVal = "S2014645A!$H$5:$H$8490=1"
    Formule = "=AVERAGE(IF(S2014645A!R5C353:R8490C353=1,IF(" & MaVar & ",IF(S2014645A!R5C5:R8490C5=""m"",IF(S2014645A!R5C7:R8490C7>=40,IF(S2014645A!R5C7:R8490C7<50,S2014645A!R5C19:R8490C19,""""),""""),""""),""""),""""))"
    Set sht = ThisWorkbook.Worksheets("MÉD RMB")
    
    With sht
        For i = 1 To 49
             .Cells(i, 5).FormulaR1C1 = Formule
        Next i
    End With


Voilà pour le principe, j'ai conservé votre formule, mais je ne suis pas convaincu qu'elle fonctionne.
Cdlt
0