Problème de syntaxe et d'expérience
Bonjour à tous,
J'utilise Excel depuis deux ou trois ans mais je n'ai découvert la grande utilité des macro il y a seulement une semaine ce qui vous donne une idée de mon niveau. J'ai néanmoins déjà programmé en python mais certaines choses n'ont rien à voir. C'est pour cela que j'ai besoin de votre aide pour essaye de me corriger au niveau de la syntaxe et de mes méthodes. J'ai fais quelques fonction pour pouvoir les utiliser dans une macro mais le problème c'est qu'il y a de multiples erreur et des que j'en corrige une une autre apparait. problème de définition de variable problème d'objet ...
j’espère que vous pourrez m'aider comme vous pouvez le voir les fonctions sont semblable en m'expliquant pour une d'entre elle je devrai me débrouiller pour modifier les autres j’apprends vite.
Function PREDICTION_QUOTIDIENNE(Cell)
Dim c As Integer, X_connus As Range, Y_connus As Range, l As Integer, x As Date
c = 3
Colonne = Cell.Column
Ligne = Cell.Row
x = Range(Cells(3, Colonne))
While Not Cells(2, c) = ""
If Sheets("ventes 2015").Cells(2, c) = Sheets("prévisions 2015").Range(Cell) Then
X_connus = Union(X_connus, Sheets("ventes 2015").Cells(3, c))
Y_connus = Union(Y_connus, Sheets("ventes 2015").Cells(Ligne, c))
End If
MsgBox ("X_connus =" & X_connus & " et Y_connus =" & "Y_connus.")
c = c + 1
Wend
PREDICTION_QUOTIDIENNE(Cell) = Application.WorksheetFunction.Forecast(x, Y_connus, X_connus)
End Function
Function PREDICTION_BILAN(Cell)
Dim c As Integer, X_connus As Range, Y_connus As Range, l As Integer, x As Date
Colonne = Cell.Column
Ligne = Cell.Row
x = Cells(3, Colonne)
c = 3
While Not Sheets("ventes 2015").Cells(2, c) = ""
X_connus = Union(X_connus, Sheets("ventes 2015").Cells(3, c))
Y_connus = Union(Y_connus, Sheets("ventes 2015").Cells(Ligne, c))
MsgBox ("X_connus =" & X_connus & " et Y_connus =" & "Y_connus.")
c = c + 1
Wend
PREDICTION_BILAN(Cell) = Application.WorksheetFunction.Forecast(x, Y_connus, X_connus)
End Function
Function MOYENNE_QUOTIDIENNE(Cell)
Dim c As Integer, Plage_Moyenne_Quotidienne As Range, l As Integer
Ligne = Cell.Row
c = 3
While Not Sheets("ventes 2015").Cells(2, c) = ""
If Sheets("ventes 2015").Cells(2, c) = Sheets("prévisions 2015").Range(Cell) Then
Plage_Moyenne_Quotidienne = Union(Plage_Moyenne_Quotidienne, Sheets("ventes 2015").Range(Cells(Ligne, c)))
End If
MsgBox ("Plage_Moyenne_Quotidienne = " & Plage_Moyenne_Quotidienne & ".")
c = c + 1
Wend
MOYENNE_QUOTIDIENNE(Cell) = Application.WorksheetFunction.Average(Plage_Moyenne_Quotidienne)
End Function
Function MOYENNE_BILAN(Cell)
Dim c As Integer, Plage_Moyenne_Bilan As Range, Ligne As Integer
c = 3
Ligne = Cell.Row
While Not Sheets("ventes 2015").Cells(2, c) = ""
Plage_Moyenne_Bilan = Union(Plage_Moyenne_Bilan, Sheets("ventes 2015").Range(Cells(Ligne, c)))
MsgBox ("Plage_Moyenne_Bilan = " & Plage_Moyenne_Bilan & ".")
c = c + 1
Wend
MOYENNE_BILAN(Cell) = Application.WorksheetFunction.Average(Plage_Moyenne_Bilan)
End Function
Function CALCUL_PREVISION(Cell)
CALCUL_PREVISION(Cell) = Application.WorksheetFunction.Average(MOYENNE_BILAN(Cell), MOYENNE_QUOTIDIENNE(Cell), PREDICTION_BILAN(Cell), PREDICTION_QUOTIDIENNE(Cell))
End Function
Sub CALCUL_PREVISIONS()
For i = 6 To 26
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
For i = 29 To 52
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
For i = 55 To 67
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
For i = 69 To 77
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
End Sub
pour l'instant il m'affiche Erreur définie par l'application ou par l'objet pour cette partie
While Not Sheets("ventes 2015").Cells(2, c) = ""
Plage_Moyenne_Bilan = Union(Plage_Moyenne_Bilan, Sheets("ventes 2015").Range(Cells(Ligne, c)))
MsgBox ("Plage_Moyenne_Bilan = " & Plage_Moyenne_Bilan & ".")
c = c + 1
Wend
au niveau de Plage_Moyenne_Bilan = Union(Plage_Moyenne_Bilan, Sheets("ventes 2015").Range(Cells(Ligne, c))).
Bonsoir et bienvenu(e)
Je n'ai pas tout regardé mais quelques précisons sur Union
Pour réunir plusieurs plages il faut que toutes les plages soient déjà initialisées
La première fois que le code est exécuté, la plage Plage_Moyenne_Bilan n'est pas initialisée
Plage_Moyenne_Bilan = Union(Plage_Moyenne_Bilan, Sheets("ventes 2015").Range(Cells(Ligne, c)))
Donc il faut tester cette initialisation
While Not Sheets("ventes 2015").Cells(2, c) = ""
If Plage_Moyenne_Bilan Is Nothing Then
[surligner=#FFFFBF]Set Plage_Moyenne_Bilan = Sheets("ventes 2015").Cells(Ligne, c)
Else
[surligner=#FFFFBF]Set Plage_Moyenne_Bilan = Union(Plage_Moyenne_Bilan, Sheets("ventes 2015").Cells(Ligne, c))
End If
MsgBox ("Plage_Moyenne_Bilan = " & Plage_Moyenne_Bilan.[surligner=#80FFFF]Address & ".")
c = c + 1
Wend
Pour les objets de type Worksheet, Range ... leur initialisation passe par l'instruction Set
Enfin Range(Cells(Ligne,c)) n'existe pas c'est soit Range soit Cells (des fois il y a un mélange des 2, utilisé pour définir une plage )
Address est la propriété de l'objet Range pour connaitre son étendue
Merci pour votre réponse mais comment je peux faire si je pars d'une plage vide alors pour ensuite y mettre toutes les cellules qui correspondent à la condition que j'ai mis en place je ne savais pas comment faire?
De plus je n'ai pas très bien compris l'utilisation du set à chaque fois il m'affiche des erreurs.
Bonsoir
La macro que je t'ai fourni fonctionne bien
Il faut penser à corriger toutes tes macros dans le même style
Sinon fournis ton fichier
Merci je vais essayer d'apporter les corrections moi même cela me permettra de mieux comprendre et d'apprendre cela sera plus bénéfique pour moi mais merci en tout cas.
voilà j'ai effectué les modification malheureusement la macro va dans la fonction:
-CALCUL_PREVISION(Cell)
puis
-MOYENNE_BILAN(Cell)
mais ensuite elle n'en sort plus. J'avais cherché sur les forum comment utiliser un return pour que la fonction renvoie une valeur mais ils disent partout qu'il faut mettre le nom de la fonction = la valeur qu'on veut retourner mais la une fois qu'il sort de la boucle dans la fonction MOYENNE_BILAN(Cell) il va sur la ligne MOYENNE_BILAN(Cell) = Application.WorksheetFunction.Average(Plage_Moyenne_Bilan)
et il repars indéfiniment.
Function PREDICTION_QUOTIDIENNE(Cell)
Dim c As Integer, X_connus As Range, Y_connus As Range, l As Integer, x As Date
c = 3
Colonne = Cell.Column
Ligne = Cell.Row
x = Cells(3, Colonne)
While Not Cells(2, c) = ""
If Sheets("ventes 2015").Cells(2, c) = Sheets("prévisions 2015").Range(Cell) Then
If X_connus Is Nothing Then
Set X_connus = Sheets("ventes 2015").Cells(3, c)
Set Y_connus = Sheets("ventes 2015").Cells(Ligne, c)
Else
Set X_connus = Union(X_connus, Sheets("ventes 2015").Cells(3, c))
Set Y_connus = Union(Y_connus, Sheets("ventes 2015").Cells(Ligne, c))
End If
End If
MsgBox ("X_connus =" & X_connus & " et Y_connus =" & "Y_connus.")
c = c + 1
Wend
PREDICTION_QUOTIDIENNE(Cell) = Application.WorksheetFunction.Forecast(x, Y_connus, X_connus)
End Function
Function PREDICTION_BILAN(Cell)
Dim c As Integer, X_connus As Range, Y_connus As Range, l As Integer, x As Date
Colonne = Cell.Column
Ligne = Cell.Row
x = Cells(3, Colonne)
c = 3
While Not Sheets("ventes 2015").Cells(2, c) = ""
If X_connus Is Nothing Then
Set X_connus = Sheets("ventes 2015").Cells(3, c)
Set Y_connus = Sheets("ventes 2015").Cells(Ligne, c)
Else
Set X_connus = Union(X_connus, Sheets("ventes 2015").Cells(3, c))
Set Y_connus = Union(Y_connus, Sheets("ventes 2015").Cells(Ligne, c))
End If
MsgBox ("X_connus =" & X_connus & " et Y_connus =" & "Y_connus.")
c = c + 1
Wend
PREDICTION_BILAN(Cell) = Application.WorksheetFunction.Forecast(x, Y_connus, X_connus)
End Function
Function MOYENNE_QUOTIDIENNE(Cell)
Dim c As Integer, Plage_Moyenne_Quotidienne As Range, l As Integer
Ligne = Cell.Row
c = 3
While Not Sheets("ventes 2015").Cells(2, c) = ""
If Sheets("ventes 2015").Cells(2, c) = Sheets("prévisions 2015").Range(Cell) Then
If Plage_Moyenne_Bilan Is Nothing Then
Set Plage_Moyenne_Quotidienne = Sheets("ventes 2015").Cells(Ligne, c)
Else
Set Plage_Moyenne_Quotidienne = Union(Plage_Moyenne_Quotidienne, Sheets("ventes 2015").Cells(Ligne, c))
End If
End If
MsgBox ("Plage_Moyenne_Quotidienne = " & Plage_Moyenne_Quotidienne & ".")
c = c + 1
Wend
MOYENNE_QUOTIDIENNE(Cell) = Application.WorksheetFunction.Average(Plage_Moyenne_Quotidienne)
End Function
Function MOYENNE_BILAN(Cell)
Dim c As Integer, Plage_Moyenne_Bilan As Range, Ligne As Integer
c = 3
Ligne = Cell.Row
While Not Sheets("ventes 2015").Cells(2, c) = ""
If Plage_Moyenne_Bilan Is Nothing Then
Set Plage_Moyenne_Bilan = Sheets("ventes 2015").Cells(Ligne, c)
Else
Set Plage_Moyenne_Bilan = Union(Plage_Moyenne_Bilan, Sheets("ventes 2015").Cells(Ligne, c))
End If
MsgBox ("Plage_Moyenne_Bilan = " & Plage_Moyenne_Bilan.Address & ".")
c = c + 1
Wend
MOYENNE_BILAN(Cell) = Application.WorksheetFunction.Average(Plage_Moyenne_Bilan)
End Function
Function CALCUL_PREVISION(Cell)
CALCUL_PREVISION(Cell) = Application.WorksheetFunction.Average(MOYENNE_BILAN(Cell), MOYENNE_QUOTIDIENNE(Cell), PREDICTION_BILAN(Cell), PREDICTION_QUOTIDIENNE(Cell))
End Function
Sub CALCUL_PREVISIONS()
For i = 6 To 26
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
For i = 29 To 52
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
For i = 55 To 67
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
For i = 69 To 77
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
End Sub
Encore merci de prendre le temps de répondre mais je m'en occuperai demain car je me lève a 5h
Bonsoir
Il faut affecter le résultat au nom de la fonction
Exemple
PREDICTION_QUOTIDIENNE= Application.WorksheetFunction.Forecast(x, Y_connus, X_connus)
Ne mets pas le paramètre (Cell)
C'est bon j'ai modifié et grâce à cela les fonctions prennent bien les valeur demandé cependant il ne donne pas ce que je voulais alors j'ai effectué un pas à pas et il ne m'a pas affiché d'erreur et j'ai remarqué qu'en laissant le pointeur sur des variable on pouvait voir les valeurs auxquelles elles correspondent et c'est la que j'ai vu qu'il y avait une erreur 2015 sur cette parti. En résumé la seule fonction qui fonctionne c'est la fonction moyenne bilan.Mais je lâche rien même si ça fait 1 heure que je cherche la solution parce que j'ai aussi supprimé les WorksheetFunction il me mettait des erreurs et ça à résolu le problème
Function PREDICTION_QUOTIDIENNE(Cell)
Dim c As Integer, X_connus As Range, Y_connus As Range, Ligne As Integer, Colonne As Integer, x As Date
c = 3
Colonne = Cell.Column
Ligne = Cell.Row
x = Cells(3, Colonne)
While Not Cells(2, c) = ""
If Sheets("ventes 2015").Cells(2, c) = Sheets("prévisions 2015").Cells(2, Colonne) Then
If X_connus Is Nothing Then
Set X_connus = Sheets("ventes 2015").Cells(3, c)
Set Y_connus = Sheets("ventes 2015").Cells(Ligne, c)
Else
Set X_connus = Union(X_connus, Sheets("ventes 2015").Cells(3, c))
Set Y_connus = Union(Y_connus, Sheets("ventes 2015").Cells(Ligne, c))
End If
End If
c = c + 1
Wend
PREDICTION_QUOTIDIENNE = Application.Forecast(x, Y_connus, X_connus)
End Function
Function PREDICTION_BILAN(Cell)
Dim c As Integer, X_connus As Range, Y_connus As Range, Ligne As Integer, Colonne As Integer, x As Date
c = 3
Colonne = Cell.Column
Ligne = Cell.Row
x = Cells(3, Colonne)
While Not Sheets("ventes 2015").Cells(2, c) = ""
If X_connus Is Nothing Then
Set X_connus = Sheets("ventes 2015").Cells(3, c)
Set Y_connus = Sheets("ventes 2015").Cells(Ligne, c)
Else
Set X_connus = Union(X_connus, Sheets("ventes 2015").Cells(3, c))
Set Y_connus = Union(Y_connus, Sheets("ventes 2015").Cells(Ligne, c))
End If
c = c + 1
Wend
PREDICTION_BILAN = Application.Forecast(x, Y_connus, X_connus)
End Function
Function MOYENNE_QUOTIDIENNE(Cell)
Dim c As Integer, Plage_Moyenne_Quotidienne As Range, Ligne As Integer, Colonne As Integer
Ligne = Cell.Row
Colonne = Cell.Column
c = 3
While Not Sheets("ventes 2015").Cells(2, c) = ""
If Sheets("ventes 2015").Cells(2, c) = Sheets("prévisions 2015").Cells(2, Colonne) Then
If Plage_Moyenne_Quotidienne Is Nothing Then
Set Plage_Moyenne_Quotidienne = Sheets("ventes 2015").Cells(Ligne, c)
Else
Set Plage_Moyenne_Quotidienne = Union(Plage_Moyenne_Quotidienne, Sheets("ventes 2015").Cells(Ligne, c))
End If
End If
c = c + 1
Wend
[color=#0080FF]MOYENNE_QUOTIDIENNE = Application.Average(Plage_Moyenne_Quotidienne)[/color]
End Function
Function MOYENNE_BILAN(Cell)
Dim c As Integer, Plage_Moyenne_Bilan As Range, Ligne As Integer
c = 3
Ligne = Cell.Row
While Not Sheets("ventes 2015").Cells(2, c) = ""
If Plage_Moyenne_Bilan Is Nothing Then
Set Plage_Moyenne_Bilan = Sheets("ventes 2015").Cells(Ligne, c)
Else
Set Plage_Moyenne_Bilan = Union(Plage_Moyenne_Bilan, Sheets("ventes 2015").Cells(Ligne, c))
End If
c = c + 1
Wend
MOYENNE_BILAN = Application.Average(Plage_Moyenne_Bilan)
End Function
Function CALCUL_PREVISION(Cell)
CALCUL_PREVISION = Application.Average(MOYENNE_BILAN(Cell), MOYENNE_QUOTIDIENNE(Cell), PREDICTION_BILAN(Cell), PREDICTION_QUOTIDIENNE(Cell))
End Function
Sub CALCUL_PREVISIONS()
For i = 6 To 26
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
For i = 29 To 52
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
For i = 55 To 67
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
For i = 69 To 77
For k = 3 To 9
Cells(i, k) = CALCUL_PREVISION(Cells(i, k))
Next
Next
End Sub
voila j'ai enlevé les restrictions