Erreur code VBA

Bonjour, j'ai besoin de votre aide pour me corriger un code VBA parce que moi je n'arrive pas, je ne vois pas où est l'erreur.

MERCI BEAUCOUP pour votre aide!

17classeur-test.xlsm (50.52 Ko)

Bonjour,

Un bon petit casse tete ....

Pour ce que j'en ai compris ,

a partir du fichier mis a disposition en G3 il faut remplacer =VerifierObjectif(Base.;[@Code];[@Objectif]) par =VerifierObjectif(Base;[@Code];[@Objectif]) il y a un point apres Base

Dans le code VBA

Je n'ai pas reussi a utiliser les nom des colonnes du tableau

Base.Cells(i, "Code 1").Value

a ete remplacé par le rang de la colonne

Base.Cells(i, 5).Value 

et dans tout le code evidemment

Par contre la formule suivante ne fonctionne pas

 WorksheetFunction.SumProduct((Base.Columns("Code 1").Value = Code) * (Base.Columns("Quantité").Value * Base.Columns("Prix").Value >= Objectif)) > 0 

meme remplacée par

WorksheetFunction.SumProduct(((Base(5) = Code) * ((Base(6) * Base(7)) > Objectif))) > 0

me retourne toujours faux alors que la meme formule dans excel

=SOMMEPROD((Base[Code 1]=Synthèse[Code])*((Base[Quantité])*(Base[Prix])>=Synthèse[Objectif]))

retourne bien des valeurs.

Mais vu que tu dans le code place plus haut tu sors de la boucle en mettant ObjectifAtteint à True et que le sommeprod refait la meme chose, je crois que tu peux supprimer la formule.

A plus et bon courage

1classeur-test.xlsm (56.01 Ko)

Bonjour, merci beaucoup pour ton aide, j'apprécie vraiment mais malheureusement pour moi je suis toujours à mon point de départ

Bonjour,

C'est vrai que l'utilisation de la syntaxe en VBA pour les tableaux structurés n'est pas forcément évidente, alors quand on s'embête un peu trop, vaut mieux revenir à des choses plus simples.

Function VerifierObjectif(Base As Range, Code As Variant, Objectif As Double) As String
    Dim AchatTotal As Double
    Dim VenteTotal As Double
    Dim ObjectifAtteint As Boolean
    Dim i As Long
    Dim f1 As Worksheet

    AchatTotal = 0
    VenteTotal = 0
    ObjectifAtteint = False
    Set f1 = Sheets("BASE")

    DerLig = f1.ListObjects("Base").DataBodyRange.Rows.Count
    For i = 3 To DerLig + 2
        If f1.Cells(i, "F") = Code Then
            If f1.Cells(i, "B") = "Achat" Then
                AchatTotal = AchatTotal + (f1.Cells(i, "G") * f1.Cells(i, "H"))
            ElseIf f1.Cells(i, "B") = "Vente" Then
                VenteTotal = VenteTotal + (f1.Cells(i, "G") * f1.Cells(i, "H"))
            End If
        End If
    Next i

    If (AchatTotal - VenteTotal) >= Objectif Then
        For i = 1 To DerLig + 2
            If f1.Cells(i, "F") = Code And (f1.Cells(i, "G") * f1.Cells(i, "H")) >= Objectif Then
                ObjectifAtteint = True
                Exit For
            End If
        Next i
    End If

    If ObjectifAtteint Then
        VerifierObjectif = "OUI"
    ElseIf WorksheetFunction.SumProduct((f1.Cells(i, "F") = Code) * (f1.Cells(i, "G") * f1.Cells(i, "H")) >= Objectif) > 0 Then
        VerifierObjectif = "OUI"
    Else
        VerifierObjectif = "NON"
    End If

    Set f1 = Nothing
End Function

Cdlt

Bonjour, j'ai remplacé mon code par ton code, j'ai toujours la même erreur.

1classeur-test.xlsm (49.57 Ko)

Bonjour,

Alors avec le fichier joint, qu'en est-il?

aordepz

Cdlt

3classeur-test.xlsm (50.86 Ko)

Désolé, je ne sais pas pourquoi il ne fonctionnait pas la première fois, j'ai essaié de faire des achats et ventes et ton code fonctionne jusqu'à l'objectif (100) mais dès que l'objectif est atteint, il me renvoie l'erreur #VALEUR!, je mets le dernier fichier avec le dernier code que j'ai essayé. Encore une fois merci pour votre aide !

Sur la ligne suivante (en rouge)

If (AchatTotal - VenteTotal) >= Objectif Then
For i = 1 To DerLig + 2

il faut remplacer la valeur 1 par 3

For i = 3 To DerLig + 2

Ok, j'ai plus l'erreur, mais le résultat reste bloqué sur "NON" même quand je dépasse l'objectif. je mets le dernier fichier avec le dernier code que j'ai essayé. Encore une fois merci pour votre aide !

1classeur-test.xlsm (50.72 Ko)

bonjour Arturo83,aordepz,

c'est un tableau structuré, alors traite-le comme ça.

Function VerifierObjectif(Base As Range, Code As Variant, Objectif As Double)
     Dim LO, cType, cCode_1, cQuantité, cPrix, cTotal, MonTotal
     Dim AchatTotal As Double
     Dim VenteTotal As Double

     Set LO = Base.ListObject 'ce tableau structuré
     Set cType = LO.ListColumns("Type").DataBodyRange 'données de cette colonne
     Set cCode_1 = LO.ListColumns("Code 1").DataBodyRange
     Set cTotal = LO.ListColumns("Total").DataBodyRange

     AchatTotal = WorksheetFunction.SumIfs(cTotal, cType, "achat", cCode_1, Code)     'total des achats de "code"
     VenteTotal = WorksheetFunction.SumIfs(cTotal, cType, "Vente", cCode_1, Code)     'total des ventes de "code"
     MonTotal = WorksheetFunction.SumIfs(cTotal, cCode_1, Code)     'total de tout de "code"

     If (AchatTotal - VenteTotal) >= Objectif Or MonTotal >= Objectif Then
          VerifierObjectif = "OUI"
     Else
          VerifierObjectif = "NON"
     End If
End Function

Super merci beaucoup mais le résultat est faux, si tu prends mes données (achats moins ventes) je n'ai jamais atteint l'objectif de 100, mon but est que le code vérifie dans l'historique de la base pour le code "SOL" si au moins une fois l'objectif a été atteint si c'est le cas alors il renverra toujours "OUI" même s'il y a des ventes par la suite. Je mets le dernier fichier avec le dernier code que j'ai essayé. Encore une fois merci pour votre aide !

8classeur-test.xlsm (50.43 Ko)

Je na maîtrise pas suffisamment le VBA avec les tableaux structurés comme notre ami BsAlv(Salut) mais en maintenant ma proposition en attendant la sienne:

Function VerifierObjectif(Base As Range, Code As Variant, Objectif As Double) As String
    Dim AchatTotal As Double
    Dim VenteTotal As Double
    Dim ObjectifAtteint As Boolean
    Dim i As Long
    Dim f1 As Worksheet, f2 As Worksheet
dim Total as double

    AchatTotal = 0
    VenteTotal = 0
    ObjectifAtteint = False
    Set f1 = Sheets("BASE")
    Set f2 = Sheets("SYNTHÈSE")

    DerLig = f1.ListObjects("Base").DataBodyRange.Rows.Count
    For i = 3 To DerLig + 2
        If f1.Cells(i, "F") = Code Then
            If f1.Cells(i, "B") = "Achat" Then
                AchatTotal = AchatTotal + (f1.Cells(i, "G") * f1.Cells(i, "H"))
            ElseIf f1.Cells(i, "B") = "Vente" Then
                VenteTotal = VenteTotal + (f1.Cells(i, "G") * f1.Cells(i, "H"))
            End If
        End If
    Next i

    For i = 3 To DerLig + 2
        If f1.Cells(i, "F") = Code Then
            Total = Total + (f1.Cells(i, "G") * f1.Cells(i, "H"))
            If Total >= Objectif Then
                ObjectifAtteint = True
                Exit For
            End If
        End If
    Next i

    If ObjectifAtteint Then
        VerifierObjectif = "OUI"
    ElseIf WorksheetFunction.SumProduct((f1.Cells(i, "F") = Code) * (f1.Cells(i, "G") * f1.Cells(i, "H")) >= Objectif) > 0 Then
        VerifierObjectif = "OUI"
    Else
        VerifierObjectif = "NON"
    End If

    Set f1 = Nothing
    Set f2 = Nothing
End Function

Cdlt

Merci Arturo83 mais ton code renvoi "OUI" alors que ça devrait être "NON".

re,

salut arturo83, l'advantage d'un tableau structuré, c'est qu'on ne doit plus s'occuper de sa position (vous pouvez le déplacer dans une autre feuille ou dans la même feuille), les lignes deviennent relatives à l'entête et le nombre de lignes est ceux du tableau.

Attention, la fonction peut avoir 3 résultats maintenant : Vide, Oui et Non

Function VerifierObjectif(Base As Range, Code As Variant, Objectif As Double)
     Dim LO, cType, cCode_1, cQuantité, cPrix, cTotal, MonTotal, PlusMoins
     Dim AchatTotal As Double
     Dim VenteTotal As Double

     Set LO = Base.ListObject                'ce tableau structuré (obligatoire !!!!)

     If LO.ListRows.Count = 0 Then VerifierObjectif = "VIDE": Exit Function

     Set cType = LO.ListColumns("Type").DataBodyRange     'données de cette colonne
     Set cCode_1 = LO.ListColumns("Code 1").DataBodyRange
     Set cTotal = LO.ListColumns("Total").DataBodyRange

     AchatTotal = WorksheetFunction.SumIfs(cTotal, cType, "achat", cCode_1, Code)     'total des achats de "code"
     VenteTotal = WorksheetFunction.SumIfs(cTotal, cType, "Vente", cCode_1, Code)     'total des ventes de "code"

     If (AchatTotal - VenteTotal) >= Objectif Then VerifierObjectif = "OUI": Exit Function

     For i = 1 To LO.ListRows.Count          'parcourir le tableau
          If StrComp(cCode_1.Cells(i, 1), Code, 1) = 0 Then     'le code est correct (majuscules/miniscules)
               Select Case LCase(cType.Cells(i, 1).Value)     'valeur de type en miniscules, c'est quoi ? achat, vente ou autre
                    Case "achat": PlusMoins = 1
                    Case "vente": PlusMoins = -1
                    Case Else: PlusMoins = 0     'alors ne pas cumuler
               End Select
               If PlusMoins <> 0 Then
                    MonTotal = MonTotal + cTotal.Cells(i, 1) * PlusMoins     'historique : le cumul jusqu'à ce moment (additioner achats et soustraire ventes)
                    If MonTotal >= Objectif Then VerifierObjectif = "OUI": Exit Function     'un moment donnée, l'objectif est atteint
               End If
          End If
     Next

     VerifierObjectif = "NON"                'l'objectif n'est jamais atteint

End Function

re, update de ma réaction précédente avec une amélioration (?) en cas d'un tableau "vide"

MERCI MERCI MERCI MERCI BsAlv c'est vraiment TOP TOP TOP

@ BaSlv:

salut arturo83, l'avantage d'un tableau structuré, c'est qu'on ne doit plus s'occuper de sa position (vous pouvez le déplacer dans une autre feuille ou dans la même feuille), les lignes deviennent relatives à l'entête et le nombre de lignes est ceux du tableau.

Eh oui, je le sais bien mais, comme signifié précédemment, mon problème est que je ne maîtrise pas suffisamment le VBA avec les tableaux structurés, il faut que je passe un peu plus de temps là dessus.

Cdlt

Rechercher des sujets similaires à "erreur code vba"