Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Conseils pour calcul de moyenne en VBA selon critères dans autre colonne

11 réponses
Avatar
plexus
Bonjour,

Je veux faire la moyenne de valeurs situ=E9es dans une colonne (J) selon
la pr=E9sence dans la colonne P de la lettre "M".
Ma sub fonctionne, mais je me demandais s'il n'y a pas plus simple et
efficace.

D'autre part, j'ai remarqu=E9 que si je ne d=E9clare pas mon tableau
tabval en variant mais en double, j'obtiens un r=E9sultat tout =E0 fait
diff=E9rent (environ la moiti=E9). Auriez vous une id=E9e du pourquoi de ce
ph=E9nom=E8ne ? (pour ma culture personelle)


Sub essai_moyenne()

Dim derligne As Long
Dim fintab As Long, I As Long
Dim tabzone() As Variant
Dim tabval() As Variant

derligne =3D Range("A:A").Find("*", , xlFormulas, , , xlPrevious).Row
fintab =3D derligne -
12 'les donn=E9es
commencent =E0 la ligne 13

'% si M en colonne P
ReDim tabzone(1 To fintab, 1 To 2)
a =3D 1
ReDim tabval(1 To a)
For L =3D 1 To fintab

tabzone(L, 1) =3D Sheets(1).Cells(12 + L, 10).Value
'les donn=E9es commencent =E0 la ligne 13
tabzone(L, 2) =3D Sheets(2).Cells(12 + L, 16).Value
'les donn=E9es commencent =E0 la ligne 13
If InStr(1, tabzone(L, 2), "M") <> 0 Then
tabval(a) =3D tabzone(L, 1)
a =3D a + 1
ReDim Preserve tabval(1 To a)
End If
Next L

With Application.WorksheetFunction
moy =3D .Average(tabval)
End With

MsgBox moy

End Sub

Merci de vos remarques,

1 réponse

1 2
Avatar
plexus
Ok JB , j'abandonne !

Saperlipopette ! je viens de m'apercevoir que la plus part de mes
message
incompatibilité de type étaient dus à des fautes de frappe du style :
mauvais nombre de parenthèse
espace après average....

Sinon pour en revenir à mes moutons et le calcul de moyenne suivant un
critère,
j'opte finalement pour :

Sub testmoycrit()
t = Timer()
derligne = [J65000].End(3).Row
ThisWorkbook.Names.Add Name:="txremplis", RefersTo:="='feuil1'!$J
$13:'feuil1'!$J$" & derligne & ""
ThisWorkbook.Names.Add Name:="Orientation", RefersTo:="=('feuil1'!$P
$13:'feuil1'!$P$" & derligne & ")"
MsgBox Evaluate("=AVERAGE(IF(Orientation=""M"",txremplis))") & " - " &
Timer - t
End Sub

Je ne vois pas comment utiliser de variable tableau dans ce cas là, et
je ne sais pas si le gain serait très utile.

Je sais, je pourrais me passer de ma variable derligne , mais je crois
que je l'aime bien, pis elle doit pas trop me pomper de ressources
tout de même

je suis obligé de mettre des $ dans mes références sinon excel me
décale tout, est ce que referstolocal réglerer ce pb ?

A défaut de pouvoir définir des noms "dynamiques" avec la fonction
décaler, je vais peut-être utiliser FormulaArray qui permettrait un
recalcul sans relancer la sub
mais je ne sais pas si je gagnerai en tant ou si la fonction evaluate
est plus performante que .Formula

Bref tout ça pour en revenir à ta solution première.....

Merci, en tout cas de l'aide, les tableaux me sont un peu moins
indigeste, maintenant
1 2