End if, lors de fin de macro [Résolu/Fermé]

Signaler
-
Messages postés
1798
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
19 décembre 2016
-
Bonjour,

J'ai fait un dossier Excel 2010, dans lequel j'ai plusieurs macros qui se chevauchent et il y a aussi plusieurs Userform.
Je suis Petzi qui découvre la programmation et qui a fait des progrès grace à ce précieux et aimable forum.
Du coup, ma question est certainement basique, mais j'ai besoin d'une réponse.
Pourquoi une fois que la macro arrive à son terme, elle repart chercher tous les "End Sub" et les " End If" ?
Ce qui me pose problème est la chose suivante, c'est qu'en allant chercher un "End If", le programme exécute l'Userform qui se trouve après. Et il m'est pas possible de déplacer ce End If car sinon, cela changerai le déroulement de la macro dans le "sens aller".

Et Tous les If doivent-ils avoir un End If directement ?
Car le programme me dit " End If sans bloc If" pour cette partie de programmation :
'Enlever les autres noms
For n = 50 To 2 Step -1
If Range("A" & n) <> Range("A1") Then Rows(n).Delete
Next n
End With

Voilà, j'espère avoir été compréhensible dans mes questions et vous remercie d'avance de vos réponses.

3 réponses

Messages postés
1798
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
19 décembre 2016
283
Bonjour,

Oui, toute instruction de type
 If... Then
doit contenir un
 End If
, sauf un seul cas particulier, à éviter pour question de lisibilité, quand on passe les instructions sur la même ligne. Je m'explique.

If x = 1 Then
y = 2
End If

Sera équivalent à

If x = 1 Then y = 2

Dans ce deuxième code, il n'y a pas d'instruction End If car elle est sous entendue dans la ligne.

Pour reprendre ton code :

For n = 50 To 2 Step -1

Cette instruction crée une boucle qui va exécuter tout le code qui va suivre autant de fois que n aille de 50 à 2, soit 49 fois.

If Range("A" & n) <> Range("A1") Then Rows(n).Delete

Ton If possède son End If sous entendu, il n'est pas besoin d'en rajouter un ici.

Next n

On passe à la step suivante de n, c'est à dire n-1.

End With 

Sauf si tu as une ligne de code précédente qui commence par
With 
tu dois supprimer ce morceau.
Messages postés
1798
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
19 décembre 2016
283
Ha oui, et ta vérification
If Range("A" & n) <> Range("A1") Then
ne sert à rien puisque d'après la boucle, n ne sera jamais plus petit que 2, donc "A'&n ne sera jamais égal à A1. Donc tu peux te contenter de faire ton
Rows(n).Delete
Bonjour et merci de vos explications claires sur le If.

J'ai visiblement pas copier / coller depuis la bonne place pour que vous puissiez analyser la partie de la macro et je m'en excuse.

Voici donc en rectification ( Même si c'est pas la même partie de la macro c'est la même fonction)

With Worksheets("TT")
.Range("A24") = ListBox1.Text
'Enlever les autres noms
For n = 150 To 26 Step -1
If Range("A" & n) <> Range("A24") Then Rows(n).Delete
Next n
End With

Le but de mon If est d'avoir un double contrôle c'est à dire déliminer les noms qui ne correspondent pas à celui choisi par l'utilisateur et qui est inscrit dans "A24". Pour moi cela fonctionne quand je test le programme. Par contre pour vous est-ce bien par cette partie du programme ?

Par contre, avez-vous une idée comment je peux déplacer ou enlever le End If qui me pose problème. Vous trouverez ci-dessous une partie de la macro incriminée.

Private Sub ListBox1_Change()
With Worksheets("TT")
.Range("A6") = ListBox1.Text
'Enlever les autres noms
For n = 70 To 8 Step -1
If Range("A" & n) <> Range("A6") Then Rows(n).Delete
Next n
End With
'Exporter dans tableau caché dans fax N-Q
Sheets("FAX").Activate
Range("P7").Select
ActiveCell.FormulaR1C1 = "=TT!R[1]C[-14]"
Range("Q7").Select
ActiveCell.FormulaR1C1 = "=TT!R[1]C[-14]"
Range("R7").Select
ActiveCell.FormulaR1C1 = "=TT!R[1]C[-13]"
Unload Me
'Contrôle compatibilité avec fonction
If Range("B11").Value < "22" Then
MsgBox ("Attention, la personne inscrite n'a pas le code adéquat")
UserForm6.Show
End If <-- C'est celui-ci qui me pose soucie
UserForm8.Show

End Sub

Merci à vous d'avoir pris du temps pour moi.
Messages postés
1798
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
19 décembre 2016
283
Ce code fonctionne chez moi :

Private Sub ListBox1_Change()
Sheets("TT").Activate
Range("A6") = ListBox1.Text
'Enlever les autres noms
For n = 70 To 8 Step -1
If Range("A" & n) <> Range("A6") Then Rows(n).Delete
Next n
'Exporter dans tableau caché dans fax N-Q
Sheets("FAX").Activate
Sheets("FAX").Range("P7").FormulaR1C1 = "=TT!R[1]C[-14]"
Sheets("FAX").Range("Q7").FormulaR1C1 = "=TT!R[1]C[-14]"
Sheets("FAX").Range("R7").FormulaR1C1 = "=TT!R[1]C[-13]"
'Unload Me
'Contrôle compatibilité avec fonction
If Range("B11").Value < "22" Then
MsgBox ("Attention, la personne inscrite n'a pas le code adéquat")
UserForm6.Show
End If
UserForm8.Show
End Sub

Je ne vois pas à quoi sert le Unload Me, c'est ce qui me faisait planter chez moi, je l'ai donc commenté. J'ai simplifié un peu le code aussi.

Vérifie si ça tourne comme ça.
Merci, pour vos simplifications.
Par contre le problème reste. J'ai compris qu'il se déclanche quand il y a utilisation de la boucle Contrôle de la fonction. Je ne comprends pas pourquoi la macro, une fois fini, retourne sur tout les End Sub et quelques End If. 99% ne pose pas de problème, mais celui qui est dans cette partie oui. Et ce que vous avez modifier ne change rien. Donc le soucis est ailleurs dans le programme. Du coup, j'ai bricolé, comme d'hab.
Je mets la condition que si la cellule qui sera après userForm 8 est vide ( J11), il est fait, sinon non. Voilà, c'est tiré par les cheveux, ca rajoute à la macro, mais grace à ce que vous avez enlevé, je suis au point mort ( :-)) )
Merci à vous, votre aide m'a été précieuse.


Private Sub ListBox1_Change()
Sheets("TT").Activate
Range("A6") = ListBox1.Text
'Enlever les autres noms
For n = 70 To 8 Step -1
If Range("A" & n) <> Range("A6") Then Rows(n).Delete
Next n
'Exporter dans tableau caché dans fax N-Q
Sheets("FAX").Activate
Sheets("FAX").Range("P7").FormulaR1C1 = "=TT!R[1]C[-14]"
Sheets("FAX").Range("Q7").FormulaR1C1 = "=TT!R[1]C[-14]"
Sheets("FAX").Range("R7").FormulaR1C1 = "=TT!R[1]C[-13]"
Unload UserForm7
'Contrôle compatibilité avec fonction
If Range("B11").Value < "22" Then
MsgBox ("Attention, la personne inscrite n'a pas le code adéquat") <- si celà est vrai, s'est là que le problème surgit

UserForm6.Show
End If
If Sheets("FAX").Range("J11").Value = "" Then
UserForm8.Show
End If
End Sub
Messages postés
1798
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
19 décembre 2016
283
Sinon tu peux toujours essayer de m'envoyer le fichier histoire que je puisse tester avec les UserForm, comme je ne les ai pas chez moi j'ai du les supprimer. Si le problème vient de là, ça expliquerait pourquoi ça fonctionne chez moi et pas chez toi.
Je te remercie de ton aimable proposition. La solution que j'ai trouvé fonctionne. Je n'ai pas compris le pourquoi du comment, mais à défaut de soigner la maladie j'ai enlever les symptômes.
Pour moi ce projet est clot puisque fonctionnel en l'état. Je vais donc passer à autre chose et ne pas te faire perdre ton temps inutilement.
Recois mes meilleures salutations et encore merci pour le temps que tu as pris pour me répondre.
Messages postés
1798
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
19 décembre 2016
283
Ravis d'avoir pu aider. N'oublie pas de passer cette conversation comme Résolue =)