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!
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
Bonjour, merci beaucoup pour ton aide, j'apprécie vraiment
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.
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 !
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
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
@ 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