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 :

Enchainement de fonctions, problème de format [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'Etude statistique
    Inscrit en
    Juillet 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chargé d'Etude statistique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2017
    Messages : 30
    Par défaut Enchainement de fonctions, problème de format
    Bonjour a tous,

    Merci infiniment à tous ceux qui participent au forum en posant des questions et surtout en y répondant. C'est mon premier job et j'ai un gros projet à mener en vba. Je ne sais pas comment j'aurai pu faire sans vous tous.

    J'ai un petit problème de réglage que je n'arrive pas a solutionner.

    On a une chaine de caractère du type "N° IMPAIRS DU 1 AU 59 ET N° PAIRS DU 2 AU 52" et j'ai besoin d'isoler dans une colonne l'intervalle des chiffres paires ("2 52") et dans une autre l'intervalle des chiffres impaire ("1 59"). Grâce a ce forum je commence a me débrouiller un peu dans la gestion des chaines de caractères donc j'ai réussi à écrire les trois petites fonctions ci-dessous que je compte utiliser dans une procédure.

    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
     
    'ne conserve que les mots composés de valeurs numériques
     
                Function VALNUM(texte$)
                Dim i%, txt$()
                txt() = Split(texte)
                For i = 0 To UBound(txt)
                If IsNumeric(txt(i)) Then _
                VALNUM = VALNUM & txt(i) & " "
                Next i
                End Function
     
        ' ne conserve que les valeurs numériques paires
     
                Function VALPAIR(texte$)
                Dim i%, txt$()
                txt() = Split(texte)
                For i = 0 To UBound(txt)
                If (txt(i) Mod 2) = 0 Then _
                VALPAIR = VALPAIR & txt(i) & " "
                Next i
                End Function
     
        'ne conserve que les valeurs numériques impaires
     
                Function VALIMPAIR(texte$)
                Dim i%, txt$()
                txt() = Split(texte)
                For i = 0 To UBound(txt)
                If (txt(i) Mod 2) <> 0 Then _
                VALIMPAIR = VALIMPAIR & txt(i) & " "
                Next i
                End Function
    Chacune des formules marchent biens isolément mais j'ai besoin d'associer VALNUM avec respectivement VALPAIR et VALIMPAIR. Or, quand je fait des testes sur ma feuille excel, je n'arrive pas a associer les formules que cela soit séparément (Exemple A1="N° IMPAIRS DU 1 AU 59" ; B1=VALNUM(A1)="1 59"; C1=VALIMPAIR(B1)="1 59") ou ensemble (Exemple B1=VALIMPAIR(VALNUM(A1))="1 59"). La cellule affiche un message "valeur".

    Est-ce que la fonction nécessite une option particulière ou est-ce un problème de format ? Je crois qu'il me manque quelque chose.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Le premier réflexe normal d'un développeur est d'isoler chaque module.
    Au lieu de regarder directement le résultat de ta fonction personnalisée, concentre-toi d'abord sur ce qu'elle fait.
    Ce petit test (que tu aurais du faire) par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ch = "N° IMPAIRS DU 1 AU 59 ET N° PAIRS DU 2 AU 52"
    Dim i%, txt$()
     
     
    txt() = Split(ch)
    For i = 0 To UBound(txt)
      If (txt(i) Mod 2) = 0 Then _
         valpair = valpair & txt(i) & " " '------->> Ah ouais ? et que pourrait bien être le modulo par 2 de "N°" (par exemple) ??? Ca va, la tête, oui ?
     Next i
    MsgBox valpair
    te permettra de repérer immédiatement l'erreur commise (le modulo d'une valeur non numérique est insensé).
    A toi de jouer, maintenant, plus intelligemment (facile...)

  3. #3
    Membre averti
    Homme Profil pro
    Chargé d'Etude statistique
    Inscrit en
    Juillet 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chargé d'Etude statistique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2017
    Messages : 30
    Par défaut
    Merci @unparia de vous préoccuper de l'état de ma tête.

    Comme je le disais, il s'agit d'utiliser la fonction qui ne conserve que les valeurs numériques PUIS d'utiliser celle qui ne conserve que les valeurs paires ou impaires.

    Peut-être n'ai-je pas compris le sens exacte de votre proposition.

    Merci @dysorthographie de votre proposition de fonction.

    Je dois prendre ma pose déjeuner mais je reviendrais dans une heure.

    Cordialement,

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut Enchainement de fonctions, problème de format
    Bonjour,

    hmmm... si A1="N° IMPAIRS DU 1 AU 59" alors B1=VALNUM(A1) ne renvois pas "1 59" mais renvois "1 59 "

    de fait VALPAIR(VALNUM(A1)) renvois #Valeur car lors de l’exécution de la boucle dans de tes fonctions VALPAIR ou VALIMPAIR la derniere valeur de txt(i) sera vide !

    Donc dans ta fonction VALNUM soit tu geres avec une condition if bien placé pour éviter d'avoir un espace en trop soit tu utilises
    RTrim$ à la fin de cette fonction.

    Unparia Bonjour, oui mais à priori SectoSSD injecte le type de chaine tel que "N° IMPAIRS DU 1 AU 59" uniquement dans la fonction VALNUM afin d'en extraire les valeurs numériques et ne prend donc pas trop de risque avec la fonction isnumeric().

    A+

    Philippe

  5. #5
    Membre averti
    Homme Profil pro
    Chargé d'Etude statistique
    Inscrit en
    Juillet 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chargé d'Etude statistique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2017
    Messages : 30
    Par défaut
    Je vous remercie dysorthographie pour votre code. Visiblement vous proposez une fonction qui sélectionne les caractères numériques puis, éventuellement, qui sélectionne les paires ou les impaires.

    Je suis navré mais je ne sais pas utiliser cette fonction. Je suis parti du principe qu'elle fonctionnait avec deux arguments : le premier pour désigner la cellule source et le deuxième pour expliquer si l'on voulait garder les paires ou les impaires. J'ai donc essayer de rédiger des =VALNUM(A1,pere) ou VALNUM(A1,0) ou VALNUM(A1,vrai) ou encore VALNUM(A1,true). Il n'y a rien qui marche.

    Il doit y avoir des choses qui sont pour vous des évidences mais que j'ignore.

  6. #6
    Membre averti
    Homme Profil pro
    Chargé d'Etude statistique
    Inscrit en
    Juillet 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chargé d'Etude statistique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2017
    Messages : 30
    Par défaut
    Bonjour @Phil Free,

    C'est exactement ça le problème. La preuve dans mes testes : quand j'insère une fonction SUPPRESPACE avant la fonction VALPAIRE ou VALIMPAIRE ça marche très bien.

    Je vous remercie je sais maintenant exactement d'où ça vient.

  7. #7
    Membre averti
    Homme Profil pro
    Chargé d'Etude statistique
    Inscrit en
    Juillet 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chargé d'Etude statistique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2017
    Messages : 30
    Par défaut
    Merci @dysorthographie, votre fonction marche très bien. Excellente journée à vous.

  8. #8
    Invité
    Invité(e)
    Par défaut
    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
    Function VALNUM(texte$, Optional NotPere As Boolean, Optional NotImPere As Boolean)
    Dim i%, txt$()
    txt() = Split(texte)
    For i = 0 To UBound(txt)
        If IsNumeric(txt(i)) Then
          If Not NotPere Then: If (txt(i) Mod 2) = 0 Then VALNUM = VALNUM & txt(i) & " "
          If Not NotImPere Then: If (txt(i) Mod 2 <> 0) Then VALNUM = VALNUM & txt(i) & " "
        End If
    Next i
    End Function
     
    Sub test()
    Debug.Print VALNUM("N° IMPAIRS DU 1 AU 59 ET N° PAIRS DU 2 AU 52")
    Debug.Print VALNUM("N° IMPAIRS DU 1 AU 59 ET N° PAIRS DU 2 AU 52", True)
    Debug.Print VALNUM("N° IMPAIRS DU 1 AU 59 ET N° PAIRS DU 2 AU 52", NotImPere:=True)
    End Sub

  9. #9
    Invité
    Invité(e)
    Par défaut
    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
    Function VALNUMOrTXT(texte$, Optional NotPere As Boolean, Optional NotImPere As Boolean)
    Dim i%, txt$()
    txt() = Split(texte)
    For i = 0 To UBound(txt)
        If IsNumeric(txt(i)) Then
          If Not NotPere Then: If (txt(i) Mod 2) = 0 Then VALNUMOrTXT = VALNUMOrTXT & txt(i) & " "
          If Not NotImPere Then: If (txt(i) Mod 2 <> 0) Then VALNUMOrTXT = VALNUMOrTXT & txt(i) & " "
        Else
           If NotPere * NotImPere Then VALNUMOrTXT = VALNUMOrTXT & txt(i) & " "
        End If
    Next i
    End Function
    Sub test()
    Debug.Print VALNUMOrTXT("N° IMPAIRS DU 1 AU 59 ET N° PAIRS DU 2 AU 52")
    Debug.Print VALNUMOrTXT("N° IMPAIRS DU 1 AU 59 ET N° PAIRS DU 2 AU 52", True)
    Debug.Print VALNUMOrTXT("N° IMPAIRS DU 1 AU 59 ET N° PAIRS DU 2 AU 52", NotImPere:=True)
    Debug.Print VALNUMOrTXT("N° IMPAIRS DU 1 AU 59 ET N° PAIRS DU 2 AU 52", True, True)
    End Sub

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Peut-être n'ai-je pas compris le sens exacte de votre proposition.
    Me fait pleurer ... Vraiment.
    Et je n'ai rien "proposé". Je me suis contenté de pointer du doigt une chose manifestement insensée.

  11. #11
    Invité
    Invité(e)
    Par défaut
    B1=VALNUM(A1)
    C1=VALNUM(A1;VRAI)
    D1=VALNUM(A1; ;VRAI)

    Ou
    B1=VALNUM(A1)
    C1=VALNUM(B1;VRAI)
    D1=VALNUM(B1; ;VRAI)

    Nom : Sans titre.png
Affichages : 190
Taille : 7,0 Ko

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

Discussions similaires

  1. Problème de format de currency
    Par gandf dans le forum C++Builder
    Réponses: 5
    Dernier message: 31/01/2005, 13h36
  2. Enchainer des fonctions dans un onclick d'un bouton
    Par jpg dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/10/2004, 16h51
  3. Réponses: 14
    Dernier message: 06/08/2004, 15h12
  4. [CR8] Problème de Format d'affichage
    Par khabch dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 19/02/2004, 14h10
  5. Problème de Format de date
    Par titititi007 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/06/2003, 08h19

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