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

28courses-22012015.zip (176.84 Ko)
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).Value

On 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 Sub

J'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.

20courses-22012015.zip (177.35 Ko)
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.

26courses-22012015.zip (166.79 Ko)
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

Rechercher des sujets similaires à "code qui empeche fonctionnement"