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 :

Recherche de valeur numérique dans une chaine de caractères


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
    personnel
    Inscrit en
    Août 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : personnel
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2019
    Messages : 7
    Par défaut Recherche de valeur numérique dans une chaine de caractères
    Bonjour,

    Je cherche à faire un contrôle de présence de numéro (colonne A) par rapport à la base de donnée (colonne C).
    Dans la colonne B il s'agit du contrôle de présence avec le tag OK ou NOK.
    Le tableau & valeurs ont la configuration suivante :
    Classeur1.xlsx
    Classeur1.xlsm

    J'ai essayé la fonction rechercheV sans succés des fonctions pour extraire la partie numérique des cellules de la colonnes B sans succés avec le code ci-dessous.

    Auriez-vous une idée pour me débloquer? merci d'avance!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function Num(chaine, n)
      Set obj = CreateObject("vbscript.regexp")
      obj.Global = True
      obj.Pattern = "\d+"
      Set a = obj.Execute(chaine)
      If a.Count > 0 Then Num = a(n - 1) Else Num = ""
    End Function
    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
    Sub test()
     
       If Feuil11.Range("C4") <> "" Then
           maLigne = Feuil11.Range("B" & Rows.Count).End(xlUp).Row + 1
        Else
           maLigne = 1
        End If
     
        For k = 4 To maLigne
                var1 = Num(Feuil11.Cells(k, 4), 1)
                var2 = Num(Feuil11.Cells(k, 4), 2)
     
                Var = CStr(var1) & "-" & CStr(var2)
                Feuil11.Cells(k, 5) = Var
                Var = 0
        Next
     
     End Sub

  2. #2
    Membre éprouvé
    Homme Profil pro
    Fortune teller
    Inscrit en
    Octobre 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Fortune teller

    Informations forums :
    Inscription : Octobre 2007
    Messages : 110
    Par défaut Valeur numérique
    Utiliser une expression régulière c'est élégant mais il y a aussi la fonction Asc qui retourne le code ascii du caractère.
    Le code ascii de 0 c'est 48 et celui de 9 c'est 57, tu peux faire un test par caractère du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Asc(table(i, 0)) >= "48" And Asc(table(i, 0)) <= "57" Then
    C'est ce que j'utilise dans des cas pareils.

  3. #3
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    Peut-être 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
    Sub Macro1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim DA As Integer 'déclare la variable DA (Dernière ligne colonne A)
    Dim TA As Variant 'déclare la variable TA (Tableau colonne A)
    Dim DB As Integer 'déclare la variable DB (Dernière ligne colonne B)
    Dim TB As Variant 'déclare la variable TB (Tableau colonne B)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable O (incrément)
     
    Set O = Worksheets("Feuil1") 'Définit l'onglet O
    DA = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DA de la colonne A de l'onglet O
    TA = O.Range("A1:A" & DA) 'définit le tableau TA
    DB = O.Cells(Application.Rows.Count, "B").End(xlUp).Row 'définit la dernière ligne éditée DB de la colonne B de l'onglet O
    TB = O.Range("B1:B" & DB) 'définit le tableau TB
    For I = 2 To DA 'boucle 1 : sur toutes les ligne I du tableau TA (en partant de la seconde)
        For J = 2 To DB 'boucle 2 : sur toutes les ligne J du tableau TB (en partant de la seconde)
            'si le texte de la donnée de la boucle 1 est compris dans le texte de la donnée de la boucle 2,
            'renvoie OK dans la cellule colonne C, sort de la boucle 1
            If InStr(1, O.Cells(J, "B"), O.Cells(I, "A"), vbTextCompare) <> 0 Then O.Cells(J, "C") = "OK": Exit For
        Next J 'prochaine ligne de la boucle 2
    Next I 'prochaine ligne de la boucle 1
    For J = 2 To DB 'boucle sur toutes les ligne J du tableau TB (en partant de la seconde)
        If O.Cells(J, "C") = "" Then O.Cells(J, "C") = "NOK" 'si la cellule de la boucle en colonne C est vide, écrit "NOK" dedans
    Next J 'prochaine ligne de la boucle
    End Sub

  4. #4
    Membre régulier
    Homme Profil pro
    personnel
    Inscrit en
    Août 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : personnel
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2019
    Messages : 7
    Par défaut
    Bonjour, votre code fonctionnement parfaitement!

    Pour information, le nombre de ligne de ma BD est >65 klignes.
    A partir de votre code, est-il possible de mettre la valeur de contrôle au même niveau que la valeur cherchée?
    ie je veux connaitre si les valeurs de la colonne A sont dans la colonne B donc le contrôle doit etre fait avec les valeurs de la colonnes A.

  5. #5
    Membre régulier
    Homme Profil pro
    personnel
    Inscrit en
    Août 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : personnel
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2019
    Messages : 7
    Par défaut
    Oui cela est possible.
    J'ai changé l'indice dans qui est maintenant I ald de J.
    J'ai également changé As Integer en As Long.

    Parfait cela tourne comme je voulais.

    Un dernier petit truc à quoi correspond l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur d'exécution '5'

  6. #6
    Membre régulier
    Homme Profil pro
    personnel
    Inscrit en
    Août 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : personnel
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2019
    Messages : 7
    Par défaut
    Bonjour, merci de votre réponse.

    Vous trouverez ci-dessous le code avec Asc() function.
    J'ai un code erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur d'exécution '5'
    .
    Apres une recherche sur internet je ne comprends pas bien cette erreur.

    MErci d'avance de votre aide

    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
    Sub test()
     
       If Feuil1.Range("A1") <> "" Then
           maLigne = Feuil1.Range("A" & Rows.Count).End(xlUp).Row + 1
        Else
           maLigne = 1
        End If
     
        Dim plage As Range
        Dim table As Variant
     
            Set plage = Worksheets("Feuil1").Range("A1:B" & maLigne)
            table = plage
     
     
        For k = 1 To maLigne
            If Asc(table(k, 1)) >= "48" And Asc(table(k, 1)) <= "57" Then
                var1 = Num(table(k, 1), 1)
                var2 = Num(table(k, 1), 2)
     
                Var = CStr(var1) & "-" & CStr(var2)
                table(k, 2) = Var
                'Feuil1.Cells(k, 2) = Var
                Var = 0
            End If
     
        Next
        plage = table
     
     End Sub

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2011, 10h40
  2. récupérer une valeur numérique dans une chaine
    Par EFFLYINGJOKER dans le forum Développement
    Réponses: 2
    Dernier message: 30/03/2010, 16h26
  3. Modifier la valeur numérique dans une chaîne de caractère
    Par ab1to dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/03/2010, 14h08
  4. Recherche d'un mot dans une chaine de caractère
    Par thanks33 dans le forum Langage
    Réponses: 2
    Dernier message: 12/06/2009, 12h26
  5. sortir deux valeurs numériques d'une chaine de caractères
    Par Ness2000 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/07/2008, 08h52

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