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

Excel Discussion :

Tests sur une chaîne de caractères [XL-2007]


Sujet :

Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 88
    Points : 52
    Points
    52
    Par défaut Tests sur une chaîne de caractères
    Bonjour à tous,

    J'ai besoin de votre aide, s'il vous plait !

    Dans une cellule, j'ai un numéro de code suivant : JDXXYY où XX représente le mois et YY le jour. Cette cellule est renseignée par un opérateur et je ne veux pas que le XX soit inférieur à "01" ni supérieur à "12" de même que le YY doit être compris ente "01" et "31".
    J'ai essayé avec un MID en VBA et différents tests ainsi que par les validations de données mais je n'y arrive pas
    Comment puis je faire, s'il vous plait ?
    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 932
    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 : 12 932
    Points : 28 927
    Points
    28 927
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Difficile de savoir si tu attends une solution avec les formules et outils d'Excel ou avec VBA.
    Parce-que le groupe de ton Fil est Excel et ensuite tu parles à la fois de MID en VBA et de validation de données, ce qui est un outil d'excel.
    Alors en admettant que tu choisisses Excel et sa validation de données, voici une piste pour savoir si XX est entre 01 et 12
    A placer dans l'option personnalisé de l'outil Validation de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ET(STXT(A2;3;2)>="01";STXT(A2;3;2)<="12")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ET(CNUM(STXT(A2;3;2))>=1;CNUM(STXT(A2;3;2))<=12)
    Si c'est l'outil choisi, précise le.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 88
    Points : 52
    Points
    52
    Par défaut
    Bonjour Corona,

    D'abord merci de ton aide !

    Je pense m'orienter sur un traitement par VBA du fait que, en réalité mon code est du type :

    JDXXYYZZWW
    avec
    J constante
    D l'année "2012"
    XX le mois de 01 à 12
    YY le jour de 01 à 31
    ZZ l'heure de 00 à 23
    WW un numéro de lot de 00 à 99.

    Pour toi, il serait plus simple de faire une validation de données ou un code VBA ?

    Merci encore !

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 932
    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 : 12 932
    Points : 28 927
    Points
    28 927
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour toi, il serait plus simple de faire une validation de données ou un code VBA ?
    Pour moi, la question ne se pose pas comme cela.
    Je privilégie d'abord et avant tout l'utilisation des outils d'excel et ses formules que j'essaie de pousser dans leurs derniers retranchements.
    Cependant, il y a des cas où je prendrai l'option d'un développent complet ou partiel en VBA.
    1) S'il faut faire une tache répétitive quotidienne, hebdomadaire ou mensuelle il est clair qu'il faut penser à le réaliser avec du code VBA
    2) Si on a un classeur de plusieurs milliers de lignes qui met 2 minutes pour recalculer ses formules bien que l'on puisse interrompre momentanément le recalcul automatique.
    3) Des fonctionnalités impossibles à réaliser avec une fonctions Excel comme la mise automatique en fonction de la date du jour ou de l'heure de l'encodage.
    Mais ceci, est un avis tout à fait personnel.
    Pour ce qui est de ton problème, je ne vois pas de problème de tester l'encodage avec une validation de données

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 88
    Points : 52
    Points
    52
    Par défaut
    OK Corona ! Je pense comprendre la philosophie de l'affaire.

    Les données sont entrées tous les jours dans un simili-formulaire dans une feuille puis ventilées dans d'autres feuilles.

    Par contre, comment "imbriquer" une suite de "ET(CNUM(STXT..." dans un test sur des éléments aussi nombreux (XX,YY,....) ?
    Y a-t-il une limite dans la longeur des validations de données s'il te plait ?

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 932
    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 : 12 932
    Points : 28 927
    Points
    28 927
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Avec les fonctions ET/OU, on peut aller jusqu'à 255 conditions. Je crois que c'est largement suffisant pour ton cas.
    Je n'ai pas bien compris ton format de référence.
    JDXXYYZZWW
    avec
    J constante
    D l'année "2012"
    XX le mois de 01 à 12
    YY le jour de 01 à 31
    ZZ l'heure de 00 à 23
    WW un numéro de lot de 00 à 99.
    Cela veut dire que D à 4 caractères ?

  7. #7
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,
    si vraiment tu veux du VBA, un exemple à adapter :
    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
    Sub essai()
    Dim Mois1 As String, Jour2 As String
    'si l'année est sur 4 chiffres et la constante sur 1 chiffre, ton numero en A1
    'en A1, j'ai tapé "5201205221288"
     
    With Sheets("feuil1") 'remplacer nom de ta feuille
      If Left(Right(.Range("A1"), 8), 2) < "01" Then
        Mois1 = "01"
      ElseIf Left(Right(.Range("A1"), 8), 2) > "12" Then
        Mois1 = "12"
      Else
       Mois1 = Left(Right(.Range("A1"), 8), 2)
      End If
      If Left(Right(.Range("A1"), 6), 2) < "01" Then
       Jour2 = "01"
      ElseIf Left(Right(.Range("A1"), 6), 2) > "31" Then
        Jour2 = "31"
      Else
        Jour2 = Left(Right(.Range("A1"), 6), 2)
      End If
    MsgBox Mois1 & " " & Jour2
    .Range("A1") = code & Mois1 & Jour2 & num
     
    End With
    End Sub

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 932
    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 : 12 932
    Points : 28 927
    Points
    28 927
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En complément à la réponse que je t'ai donnée hier et pour une référence encodée comme ceci (c20120231ZZWW).
    Afin de vérifier la référence encodée, tu dois placer dans un ET
    Le nombre de caractères autorisé pour la référence (ici 13) : NBCAR(A2)=13
    Vérifier si l'année encodée est bien l'année en cours : CNUM(STXT(A2;2;4))= ANNEE(AUJOURDHUI())
    La borne des mois, je t'ai donné la réponse hier CNUM(STXT(A2;6;2))>=1 et CNUM(STXT(A2;6;2))<=12)
    Pour la borne des jours, hier, je t'ai donné le contrôle entre 01 et 31 mais évidemment 31 n'est pas correct, il faut connaître le dernier jour du mois en cours la formule est
    JOUR(DATE( CNUM(STXT(A2;2;4)); CNUM(STXT(A2;6;2))+1;0)) à adapter dans le ET.
    Autrement dit le test pour avoir VRAI ou FAUX CNUM(STXT(A2;8;2))<=JOUR(DATE(CNUM(STXT(A2;2;4));CNUM(STXT(A2;6;2))+1;0))
    Quand tu m'auras donné le format complet, je pourrai compléter ma réponse.
    [EDIT de 10:25]
    La formule complète à placer dans la validation de données et qui teste si le nombre de caractères est bien 13, l'année est bien celle en cours, les mois entre 1 et 12, les jours entre 1 et le dernier jours du mois encodé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ET( NBCAR(A2)=13; CNUM(STXT(A2;2;4))= ANNEE(AUJOURDHUI());CNUM(STXT(A2;6;2))>=1;CNUM(STXT(A2;6;2))<=12;CNUM(STXT(A2;8;2))>=1;CNUM(STXT(A2;8;2))<=JOUR(DATE(CNUM(STXT(A2;2;4));CNUM(STXT(A2;6;2))+1;0)))

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 88
    Points : 52
    Points
    52
    Par défaut
    Bonjour Casefayere,

    Merci pour ta proposition ; cela me sera très utile pour une autre application !

    Corona,

    Dans le codage, la première lettre ne peut prendre que les valeurs "J" "M" "N" ou "R" (4 lignes de production)
    Le second "digit" représente l'année (ici : 2012 donc "D" ; l'an prochain on passera à "E")
    Le reste est inchangé mois jour heure et les deux derniers digits pour le numéro de lot de "00" à "99". Je n'ai pas été très clair dans mes messages !
    Je vais tester ta dernière proposition !
    Merci.
    A+

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 932
    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 : 12 932
    Points : 28 927
    Points
    28 927
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Nous partons du fait que la référence est d'une longueur fixe de 10 caractères et est structuré comme suit JDXXYYZZWW
    J est une constante (J, M, N, R)
    D représente l'année "2012"
    XX le mois de 01 à 12
    YY le jour de 01 à dernier jour du mois en cours
    ZZ l'heure de 00 à 23
    WW un numéro de lot de 00 à 99.
    Voici une formule à coller dans la Validation de données. La formule est faite pour J, D, XX et YY
    Je pense qu'avec cet exemple, tu peux parfaitement t'en sortir pour ZZ et WW
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    =ET(
    NBCAR(A2)=10;
    NON(ESTERR(CHERCHE(GAUCHE(A2;1);"JMNR")));
    NON(ESTERR(CHERCHE(STXT(A2;2;1);"D")));
    CNUM(STXT(A2;3;2))>=1;
    CNUM(STXT(A2;3;2))<=12;
    CNUM(STXT(A2;5;2))>=1;
    CNUM(STXT(A2;5;2))<=JOUR(DATE(ANNEE(AUJOURDHUI());CNUM(STXT(A2;3;2))+1;0))
    )
    Petite remarque concernant les contraintes suivantes :
    JMNR pour ma part, j'en ferais une formule nommée (Gestionnaire des noms) en lui donnant comme nom par exemple pRefConstante et lui attribuant comme valeur JMNR. Ainsi la formule serait NON(ESTERR(CHERCHE(GAUCHE(A2;1);pRefConstante))) et ainsi en cas de modification des constantes, ajout, suppression etc.., il suffit simplement de changer la formule dans le gestionnaire des noms au lieu de modifier la validation de données.
    D Je ferais la même chose, si on considère que l'on encode une lettre par année. En 2013, il suffirait de modifier la formule dans le gestionnaire des noms.
    Il existe d'autres techinques tels que la plage nommée ou un tableau où on pourrait faire une recherche sur la lettre et avoir en regard l'année correspondante. A toi de voir.
    Pour l'instant, j'ai considéré que l'encodage à condition d'avoir mis la bonne lettre est de l'année en cours.
    La formule utilisée est valable pour 2003 également. Je n'ai pas utilisé le SIERREUR parce-que j'essaie de garder autant que possible, la portabilité 2003/2007.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 88
    Points : 52
    Points
    52
    Par défaut
    Bonjour Corona,

    Un très grand MERCI pour toutes tes explications !! Cela fonctionne à merveille
    Je vais mettre en pratique tes conseils au sujet des noms pour la suite.
    Une chose est sure : Excel n'a pas fini de me bluffer !

    Encore un grand merci d'un Chti à son Voisin Belge !

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 932
    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 : 12 932
    Points : 28 927
    Points
    28 927
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Merci pour le retour.
    Une chose est sure : Excel n'a pas fini de me bluffer !
    C'est la raison pour laquelle je privilégie les fonctions d'Excel et ses outils avant de penser code VBA et pourtant je développe beaucoup.

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

Discussions similaires

  1. [Débutant] Test partiel sur une chaîne de caractère en XAML
    Par bobybob06 dans le forum C#
    Réponses: 0
    Dernier message: 25/07/2012, 16h55
  2. Test sur une chaîne de caractères
    Par ThunderBolt_ dans le forum Général VBA
    Réponses: 4
    Dernier message: 27/06/2007, 06h37
  3. recherche sur une chaîne de caractères
    Par bogsy15 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/07/2006, 12h01
  4. Tri sur une chaîne de caractères contenant des nombres
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2006, 11h52
  5. Requête sur une chaîne de caractères
    Par Hakunamatata dans le forum Langage SQL
    Réponses: 9
    Dernier message: 02/04/2006, 18h27

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