Code qui empêche le fonctionnement d'un autre code
Bonjour le forum,
Je suis totalement novice en VBA mais je suis très intéressé par le programmation en VBA sur Excel. Suite à une semaine de formation sur les bases du VBA je tente de parfaire mon apprentissage tout seul, mais il y a des choses que je ne n'arrive pas à m'expliquer, notamment quand plusieurs codes fonctionnent parfaitement et quand j'en crée un nouveau du coup les autres ne fonctionnent plus. Je m'explique, je suis en train de tenter de faire un fichier de gestion de mes courses pour me faire la main, j'ai donc crée un tableau reprenant plusieurs colonnes avec différentes informations, le but étant au final de pouvoir obtenir une liste de courses à acheter en tenant compte de certains critères et notamment de l'autonomie de chaque article.
j'ai donc crée un code qui me calcule le nombre de jours avant épuisement (code ci-dessous)
Sub joursavantepuisement()
Dim i As Integer
For i = 2 To Worksheets("Courses").Range("A65536").End(xlUp).Row
If Worksheets("Courses").Range("R" & i).Value <> "" Then
Worksheets("Courses").Range("M" & i) = Worksheets("Courses").Range("K" & i).Value * (Range("R" & i).Value + Range("S" & i).Value + Range("T" & i).Value + Range("U" & i).Value + Range("V" & i).Value + Range("W" & i).Value + Range("X" & i).Value + Range("Y" & i).Value + Range("Z" & i).Value + Range("AA" & i).Value) / Range("AD" & i).Value
Else
Worksheets("Courses").Range("M" & i) = ""
End If
Next i
End Sub
Ce code fonctionne parfaitement et le calcul est correct, donc pas de souci jusque là.
Par contre je souhaite ajouter un code qui me fera un tri dans mon fichier, j'ai donc crée le code suivant, code fait avec l'enregistreur de macro :
Sub tri_colonne_B()
'
' tri_colonne_B Macro
'
'
Range("A1:AA20").Select
ActiveWorkbook.Worksheets("Courses").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Courses").Sort.SortFields.Add Key:=Range("B2:B20") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Courses").Sort
.SetRange Range("A1:AA20")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Et là il y a un problème car lorsque j'appelle la fonction tri il m'indique un message d'erreur me renvoyant sur ma fonction joursavantepuisement à la ligne de code entre le then et le else, mais je ne sais pas pourquoi ?
Alors peut être n'est il pas possible de faire un tri sur un grand nombre de colonne j'en ai 27 dans mon tableau ? peut être n'est il pas possible de faire un tri sur des colonnes calculées ?
Peut être que quelqu'un du forum a une idée sur la question et pourrait m'aider sur mon problème svp. Je vous joins le fichier excel pour que vous puissiez mieux comprendre mon problème.
Je vous en remercie par avance.
Cordialement
FabienC75 a écrit :Bonjour le forum,
Je suis totalement novice en VBA mais je suis très intéressé par le programmation en VBA sur Excel. Suite à une semaine de formation sur les bases du VBA je tente de parfaire mon apprentissage tout seul, mais il y a des choses que je ne n'arrive pas à m'expliquer, notamment quand plusieurs codes fonctionnent parfaitement et quand j'en crée un nouveau du coup les autres ne fonctionnent plus. Je m'explique, je suis en train de tenter de faire un fichier de gestion de mes courses pour me faire la main, j'ai donc crée un tableau reprenant plusieurs colonnes avec différentes informations, le but étant au final de pouvoir obtenir une liste de courses à acheter en tenant compte de certains critères et notamment de l'autonomie de chaque article.
j'ai donc crée un code qui me calcule le nombre de jours avant épuisement (code ci-dessous)
Sub joursavantepuisement()
Dim i As Integer
For i = 2 To Worksheets("Courses").Range("A65536").End(xlUp).Row
If Worksheets("Courses").Range("R" & i).Value <> "" Then
Worksheets("Courses").Range("M" & i) = Worksheets("Courses").Range("K" & i).Value * (Range("R" & i).Value + Range("S" & i).Value + Range("T" & i).Value + Range("U" & i).Value + Range("V" & i).Value + Range("W" & i).Value + Range("X" & i).Value + Range("Y" & i).Value + Range("Z" & i).Value + Range("AA" & i).Value) / Range("AD" & i).Value
Else
Worksheets("Courses").Range("M" & i) = ""
End If
Next i
End Sub
Ce code fonctionne parfaitement et le calcul est correct, donc pas de souci jusque là.
Par contre je souhaite ajouter un code qui me fera un tri dans mon fichier, j'ai donc crée le code suivant, code fait avec l'enregistreur de macro :
Sub tri_colonne_B()
'
' tri_colonne_B Macro
'
'
Range("A1:AA20").Select
ActiveWorkbook.Worksheets("Courses").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Courses").Sort.SortFields.Add Key:=Range("B2:B20") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Courses").Sort
.SetRange Range("A1:AA20")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Et là il y a un problème car lorsque j'appelle la fonction tri il m'indique un message d'erreur me renvoyant sur ma fonction joursavantepuisement à la ligne de code entre le then et le else, mais je ne sais pas pourquoi ?
Alors peut être n'est il pas possible de faire un tri sur un grand nombre de colonne j'en ai 27 dans mon tableau ? peut être n'est il pas possible de faire un tri sur des colonnes calculées ?
Peut être que quelqu'un du forum a une idée sur la question et pourrait m'aider sur mon problème svp. Je vous joins le fichier excel pour que vous puissiez mieux comprendre mon problème.
Je vous en remercie par avance.
Cordialement
Bonsoir
Ta colonne AD est utilisé pour la division par la fonction joursavantepuisement.
Or ta formule en AD est : =SI(R4<>"";NBVAL(R4:AA4);"")
Si on est pas dans tes conditions, la valeur de AD est null.
Quand tu fais ta division dans ta fonction joursavantepuisement par :
/ Range("AD" & i).ValueOn divise par 0 donc erreur. On ne divise pas par zero :
Sub joursavantepuisement()
Dim i As Integer
For i = 2 To Worksheets("Courses").Range("A65536").End(xlUp).Row
If Worksheets("Courses").Range("R" & i).Value <> "" and ( Range("AD" & i) <> "" or Range("AD" & i) <> "0" ) Then
Worksheets("Courses").Range("M" & i) = Worksheets("Courses").Range("K" & i).Value * (Range("R" & i).Value + Range("S" & i).Value + Range("T" & i).Value + Range("U" & i).Value + Range("V" & i).Value + Range("W" & i).Value + Range("X" & i).Value + Range("Y" & i).Value + Range("Z" & i).Value + Range("AA" & i).Value) / Range("AD" & i).Value
Else
Worksheets("Courses").Range("M" & i) = ""
End If
Next i
End SubJ'ai ajouté dans le if une vérification si AD n'est pas vide ou égale a zero
Cdt,
Bonsoir Ti_Chou_3
tout d'abord merci pour ta réponse, j'ai donc appliqué ta modification à mon fichier et réactivé la fonction tri qui plantait mon fichier auparavant, mais maintenant j'ai à nouveau des erreurs.
la 1ère m'indique la méthode range de l'objet worksheet a échoué et il me souligne en jaune la ligne de code suivante qui dépend du code jouravantepuisement
For i = 2 To Worksheets("Courses").Range("A65536").End(xlUp).Row
ensuite il apparait une 2ème erreur qui m'indique la méthode apply de l'objet sort a échoué et le seul apply que je vois est celui qui est dans le code du tri.
Je pense donc qu'il doit y avoir autre chose qui empêche le code de fonctionner correctement et qui doit dépendre du tri je pense, car quand je désactive le tri (en le mettant en commentaire pour ne pas qu'il soit pris en compte) je n'ai pas de message d'erreur mais dès que je le remets en fonction j'obtiens ces 2 erreurs.
Qu'en penses tu ? as tu une solution à cela ?
Je t'en remercie par avance.
Cordialement
FabienC75 a écrit :Bonsoir Ti_Chou_3
tout d'abord merci pour ta réponse, j'ai donc appliqué ta modification à mon fichier et réactivé la fonction tri qui plantait mon fichier auparavant, mais maintenant j'ai à nouveau des erreurs.
la 1ère m'indique la méthode range de l'objet worksheet a échoué et il me souligne en jaune la ligne de code suivante qui dépend du code jouravantepuisement
For i = 2 To Worksheets("Courses").Range("A65536").End(xlUp).Row
ensuite il apparait une 2ème erreur qui m'indique la méthode apply de l'objet sort a échoué et le seul apply que je vois est celui qui est dans le code du tri.
Je pense donc qu'il doit y avoir autre chose qui empêche le code de fonctionner correctement et qui doit dépendre du tri je pense, car quand je désactive le tri (en le mettant en commentaire pour ne pas qu'il soit pris en compte) je n'ai pas de message d'erreur mais dès que je le remets en fonction j'obtiens ces 2 erreurs.
Qu'en penses tu ? as tu une solution à cela ?
Je t'en remercie par avance.
Cordialement
poste ton fichier avec toutes les fonctons activées
dis moi l'ordre d execution des requetes que tu executes
Voila le fichier avec toutes les fonctions activées.
Pour l'ordre en fait j'ai commencé par le tri, mais peut être que le problème vient de l'ordre je ne sais pas du tout, j'ai essayé plusieurs solutions mais le fichier plante tout le temps dans n'importe quel sens.
Merci à toi.
FabienC75 a écrit :Voila le fichier avec toutes les fonctions activées.
Pour l'ordre en fait j'ai commencé par le tri, mais peut être que le problème vient de l'ordre je ne sais pas du tout, j'ai essayé plusieurs solutions mais le fichier plante tout le temps dans n'importe quel sens.
Merci à toi.
J'ai trouvé
En fait tu lances la macro TRI qui lance toutes les macros depuis la feuille Accueil.
Or tu n'as pas figé la feuille Course partout ce qui fait que dans plusieurs bouts de code il va chercher le range de la feuille ou tu es donc la feuille Acceuil.
Essai de lancer ta macro TRI en étant dans la feuille course ça passe sans problème.
A faire descendre tout tes codes et placer ceci avant les range:
Worksheets("Courses").ex :
Worksheets("Courses").Range("M" & i) = Worksheets("Courses").Range("K" & i).Value * (Range("R" & i).Value + Range("S" & i).Value + Range("T" & i).Value + Range("U" & i).Value + Range("V" & i).Value + Range("W" & i).Value + Range("X" & i).Value + Range("Y" & i).Value + Range("Z" & i).Value + Range("AA" & i).Value) / Range("AD" & i).Valueà transformer en :
Worksheets("Courses").Range("M" & i) = Worksheets("Courses").Range("K" & i).Value * Worksheets("Courses").(Range("R" & i).Value + Worksheets("Courses").Range("S" & i).Value + Worksheets("Courses").Range("T" & i).Value + Worksheets("Courses").Range("U" & i).Value + Worksheets("Courses").Range("V" & i).Value + Worksheets("Courses").Range("W" & i).Value + Worksheets("Courses").Range("X" & i).Value + Worksheets("Courses").Range("Y" & i).Value + Worksheets("Courses").Range("Z" & i).Value + Worksheets("Courses").Range("AA" & i).Value) / Worksheets("Courses").Range("AD" & i).Value
Super si tu as trouvé la solution alors, ca va bien m'aider.
Je vais faire les modifications que tu m'as indiquées et je reviens vers toi pour te dire ce qu'il en est.
En tous les cas merci beaucoup pour ton aide.
Cordialement
j'ai modifié le code comme tu me l'as indiqué, le voici ci dessous par contre, je ne comprends pas quand tu me dis que je lance ma macro tri depuis ma feuille accueil, ma macro tri se trouve dans la feuille courses et non dans la feuille accueil.
Une fois la modification faite j'ai toujours un message d'erreur qui me met en jaune la dernière ligne du code :
Worksheets("Courses").Range("M" & i) = ""
donc du coup ça plante toujours alors ou me suis je trompé, pourquoi ca marche pour toi et pas pour moi ?
Merci
Sub joursavantepuisement()
Dim i As Integer
For i = 2 To Worksheets("Courses").Range("A65536").End(xlUp).Row
If Worksheets("Courses").Range("R" & i).Value <> "" And (Range("AD" & i) <> "" Or Range("AD" & i) <> "0") Then
Worksheets("Courses").Range("M" & i) = Worksheets("Courses").Range("K" & i).Value * (Worksheets("Courses").Range("R" & i).Value + Worksheets("Courses").Range("S" & i).Value + Worksheets("Courses").Range("T" & i).Value + Worksheets("Courses").Range("U" & i).Value + Worksheets("Courses").Range("V" & i).Value + Worksheets("Courses").Range("W" & i).Value + Worksheets("Courses").Range("X" & i).Value + Worksheets("Courses").Range("Y" & i).Value + Worksheets("Courses").Range("Z" & i).Value + Worksheets("Courses").Range("AA" & i).Value) / Worksheets("Courses").Range("AD" & i).Value
Else
Worksheets("Courses").Range("M" & i) = ""
End If
Next i
End Sub
FabienC75 a écrit :j'ai modifié le code comme tu me l'as indiqué, le voici ci dessous par contre, je ne comprends pas quand tu me dis que je lance ma macro tri depuis ma feuille accueil, ma macro tri se trouve dans la feuille courses et non dans la feuille accueil.
Une fois la modification faite j'ai toujours un message d'erreur qui me met en jaune la dernière ligne du code :
Worksheets("Courses").Range("M" & i) = ""
donc du coup ça plante toujours alors ou me suis je trompé, pourquoi ca marche pour toi et pas pour moi ?
Merci
Sub joursavantepuisement()
Dim i As Integer
For i = 2 To Worksheets("Courses").Range("A65536").End(xlUp).Row
If Worksheets("Courses").Range("R" & i).Value <> "" And (Range("AD" & i) <> "" Or Range("AD" & i) <> "0") Then
Worksheets("Courses").Range("M" & i) = Worksheets("Courses").Range("K" & i).Value * (Worksheets("Courses").Range("R" & i).Value + Worksheets("Courses").Range("S" & i).Value + Worksheets("Courses").Range("T" & i).Value + Worksheets("Courses").Range("U" & i).Value + Worksheets("Courses").Range("V" & i).Value + Worksheets("Courses").Range("W" & i).Value + Worksheets("Courses").Range("X" & i).Value + Worksheets("Courses").Range("Y" & i).Value + Worksheets("Courses").Range("Z" & i).Value + Worksheets("Courses").Range("AA" & i).Value) / Worksheets("Courses").Range("AD" & i).Value
Else
Worksheets("Courses").Range("M" & i) = ""
End If
Next i
End Sub
envoi ton fichier avc tes modifs
comment lances tu tes macros? Bouton? Outil macro? Si oui ds quelle feuille es tu quand tu lances tes macros
Mes codes sont tous reliés sur la page courses et sont lancés par un appel de fonction comme ci dessous :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
'tri_colonne_B
joursavantepuisement
autonomieenjours
dateprochainecourses
copiestockactuel
End Sub
J'ai commenté la fonction tri_colonne_B afin d'éviter que le fichier plante.
Tu trouveras le fichier avec les modifs de tout à l'heure en pièce jointe.
FabienC75 a écrit :Mes codes sont tous reliés sur la page courses et sont lancés par un appel de fonction comme ci dessous :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
'tri_colonne_B
joursavantepuisement
autonomieenjours
dateprochainecourses
copiestockactuel
End Sub
J'ai commenté la fonction tri_colonne_B afin d'éviter que le fichier plante.
Tu trouveras le fichier avec les modifs de tout à l'heure en pièce jointe.
et donc comment lances tu ta macro?
les macros se lancent toutes seules dès qu'il y a un changement dans la feuille courses c'est pour cela que j'appelle les fonctions directement dans la feuille courses comme ci-dessous :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
'tri_colonne_B
joursavantepuisement
autonomieenjours
dateprochainecourses
copiestockactuel
End Sub
par exemple joursavantepuisement appelle la fonction qui se trouve dans mon module 2 de mon fichier et qui est décrit par le code suivant (code sur lequel j'ai fait les modifications que tu m'as indiquées tout à l'heure)
Sub joursavantepuisement()
Dim i As Integer
For i = 2 To Worksheets("Courses").Range("A65536").End(xlUp).Row
If Worksheets("Courses").Range("R" & i).Value <> "" And (Range("AD" & i) <> "" Or Range("AD" & i) <> "0") Then
Worksheets("Courses").Range("M" & i) = Worksheets("Courses").Range("K" & i).Value * (Worksheets("Courses").Range("R" & i).Value + Worksheets("Courses").Range("S" & i).Value + Worksheets("Courses").Range("T" & i).Value + Worksheets("Courses").Range("U" & i).Value + Worksheets("Courses").Range("V" & i).Value + Worksheets("Courses").Range("W" & i).Value + Worksheets("Courses").Range("X" & i).Value + Worksheets("Courses").Range("Y" & i).Value + Worksheets("Courses").Range("Z" & i).Value + Worksheets("Courses").Range("AA" & i).Value) / Worksheets("Courses").Range("AD" & i).Value
Else
Worksheets("Courses").Range("M" & i) = ""
End If
Next i
End Sub
J'espère que j'ai été assez clair pour toi et que tu comprends ce que je veux t'expliquer, désolé mais je suis novice comme je te l'ai dit donc je n'ai peut être pas les bons mots
j'ai commenté ta fonction qui enchaine les fonctions car ca tourne en boucle
jai crée un bouton sur accueil qui lance la fonction execution qui lance toutes tes fonctionset c'est ok.
ta macro que tu avais crée se lance a chaque modification de cellule mais a chaque fonction qui s'enchaine ca modifie les données donc ca relance la fonction en boucle
cdt,
effectivement maintenant avec tes modifications cela fonctionne parfaitement, merci beaucoup.
Je t'avoue que je ne comprends pas pourquoi en regroupant toutes les fonctions derrière un autre bouton ça fonctionne alors qu'auparavant les fonctions étaient les mêmes mais ça ne fonctionnait pas.
En tous les cas je te remercie pour ton aide précieuse et pour le temps que tu as bien voulu consacré à résoudre mon problème cela va bien m'aider et je vais pouvoir continuer mon fichier.
Un grand merci à toi
Cordialement
effectivement maintenant avec tes modifications cela fonctionne parfaitement, merci beaucoup.
Je t'avoue que je ne comprends pas pourquoi en regroupant toutes les fonctions derrière un autre bouton ça fonctionne alors qu'auparavant les fonctions étaient les mêmes mais ça ne fonctionnait pas.
En tous les cas je te remercie pour ton aide précieuse et pour le temps que tu as bien voulu consacré à résoudre mon problème cela va bien m'aider et je vais pouvoir continuer mon fichier.
Un grand merci à toi
Cordialement
FabienC75 a écrit :effectivement maintenant avec tes modifications cela fonctionne parfaitement, merci beaucoup.
Je t'avoue que je ne comprends pas pourquoi en regroupant toutes les fonctions derrière un autre bouton ça fonctionne alors qu'auparavant les fonctions étaient les mêmes mais ça ne fonctionnait pas.
En tous les cas je te remercie pour ton aide précieuse et pour le temps que tu as bien voulu consacré à résoudre mon problème cela va bien m'aider et je vais pouvoir continuer mon fichier.
Un grand merci à toi
Cordialement
Ta fonction avc tes 5 fonctions se declenchent des qu on modifie une cellule.
A la premiere fonction on modifie des cellules donc ta boucle se relancait sand arret en boucle voila la raison
Ok j'ai compris effectivement au bout d'un moment ça fait planté le fichier.
Encore merci à toi
Cordialement