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 :

for each pour controle de celulle vide [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    tech
    Inscrit en
    Mai 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : tech

    Informations forums :
    Inscription : Mai 2025
    Messages : 13
    Par défaut for each pour controle de celulle vide
    bonjour,

    j'étais tout heureux d'avoir réussi à écrire ce code :

    Dim ter As Range
    For Each celvide In Range("A1:A12")
    If celvide.Value = "" Then
    MsgBox " merci de ne pas laisser de ligne vide"
    Exit Sub
    Exit For
    End If
    Next ter


    je voulais en faite, que ma macro dise à l'utilisateur de ne pas laisser de case vide dans un tableau A1:A12 ( pour cela ma macro est bonne je pense )
    mais je me suis vite rendu compte que l'utilisateur n'allait pas à chaque fois le remplir en entier ce tableau mais qu'il était possible qu'il ne le remplisse que de 3 ou 4 lignes avant de continuer ma macro.
    de ce fait, j'ai chercher le moyen de "Exit sub" uniquement si il y à une ligne vide entre deux ligne pleine.

    recherche sans succès pour l'instant..

    quelqu'un aurait un conseil pour me guider ?

    un tout grand merci.

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    SAlut

    Tu n'étais pas loin, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim CelVide As Range 
     
    For Each celvide In Range("A1:A12")                 
        If celvide.Value = "" Then                       
           MsgBox " merci de ne pas laisser de ligne vide" 
           Exit For                                             
        End If                                               
    Next
    Tu dois déclarer CelVide, ter ne sert à rien ici.

    Autre chose, il serait préférable de préciser la feuille sur laquelle tu travailles. Le mieux c'est d'utiliser le CodeName des feuilles dans ton code, ça évite bien des risques d'erreur.
    Nom : 2015-01-18_134906.png
Affichages : 193
Taille : 14,2 Ko

    Pour info Exit Sub te fait quitter la procédure complète, le reste du code n'est alors pas exécuté.
    Un conseil, prend tout de suite l'habitude d'indenter ton code pour facilité la lecture et le débogage.

    Et pour ce qui est du forum, tu trouveras un bouton # dans l'éditeur, qui te permet de mettre ton code dans un encadré qui va bien (super important pour les code long et la coloration syntaxique

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre régulier
    Homme Profil pro
    tech
    Inscrit en
    Mai 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : tech

    Informations forums :
    Inscription : Mai 2025
    Messages : 13
    Par défaut
    Raahhhh oui, j'aurais au moins pu voir cela ^^
    merci Qwaz
    Je vais aussi prendre le réflexe de spécifier la feuille comme conseillé.

    le problème est que ce code déclenche la Msgbox si le tableau n'est pas plein. (ce qui est tout à fait possible et autorisé)
    ce que je voudrais c'est que la Msgbox ne se déclenche que lorsqu'il y à une case vide entre deux pleine.

    j'ai oublié de le dire mais vous l'aurez sans doute remarqué, je débute ^^


  4. #4
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub test()
    Dim cel As Range
    Dim videTrouve As Boolean
     
    For Each cel In Range("A1:A12")
        If cel.Value = "" Then
            videTrouve = True
        Else
            If videTrouve Then
                MsgBox "Merci de ne pas laisser de case vide entre deux cases remplies."
                Exit Sub
            End If
        End If
    Next cel
     
    End Sub

  5. #5
    Membre régulier
    Homme Profil pro
    tech
    Inscrit en
    Mai 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : tech

    Informations forums :
    Inscription : Mai 2025
    Messages : 13
    Par défaut
    c'est d'une logique déroutante.
    à force cela rentrera..
    Si je pouvais vous offrir des pralines, je le ferais !

    merci beaucoup qwaz et franc

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Comme disait mon prof de techno en BEP quand il nous demandait de faire un schéma en fonction d'une problématique, "Je veux autant d solution différentes que de gens dans la classe".


    Si on étudie le schéma des différents cas de figure que l'on peut rencontrer, on obtient

    Nom : 2025-05-04_21h06_51.png
Affichages : 172
Taille : 27,1 Ko
    Ici, on se déplace dans la colonne en utilisant Ctrl + Flèche Bas. Ce mode de déplacement arrête le curseur avant un changement de contenu (Lorsqu'on passe de plein à vide ou inversement). En code VBA ça se traduit par
    On peut en déduire que 3 possibilités sont autorisées
    1. 1 seule plage continue avec la 1ère cellule vide
    2. 1 seule plage continue avec la 1ère cellule pleine
    3. 2 plages avec la 1ère cellule pleine


    Les solutions 1 et 2 montrent que si une seule plage existe, on autorise, quelle que soit l'état de la 1ère cellule (pleine ou vide).
    Il ne reste donc que 2 états possible qui sont autorisés
    1. 1 seule plage
    2. 2 plages avec la 1ère cellule pleine


    Niveau code, on peut faire quelques choses comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub TestAuto()
        If Not Autorisation(Feuil1.Range("A1:A12")) Then
            'Message d'alerte
            MsgBox "Merci de ne pas laisser de case vide entre deux cases remplies."
        End If
    End Sub
     
    Function Autorisation(PlageCtrl As Range)
    Dim FirstVide As Boolean
    Dim NbrLoop As Integer
     
    Dim aCell As Range
    Dim NextCell As Range
     
        'On pointe la cellule du début
        Set aCell = PlageCtrl.Cells(1, 1)
     
        'On conserve le fait que A1 soit vide ou non
        FirstVide = aCell.Value = ""
     
        'On parcours une plage continue de valeur (sont vide soit <>vide) autant de fois qu'il faut pour sortir de la zone
        Do
            'On pointe la nouvelle cellule sur laquelle on c'est arrêté
            Set aCell = aCell.End(xlDown)
            'On comptabilise le nombre de boucle
            NbrLoop = NbrLoop + 1
        'Si on dépasse le bas de la plage ou si on fait plus de 2 boucles, on quitte
        Loop Until (aCell.Row >= (PlageCtrl.Row + PlageCtrl.Count)) Or NbrLoop > 2
     
        'On controle le résultat
        Autorisation = (NbrLoop = 1) Or (NbrLoop = 2 And Not FirstVide)
     
    End Function
    Avantage:
    1. Tu peux appeler "Autorisation" dans un code VBA, comme dans la procédure TestAuto
    2. Tu peux utiliser "Autorisation" directement dans une cellule, comme dans la ligne 21. Si le contenu de la plage surveillée change, le résultat se met à jour automatiquement.
      Tu peux ensuite utiliser ce résultat pour faire une coloration des cellules (MFC). Ça évite le MsgBox que je trouve souvent agressif...


    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 179
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Personnellement, j'utilise une mise en forme conditionnelle pour mettre en évidence les cellules non remplies.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle for each pour récupérer des éléments de deux tag différents
    Par patricktoulon dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 25/02/2018, 14h09
  2. Réponses: 2
    Dernier message: 27/01/2009, 13h47
  3. xsl:for-each avec un parametre pour select
    Par arnog dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 26/08/2008, 13h09
  4. Quel est l'index qui sert pour les For Each ?
    Par Nixar dans le forum VB.NET
    Réponses: 5
    Dernier message: 04/06/2007, 08h23
  5. Aide pour For each..... Next
    Par Virgile59 dans le forum Access
    Réponses: 1
    Dernier message: 24/05/2006, 14h34

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