SI(NB.SI EN VBA

Bonjour à tous, et merci pour toute votre aide

Ma question, comment traduire la fonction suivante en vba :

'=SI(NB.SI(M4:M$1001;M4:M$1001)>1;">>>";SOMME(SI(M$4:M$1001=M4;G$4:G$1001;"")))

Voici le détail et les objectifs de cette fonction :

une colonne M : = sous-traitant &" "& projet

>pour avoir une référence unique qui permettra de faire la somme des factures par sous-traitant ET par projet

une colonne N : '=SI(NB.SI(M4:M$1001;M4:M$1001)>1;">>>";SOMME(SI(M$4:M$1001=M4;G$4:G$1001;"")))

> qui permettait donc d'avoir le résultat texte ">>>" si il ne s'agit pas de LA DERNIERE facture d'un sous-traitant par projet

> et sinon la somme des factures situées en colonne G (donc par sous-traitant et par projet)

LA RAISON DE MON PASSAGE D'UNE FONCTION A UNE MACRO :

J'use et j'abuse des filtres et des tris pour avoir seulement les informations qui m'intéressent en fonction des circonstances.

Mais avec cette formule reproduite sur toute une colonne, un simple tri (et toutes modifications d'ordre des lignes!) la feuille se recharge avec un temps de calcul (qui défile en pourcentage en bas à gauche) et qui correspond donc au calcul de la fonction en question

Ce qui est très peu commode, car une simple recherche prend un temps fou et mon fichier n'est ainsi plus très manipulable ….

MA SOLUTION :

Tout passer en macro, ainsi le résultat est donc en "brut" dans les cellules et j'actualise régulièrement

Du coup les tris et filtres ne posent plus de problème!

MON PROBLEME :

Mais je coince sur la macro. j'ai beau tourner et retourner dans tous les sens les deux fonctions worksheetFunction, Countif et Sumif, que j'ai trouvées, sans savoir s'il s'agit bien de celles à utiliser ou s'il s'agit d'un problème de syntaxe.

Voici ma dernière tentative :

Dim i As Long
    With Sheets("feuille1")
        For i = 4 To 1000

            If Application.CountIf(Range("M4:M1001"), Cell) > 1 Then
            Range("N" & i).Value = ">>>"
            Else
            Range("N" & i).Value = Application.SumIf(Range("M4:M1001"), "M" & i, Range("G$4:G$1001"))
            End If

Merci à tous!

Bonjour,

Voici la traduction en VBA:

"=IF(COUNTIF(R[3]C[12]:R1001C[12],R[3]C[12]:R1001C[12])>1,"">>>"",SUM(IF(R4C[12]:R1001C[12]=R[3]C[12],R4C[6]:R1001C[6],"""")))"

Cordialement

Salut Sam,

Merci pour ta traduction.

J'ai bien essayé mais j'obtiens zéro comme somme à chaque ligne.

Dans le cas de la fonction dans la cellule même que je recopiais en tirant la cellule sur toute la colonne, la ligne de départ changeait à chaque fois, la raison pour laquelle ça marchait avec comme critère ">1" (j'imagine)

Ainsi

à la ligne 4 j'avais =SI(NB.SI(M4:M$1001;M4:M$1001)>1;">>>";SOMME(SI(M$4:M$1001=M4;G$4:G$1001;"")))

à la ligne 5 j'avais =SI(NB.SI(M5:M$1001;M5:M$1001)>1;">>>";SOMME(SI(M$5:M$1001=M5;G$4:G$1001;"")))

à la ligne 6 j'avais =SI(NB.SI(M6:M$1001;M6:M$1001)>1;">>>";SOMME(SI(M$6:M$1001=M6;G$4:G$1001;"")))

ainsi de suite

Et ici, la traduction de la fonction ne prend pas en compte cette variable, non?

Une idée?

Dim i As Long

    With Sheets("CITTI")
        For i = 4 To 1000

        'REPORTER REF CONTRAT
            If .Range("A" & i).Value <> "" Then
            Range("R" & i).Value = Application.VLookup(.Range("E" & i), Sheets("CONTRAT").Range("$C:$G"), 2, False)
            End If

        'CALCUL TOTAL FACTURES
        'pour rappel la formule qui était avant dans la cellule =SI(NB.SI(M4:M$1001;M4:M$1001)>1;">>>";SOMME(SI(M$4:M$1001=M4;G$4:G$1001;"")))
            If .Range("A" & i).Value <> "" Then
            Range("T" & i).Formula = "=IF(COUNTIF(R[3]C[12]:R1001C[12],R[3]C[12]:R1001C[12])>1,"">>>"",SUM(IF(R4C[12]:R1001C[12]=R[3]C[12],R4C[6]:R1001C[6],"""")))"
            End If

        'REPORTER MONTANT MARCHE
            If .Range("A" & i).Value <> "" And .Range("A" & i).Value <> "CITTI" Then
            Range("U" & i).Value = "----------------"
            End If
            If .Range("A" & i).Value <> "" And .Range("A" & i).Value = "CITTI" Then
            Range("U" & i).Value = Application.VLookup(.Range("E" & i), Sheets("CONTRAT").Range("$C:$F"), 6, False)
            End If

        Next i
        End With
End Sub
Rechercher des sujets similaires à "vba"