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 :

Tester si le contenu d'une cellule est numérique ou non et établir une plage pour combobox [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Par défaut Tester si le contenu d'une cellule est numérique ou non et établir une plage pour combobox
    Bonjour à toutes et à tous,

    je souhaiterais tester la cellule F6. Si celle-ci est un nombre, alors je teste la cellule G6. De même, si G6 est un nombre, je continue avec H6.
    Si par exemple I6 n'est pas un nombre, alors je sors de la boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    a = 0
    For i = 6 To 25
    If IsNumeric(Cells(6, i)) = True Then
    a = a + 1
    End If
    Next i
    MsgBox "a = " & a
     
      Feuil2.Range(Cells(6, 6), Cells(6, 5 + a)).Name = "evaluation"
      Me.ComboBox1.RowSource = "evaluation"
      Me.ComboBox1.ControlSource = "A101"
    Mon problème : cette macro ne fonctionne pas. Dans mon test, F6=1, G6=2 jusqu'à N6=9 ( O5 et O6 sont fusionnées avec un texte à l'intèrieur )
    Lorsque je lance ma macro, ma combobox ne me propose que le 1. ( je voudrais avoir tous les nombres de 1 à 9 dans ce cas présent et choisir celui qui m'intéresse )

    J'ai ajouter une MsgBox afin de tester la valeur de "a" et cela me donne a=20

    Pouvez-vous m'aider.

    Merci d'avance.

    NOVICE72

  2. #2
    Membre émérite Avatar de Nicolas JACQUIN
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : .
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2014
    Messages : 556
    Par défaut
    Bonjour,
    en fouillant sur le forum, tu trouve

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub Test_V04()
        Dim x As Integer
     
        'Boucle de 1 à 10
        For x = 1 To 10
            'On sort de la boucle si la cellule testée ne contient
            'pas une donnée numérique.
            If Not IsNumeric(Cells(x, 1)) Then Exit For
            'Multiplie le contneu de la cellule par 2
            Cells(x, 1) = Cells(x, 1) * 2
        Next x
    End Sub
    A adapter

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, je n'aime pas les exit for. Lorsque je lis un code, je m'attends à ce qu'un for...next tourne le nombre de fois prévu dans le for. S'il faut sortir prématurément de la boucle, je préfère alors une boucle do...loop avec une condition de sortie explicite dans la boucle.

    Attention également à VBA qui fait du transtypage permissif... Ainsi, IsNumeric() testé sur une cellule mise au format texte mais contenant une valeur qui peut être numérique renverra TRUE.

    Je te propose le code suivant, à adapter. Ici, je remplis le combobox à l'initialisation du userform.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub FillComboBox()
      Dim rng As Range
     
      Set rng = Range("f6")
      Do While rng.Column <= 25 And IsNumeric(rng.Value)
        ComboBox1.AddItem rng.Value
        Set rng = rng(1, 2)
      Loop
    End Sub
     
    Private Sub UserForm_Initialize()
      FillComboBox
    End Sub
    Pour plus de souplesse et de maintenabilité de ton code, il serait judicieux de travailler avec une plage nommée, qui t'éviterait de devoir modifier ton code si la taille et la position de cette plage sont modifiées par la suite. Perso, je déléguerais au code appelant le soin de charger le combobox avant son affichage. Cela offre également plus de souplesse pour la suite...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.

    Si O5 et O6 sont fusionnées, le texte est dans O5 et O6 est vide.

    Si G6=2 et que IsNumeric dit que G6 n'est pas numerique, c'est que G6 ne contient pas seulement 2. Il contient autre chose qui n'est pas numerique.

  5. #5
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Par défaut
    Merci à tous les 2. Pierre et Docmarti.

    Pour suivre vos conseils, comment établir une plage donnée ?
    En effet, ma plage commence en F6 et doit se terminer en G6 ou H6 ou I6 ou......... Y6 ( au maximum ).
    Autrement dit, ma plage ( de la combobox ) est variable.


    Cordialement.


    NOVICE72

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Non, ce n'est pas la plage du combobox qui est variable, puisque tu n'appuies pas ton combobox sur une plage. Tu as une plage fixe, actuellement F6:Y6 selon le code que tu as donné, et tu parcoures cette plage en ajoutant une ligne à ton combobox tant que la valeur de la cellule examinée est numérique. Ta plage est donc fixe et la liste de ton combobox est variable et pourrait, dans certains cas, n'avoir aucune ligne (si F6 n'est pas numérique).

    Le problème est que si demain, tu ajoutes une ligne avant la ligne 6 ou que tu ajoutes une colonne avant la colonne Y, tu devras modifier ton code. C'est pourquoi il est plus intéressant de nommer F6:Y6 avec un nom siginificatif. En utilisant la plage nommée dans ton code plutôt que F6:Y6, tu te donnes la possibilité de modifier cette plage par la suite sans devoir toucher à ton code.

    Par exemple, en nommant ta plage F6:Y6 SourceCombo, tu pourras utiliser le code suivant, qui rend ta maintenance plus souple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub FillComboBox()
      Dim rng As Range
     
      Set rng = Range("SourceCombo").Cells(1)
      Do While Not Intersect(rng, Range("SourceCombo")) Is Nothing And IsNumeric(rng.Value)
        ComboBox1.AddItem rng.Value
        Set rng = rng(1, 2)
      Loop
    End Sub
     
    Private Sub UserForm_Initialize()
      FillComboBox
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Par défaut
    Bonjour Pierre et merci pour ton aide.
    Je vais mettre ton code en application mais pour cela, j'ai quelques questions à te poser afin de l'adapter.
    que signifie Cells(1) de : Set rng = range("SourceCombo").Cells(1) ? une cellule comprend Une abscisse et une ordonnée ( 2 nombres )
    que signifie : rng(1,2) ? la plage commence en cellule B1
    De même, je sais ce qu'est une intersection donc une "non-intersection". Ici tu recherches la non intersection de 2 PLAGES ( rng et "SourceCombo" )???

    Voilà. J'attends de tes nouvelles et te remercie encore une fois pour ton aide.

    NOVICE72

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Range("SourceCombo").Cells(1) signifie que l'on prend la première cellule de la plage (celle du coin supérieur gauche, donc), soit dans ce cas-ci F6.

    rng(1,2) signifie que l'on pointe vers la cellule qui se trouve en ligne 1, colonne 2 par rapport à la cellule de référence. On se déplace donc d'une cellule vers la droite sur la même ligne.

    Pour ce qui est des intersections, je teste en fait que rng et range("sourcecombo") ont une plage d'intersection. Dans ce cas précis, cela revient à tester que rng appartient à range("sourcecombo"). Intersect(...) renvoie la plage d'intersection si elle existe, sinon il renvoie Nothing. Je teste dont Not intersect(...) is nothing pour m'assurer que je suis bien dans range("sourcecombo"). Dans le cas présent, cela permet de sortir de la boucle lorsque je suis sur Z6, c'est-à-dire juste à droite de la dernière cellule de SourceCombo.

    Je boucle donc à deux conditions:
    1. Etre dans les limites de la plage SourceCombo, soit ici dans F6:Y6;
    2. Etre dans une cellule qui contient une valeur pouvant être numérique au besoin (rappel sur le transtypage automatique de VBA).


    La combobox est donc remplie soit:
    • par les valeurs numériques précédant la première valeur non numérique de sourcecombo;
    • par toutes les valeurs de sourcecombo si sourcecombo ne contient que des valeurs numériques.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Par défaut Endroit où écrire ton programme
    (re)bonjour,
    Comme mon pseudo l'indique, j'ai du mal.....
    J'ai fais un Copier/coller de ton programme dans l'Userform mais je n'arrive pas à ouvrir mon Userform quand je lance la macro d'ouverture.
    Où ai-je fais l'erreur sachant que (comme tu l'as deviné ) Eleveun est le nom de l'Userform ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub Devoir()
    Eleveun.Show
    End Sub
    Massage d'erreur :
    ( Erreur '1004' : La méthode 'range' de l'objet '_Global' a échoué )


    Cordialement.


    NOVICE72

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Rien ne sert d'ouvrir une nouvelle discussion pour parler de ce problème si c'est pour en parler ici. Tu disperses les forces des gens qui répondent et tu risques simplement que plusieurs personnes penchent sur le même problème dans des discussions différentes. (J'ai supprimé l'autre discussion)

    Comme tu es novice, prends le temps d'apprendre. Une bonne idée serait, avant de te plonger tête baissée dans le pissage de code, de jeter un canevas, même sommaire, de ce que tu souhaites réaliser. Cela simplifiera et balisera ton travail. Cela te permettra également de travailler sur des problématiques clairement circonscrites, car j'ai un peu l'impression que tu t'y perds et que tu tires tous azimuts.

    Pour la clarté de la lecture, évite de reprendre les réponses en citation. Si tu dois citer une partie du message, limite-la à ce qui est important pour ta propre réponse.


    Par rapport à ton problème...
    Je doute que ce soit sur eleveun.show que le problème se pose. Mets-toi sur cette ligne puis presse F8 pour avancer pas à pas. Tu pourrais ainsi voir sur quelle ligne et à quel moment ça coince. C'est surtout de cette info-là dont nous avons besoin pour pouvoir t'aiguiller... Sur base de l'info que tu donnes, je penserais pour une erreur de saisie dans le nom de la plage par rapport au nom que tu as donné en Excel.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Par défaut
    (re)bonjour Pierre,

    J'ai exactement fais ce que tu m'as dit ( utilisation de F8 ). Il s'avère que le déroulement du programme ( surlignage jaune) se bloque sur ta ligne de programme :

    Do Not While........ qui se trouve dans le sub FillCombobox.

    En effet, la ligne précédente est surligné en jaune et quand je fais F8 , mon message d'erreur apparaît.

    Je me pose juste la question suivante : Comme ton programme sait sur quelle feuille aller ??? En effet, il y a autant de plage (F6:Y6) qu'il y a de feuilles


    Merci d'avance.

    PS: Pour répondre au fait que je suis Novice, cela fait 2 ans que je pratique après lecture de 3 ou 4 bouquins mais AUCUN BOUQUIN ne rentre de manière très approfondie, dans les détails des Userforms de manière générales. Là où j'habite, Près du Mans, les Bouquins qui sembleraient valables ne sont pas en stock.
    Je ne souhaite plus acheter de livres ( à l'aveugle comme sur internet ) sans avoir survolé le contenu. De nos jours ce n'est plus possible. Il faut toujours acheter et si ça te plaît pas, tant pis pour toi......... le libraire a fait sa vente......
    C'est pourquoi, j'attends la rentrée de septembre pour prendre des cours au CNAM du Mans ( cours du soir....... )
    En attendant je surf sur internet et surtout sur CE SUPER SITE où les conseils sont rapides, et efficaces.

    Cordialement et encore merci pour ton aide.

    NOVICE72

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Tu donnes ici une nouvelle info qui dit qu'il y a plusieurs feuilles avec une plage F6:Y6. Dès lors, la manipulation des plages nommées est un peu plus complexe.

    Si on peut partir de l'idée que c'est F6:Y6 de la feuille active, je te propose de revenir à du plus simple et d'oublier les plages nommées pour l'instant. Remplace simplement SourceCombo par F6:Y6. Il sera toujours temps de peaufiner plus tard...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 676
    Par défaut
    Citation Envoyé par Novice72 Voir le message
    AUCUN BOUQUIN ne rentre de manière très approfondie, dans les détails des Userforms de manière générales.
    As tu regardé les tutos dispo sur ce site? moi ils m'ont bien aidé:
    http://silkyroad.developpez.com/VBA/UserForm/
    http://silkyroad.developpez.com/VBA/ControlesUserForm/

  14. #14
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Par défaut
    Bonsoir Pierre,

    J'ai suivi ton conseil en mettant "F6:Y6" . Maintenant ça fonctionne.
    Toutefois, si les dernières cellules ne sont pas des nombres, ma combobox se complète par des espaces blancs.....
    J'ai donc réussi ( grâce à toi ) à remplacer de nouveau "F6:Y6" par cells(6,6),cells(6,5+a) où "a" est une variable ( comprise entre 1 et 20 ) et maintenant ça fonctionne ( plus d'espaces blancs )


    Encore Merci


    NOVICE72

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

Discussions similaires

  1. lancer une macro en fonction si une cellule est vide ou non
    Par timtof2011 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/11/2011, 14h12
  2. lancer une macro en fonction si une cellule est vide ou non
    Par timtof2011 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/11/2011, 10h01
  3. Réponses: 23
    Dernier message: 21/07/2009, 14h19
  4. Réponses: 5
    Dernier message: 03/02/2009, 13h43
  5. Réponses: 2
    Dernier message: 17/11/2008, 12h40

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