IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

End Sub et Le Next de For Next


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 306
    Par défaut End Sub et Le Next de For Next
    Bonsoir,

    Deux petits problèmes qui doivent se raccrocher à des règles basiques mais que je n'ai pas encore résolu :

    Il s'agit d'effacer une liste si le mot est présent dans une autre liste.

    Un bouton dont le code dans la feuille est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub A_effacer_Click()
    Private Sub Worksheet(ByVal Target As Range)
    ...
    End Sub
    un message s'affiche : "End Sub attendu" : ?? Il y a bien un End Sub en fin de code.

    Deuxième mécontentement (), il s'agit de regarder si le mot dans la liste située sur la même feuille en AK3:AK100 se trouve dans la plage C2:C100, et dans ce cas, supprimer le mot dans AK3:AK100.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub A_effacer_Click()
    Private Sub Worksheet(ByVal Target As Range)
    Dim Cell As Range 
    FOr Each Cell In Range ("D2:AC100")
    If Range ("D2:AC100").Value = Range ("AK2:AK100") then 
    Cell.Value.Delete
    Next
    End If
    End SUb
    Un message : For sans Next (ou Next sans For), je sais plus. Mais lorsque je mets For avant Next , un autre message d'erreur s'affiche. ???
    Second essai avec deux variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub A_effacer_Click()
    Private Sub Worksheet(ByVal Target As Range)
    Dim Cell As Range
    x = Range("D2:AC100").Cells
    y = Range("AK:AC100").Cells
    FOr Each Cell In x
    If x.Cell.Value = y.Cell.Value then
    y.Cell.Value.Delete
    Next FOr 
    End If 
    End Sub
    Un résultat d'erreur est envoyé.

    merci pour votre aide.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Comment tu peux oser écrire ceci? voyons!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub x()
    sub y()
    ...
    end sub
    une sub s'écrit comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub X()
    'code
    end sub

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 306
    Par défaut
    attention, n'y-a-til pas concurrence entre le Private Sub du bouton et le Private Sub du Worksheet_change ? car ça ne résoud pas le "ENd Sub Attendu"

    avec cette macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub A_effacer_Click()
    Private Sub Worksheet(ByVal Target As Range)
    Dim Cell As Range 
    FOr Each Cell In Range ("D2:AC100")
    If Range ("D2:AC100").Value = Range ("AK2:AK100") then 
    Cell.Value.Delete
    Next
    End If
    End SUb
    End Sub Attendu est aussi renvoyé.

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    as tu lu qu'on peut pas écrire ainsi

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut logiclogic et le forum
    Au risque de te décevoir, VBA est interpréteur de texte. Comme malheureusement ce n'est pas toi qui l'a développé, il obéit à un certain nombre de règles. C'est pareil que le français. Il faut respecter ses orthographe et syntaxe pour qu'Excel arrive à comprendre ce qu'il doit faire.
    Et tu as du pot, quand Excel arrive à avoir une idée de ce qui ne va pas, il te le signale.
    Donc : une macro commence par un début (sub ou function) et finit par une fin (end sub ou end Function). On ne peut pas imbriquer le code de deux macros. On peut appeler une macro dans le code d'une autre.
    Si tu veux que le code d'une macro puisse être exécuter en automatique ou à partir d'un bouton, il faut que les deux l'appelle en s'en servant de sous-programme.

    Au lieu de mettre un code inapplicable, si tu expliquais ce que tu veux obtenir, on pourrait peut-être t'aider.
    A+
    PS : tu ne peux pas séparer les instructions de leurs fin (If et endif, par exemple)
    For ....
    if ....
    Next ...
    End iF
    te ressortira systèmatiquement une erreur, il trouve un next sans avoir clôturé son instruction If
    Idem pour
    If...
    For...
    Endif
    Next
    VBA ne peut pas analyser le code, puisque une instruction n'est pas clôturée alors que tu en commence une autre qui a besoin d'une instruction de fin

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 306
    Par défaut
    Bonsoir,


    il s'agit, lorsqu'on clique sur un bouton, de lancer une macro qui vérifie si un des mots de la liste AK se trouve dans la plage de cellules, et de la supprimer si c'est le cas.
    Tu trouveras tout les détails dans mon premier message. Merci, je vais essayer avec une formule pour supprimer les doublons, mais si tu a la réponse je ne serais pas contre.

    Pour en revenir au Attendu End Sub, cela m'est déjà arrivé le fait que ce message apparaisse en début de macro (alors que la macro commence bien par Sub et se termine par End Sub).

    Sinon, merci pour End If qui doit être avant le Next.

  7. #7
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub A_effacer_Click()  '??
    Private Sub Worksheet(ByVal Target As Range)
    Dim Cell As Range
    Tu réinvente la roue? tu ne peux pas "imbriquer" les procédures comme ceci.
    un peux de lecture d'abord

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heuh!!!
    bonjour

    au cas ou il n'aurais pas compris

    tu a une private bidulechouette en trop !!!!!!!


    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut logiclogic et le forum
    Deuxième mécontentement (), il s'agit de regarder si le mot dans la liste située sur la même feuille en AK3:AK100 se trouve dans la plage C2:C100, et dans ce cas, supprimer le mot dans AK3:AK100
    Je ne m'occupe pas de ta macro qui définie des plages différentes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
    Dim Cel As Range, Cel_1 As Range
    For Each Cel In [C2:C100]
        For Each Cel_1 In [AK3:AK100]
            If Cel = Cel_1 Then
                Cel_1.Delete Shift:=xlUp
                Exit For
            End If
        Next Cel
    Next X
    End Sub
    Pour toutes les cellules de C2:C100 faire une boucle sur les cellules de la plage AK3:AK100. S'il y a égalité, supprimer la cellule AK, lancer le test d'une nouvelle cellule de C.
    J'ai mis un "Exit For" pour accélérer le traitement en partant du principe que la colonne AK ne comporte pas de doublons.
    Ne connaisssant rien d'autre que les postes, je suggèrerais de remplacer [AK3:AK100] par Range([AK100], cells(rows.Count, "AK").end(xlup)) de AK3 à denière non vide en AK. mais ça suppose que AK ne contient que la liste.
    A+

    PS : comme le code est simple, je ne l'ai même pas testé.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 306
    Par défaut
    bonsoir,

    remarque générale : je suis novice dans le vba...

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par logiclogic Voir le message
    attention, n'y-a-til pas concurrence entre le Private Sub du bouton et le Private Sub du Worksheet_change ? car ça ne résoud pas le "ENd Sub Attendu"

    avec cette macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub A_effacer_Click()
    Private Sub Worksheet(ByVal Target As Range)
    Dim Cell As Range 
    FOr Each Cell In Range ("D2:AC100")
    If Range ("D2:AC100").Value = Range ("AK2:AK100") then 
    Cell.Value.Delete
    Next
    End If
    End SUb
    End Sub Attendu est aussi renvoyé.
    bonjour quand tu imbrique une condition "if" dans une boucle le end if dois etre forcement avnt le next



    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. [VBA Word] Next sans for
    Par Dobyan08 dans le forum VBA Word
    Réponses: 6
    Dernier message: 20/10/2016, 10h57
  2. Réponses: 3
    Dernier message: 03/11/2005, 19h22
  3. Nom de Champ pour utiliser For/Next
    Par Mulele dans le forum Access
    Réponses: 2
    Dernier message: 21/10/2005, 19h57
  4. Nom de Champ dans une table pour utiliser For/Next
    Par Mulele dans le forum Access
    Réponses: 6
    Dernier message: 30/10/2004, 13h28
  5. qbasic : pause avec FOR-NEXT
    Par clood200 dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 08/08/2003, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo