XL 2021 Transformer une formule en vba

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

gege5959

XLDnaute Nouveau
Bonjour,

Je suis débutant et je cherche à transcrire la formule suivante en vba mais j'ai toujours des messages d'erreur alors que la formule fonctionne dans une cellule
=SOMME(NB.SI.ENS(A1:E1;G1:J1))
Le but étant de compter le nombre de doublons dans une plage avec pour critère une autre plage
Cette formule sera intégrée à 2 boucles si bien qu'elle pourrait finir par exemple par =SOMME(NB.SI.ENS(A500:E500;G300:J300))

Je l'ai écrite comme suit:
com1 = activeWorksheetFunction.somme(activeWorksheetFunction.nb.si.ens(Sheets("sol2").Range(Cells(i, j), Cells(i, j + 4)), Sheets(feu1).Range(Cells(posi, colref1 ), Cells(posi, colref1 +3))))

Message d'erreur: «erreur définie par l'application ou par l'objet»

Merci d'avance pour votre éclairage
 
Solution
A priori, le demandeur veut le résultat en variable, d'où le souci.
VB:
Sub Macro3()
    Dim rng1 As String
    Dim rng2 As String
    
    ' ' =SOMME(NB.SI.ENS(A1:E1;G1:J1))
    ' Adresse relative en notation A1
    rng1 = Range(Cells(1, 1), Cells(1, 4)).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    rng2 = Range(Cells(1, 7), Cells(1, 10)).Address(RowAbsolute:=False, ColumnAbsolute:=False)

    ' Formule en français avec ; comme séparateur
    ActiveCell.FormulaLocal = "=SOMME(NB.SI.ENS(" & rng1 & ";" & rng2 & "))"
End Sub
Astuces


VB:
Sub Macro6_Corrige()

'Je l 'ai écrite comme suit:
'com1 = activeWorksheetFunction.somme(activeWorksheetFunction.nb.si.ens(Sheets("sol2").Range(Cells(i, j), Cells(i, j + 4)), Sheets(feu1).Range(Cells(posi, colref1), Cells(posi, colref1 + 3))))

    Dim wsSol As Worksheet, wsFeu As Worksheet
    Dim rng1 As String, rng2 As String
    Dim i As Long

    Set wsSol = Sheets("sol2") ' Sheets("sol2")
    Set wsFeu = Sheets("feu1") ' Sheets(feu1)
   
    ' Cette formule sera intégrée à 2 boucles si bien qu'elle pourrait finir par exemple par =SOMME(NB.SI.ENS(A500:E500;G300:J300))
    For i = 1 To 500  ' Exemple A500:E500 / Mais pour G300:J300 ? il faut 500 Lignes aussi donc G500:J500
        ' Construire les adresses A1 relatives avec le nom des feuilles
        rng1 = wsSol.Range(wsSol.Cells(i, 1), wsSol.Cells(i, 4)).Address(RowAbsolute:=False, ColumnAbsolute:=False, External:=True)
        rng2 = wsFeu.Range(wsFeu.Cells(i, 7), wsFeu.Cells(i, 10)).Address(RowAbsolute:=False, ColumnAbsolute:=False, External:=True)
       
        ' Formule avec SOMME(NB.SI.ENS) en français
        wsSol.Cells(i, 13).FormulaLocal = "=SOMME(NB.SI.ENS(" & rng1 & ";" & rng2 & "))"
    Next i
End Sub
 
bonsoir à toutes & à tous, bonsoir @gege5959

De cette façon, avec EVALUATE
VB:
Sub tst()
'...
     Rg1 = [A1:E1].Address(external:=True)
     Rg2 = [G1:J1].Address(external:=True)
     TT = Evaluate("Sum(CountIf(" & Rg1 & "," & rg2 & "))")
'...
End Sub

Chez moi cela fonctionne !
À bientôt
Bonjour,

Merci pour votre macro.
Elle ressemble assez à une autre plus haut mais elle pourra m'être utile.
Cordialement.
 
VB:
Sub Macro3()
    Dim rng1 As String
    Dim rng2 As String
   
    ' ' =SOMME(NB.SI.ENS(A1:E1;G1:J1))
    ' Adresse relative en notation A1
    rng1 = Range(Cells(1, 1), Cells(1, 4)).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    rng2 = Range(Cells(1, 7), Cells(1, 10)).Address(RowAbsolute:=False, ColumnAbsolute:=False)

    ' Formule en français avec ; comme séparateur
    ActiveCell.FormulaLocal = "=SOMME(NB.SI.ENS(" & rng1 & ";" & rng2 & "))"
End Sub
Bonjour,

Merci beaucoup. C'est exactement ce que je cherchais. Cordialement.
 
Bonjour à toutes et à tous, bonjour @gege5959
Merci pour le retour.
Elle ressemble assez à une autre plus haut
Oui postée 3 minutes plus tôt, mais avec cette différence que je place le résultat dans une variable et non pas en formule dans une cellule.
Vu ton 1er post :
com1 = activeWorksheetFunction.somme(activeWorksheetFunction.nb.si.ens(Sheets("sol2").Range(Cells(i, j), Cells(i, j + 4)), Sheets(feu1).Range(Cells(posi, colref1 ), Cells(posi, colref1 +3))))
Et le post 8 :
ValMin = Application.WorksheetFunction.Min(Range(Cells(18, 1), Cells(31, 840))) .
J'avais cru comprendre que c'était ce que tu recherchais
Apparemment je me trompais 🫢
À bientôt
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour