End if, lors de fin de macro

Résolu
Philou73CH -  
sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    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.
    0
    1. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
       
      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
      0
    2. Philou73CH
       
      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.
      0
  2. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    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.
    0
    1. Philou73CH
       
      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
      0
  3. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    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.
    0
    1. Philou73CH
       
      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.
      0
    2. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
       
      Ravis d'avoir pu aider. N'oublie pas de passer cette conversation comme Résolue =)
      0