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 :

Problème de détection de caractère


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
    Inscrit en
    Mai 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 16
    Par défaut Problème de détection de caractère
    Bonjour à tous !

    Il y a quelque temps j'avais créer un topic sur un problème que j'ai rencontré.
    Mon problème était :

    "
    IRSensBoomUp
    QXSwingBrakeY7
    QXCtrlCircSupplyY3

    IRSensB55_2_2
    QXSafetyValvePY369
    QXGreasePump

    IRSensPdlLForwardB169
    IRSensPumpB159


    Je souhaiterai en vba faire un trie de cette liste pour
    - ressortir uniquement les noms qui commencent par "IR"
    - que son nom contient la lettre "B" suivit au minimum de 1 chiffre.
    "

    Avec l'aide de Bbil et autres j'en suis arrivé là :

    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
    Dim st As String
    Dim stSuitB As String 'Caractère suivant le b
    Dim iPosB As Integer 'position du B
     
    '-----test des capteurs du can1
     
    While i < Worksheets(can1).Range("A65536").End(xlUp).Row
     
    st = Worksheets(can1).Cells(i, 1).Text
    iPosB = InStr(1, Worksheets(can1).Cells(i, 1).Text, "B")
     
        If iPosB > 0 Then
            stSuitB = Mid(st, iPosB + 1, 1)
                If IsNumeric(stSuitB) And Not InStr(1, Worksheets(can1).Cells(i, 1).Value, "IR") = 0 Then
                    Worksheets("liste_modif").Range("A" & ligne_raf) = Worksheets(can1).Range("A" & i)
                    Worksheets("liste_modif").Range("B" & ligne_raf) = i
                    Worksheets("liste_modif").Range("C" & ligne_raf) = can1
                    Worksheets("liste_modif").Range("D" & ligne_raf) = Worksheets(can1).Range("D" & i)
                    Worksheets("liste_modif").Range("E" & ligne_raf) = Worksheets(can1).Range("E" & i)
                    Worksheets("liste_modif").Range("F" & ligne_raf) = Worksheets(can1).Range("F" & i)
                    Worksheets("liste_modif").Range("G" & ligne_raf) = Worksheets(can1).Range("G" & i)
                    Worksheets("liste_modif").Range("H" & ligne_raf) = Worksheets(can1).Range("H" & i)
                    ligne_raf = ligne_raf + 1
                End If
        End If
                i = i + 1
    Wend
    Cela fonctionne (fonctionnait) très bien !
    Mais maintenant je tombe sur un nouveau problème..

    Ma liste de noms à analyser a changée et certains noms sont du style :

    IRSensPdlBackwardB188

    et donc ma fonction de test regarde uniquement le premier "B" et celui-ci n'est pas suivit d'un chiffre donc il ne me copie pas ce nom


    J'ai pensé à détecter les caractères de type numérique et regarder si le caractère précedent est un "B" mais je n'y arrive pas .

    Si quelqu'un pourrait me donner un petit coup de main

  2. #2
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Un peu barbare ma reponse pour tester avec une petite fonction sur mesure..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF Teststring(st)=true then...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Function TestString(ByVal chaine As String) As Boolean
    If (chaine Like "*B0*") Or (chaine Like "*B1*") Or (chaine Like "*B2*") Or (chaine Like "*B3*") _
            Or (chaine Like "*B4*") Or (chaine Like "*B5*") Or (chaine Like "*B6*") _
            Or (chaine Like "*B7*") Or (chaine Like "*B8*") Or (chaine Like "*B9*") Then
     
              TestString = True
            Else
              TestString = False
    End If
     
    End Function

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 16
    Par défaut
    ah ouais pourquoi pas ^^
    je vais essayer ça !

    En attendant moi aussi j'ai trouvé une méthode de barbare :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    '---copier les noms, numero de ligne_raf, et le can
     
    Dim i, ligne_raf As Long
    i = 1
    ligne_raf = 2
     
    Dim st As String
    Dim stSuitB As String 'Caractère suivant le B
    Dim stSuitB2 As String 'Caractère suivant le deuxième B
    Dim stSuitB3 As String 'Caractère suivant le troisième B
    Dim iPosB As Integer 'position du B
    Dim iPosB2 As Integer ' position du deuxième B
    Dim iPosB3 As Integer ' position du troisième B
     
     
    '-----test des capteurs du can1
     
    While i < Worksheets(can1).Range("A65536").End(xlUp).Row
     
    st = Worksheets(can1).Cells(i, 1).Text
    iPosB = InStr(1, st, "B")
    iPosB2 = InStr(iPosB + 1, st, "B")
    iPosB3 = InStr(iPosB2 + 1, st, "B")
     
        If iPosB > 0 Or iPosB2 > 0 Or iPosB3 > 0 Then
            stSuitB = Mid(st, iPosB + 1, 1)
            stSuitB2 = Mid(st, iPosB2 + 1, 1)
            stSuitB3 = Mid(st, iPosB3 + 1, 1)
                If (IsNumeric(stSuitB) Or IsNumeric(stSuitB2) Or IsNumeric(stSuitB3)) And Not InStr(1, st, "IR") = 0 Then
                    Worksheets("liste_modif").Range("A" & ligne_raf) = Worksheets(can1).Range("A" & i)
                    Worksheets("liste_modif").Range("B" & ligne_raf) = i
                    Worksheets("liste_modif").Range("C" & ligne_raf) = can1
                    Worksheets("liste_modif").Range("D" & ligne_raf) = Worksheets(can1).Range("D" & i)
                    Worksheets("liste_modif").Range("E" & ligne_raf) = Worksheets(can1).Range("E" & i)
                    Worksheets("liste_modif").Range("F" & ligne_raf) = Worksheets(can1).Range("F" & i)
                    Worksheets("liste_modif").Range("G" & ligne_raf) = Worksheets(can1).Range("G" & i)
                    Worksheets("liste_modif").Range("H" & ligne_raf) = Worksheets(can1).Range("H" & i)
                    ligne_raf = ligne_raf + 1
                End If
     
     
        End If
                i = i + 1
    Wend

  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
    Vu que les critères deviennent complexes, ca devient un cas de FOR NEXT, à placer de préférence dans une fonction.

    Evite aussi la propriété TEXT dont la valeur varie de façon aléatoire selon la largeur de la colonne. Mieux vaut utiliser Worksheets(can1).Cells(i, 1).Value ou Worksheets(can1).Cells(i, 1).Value2.

    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
    34
    35
    36
    37
    38
    39
    40
    Sub test()
     
    '-----test des capteurs du can1
     i = 1
    While i < ThisWorkbook.Worksheets(can1).Range("A65536").End(xlUp).Row
     
    result = Detecte_IR_B09(ThisWorkbook.Worksheets(can1).Cells(i, 1).Value2)
     
    If result = True Then
     Stop
    End If
     
    i = i + 1
    Wend
     
    End Sub
     
    Function Detecte_IR_B09(st)
     
    st = UCase(st)
     
    If st = "" Then
     Exit Function
     
    ElseIf Mid(st, 1, 2) = "IR" Then
     
    For j = 0 To 9
     
    If InStr(st, "B" & j) > 0 Then
     
    Detecte_IR_B09 = True
    Exit Function
     
    End If
     
    Next
     
    End If
     
    End Function

Discussions similaires

  1. [strncmp] Problème avec détection de caractère '
    Par Henwiro dans le forum MATLAB
    Réponses: 2
    Dernier message: 29/03/2012, 10h33
  2. Problème de détection de nouveau processeur
    Par zakfa dans le forum Composants
    Réponses: 12
    Dernier message: 24/01/2005, 17h09
  3. [FLASH MX2004] Problème de reconnaissance des caractères
    Par Spikefreeman dans le forum Flash
    Réponses: 10
    Dernier message: 04/01/2005, 23h08
  4. Réponses: 3
    Dernier message: 11/10/2004, 17h26
  5. Problème de chaîne de caractères (BSTR)
    Par patvdb dans le forum MFC
    Réponses: 2
    Dernier message: 26/02/2004, 15h44

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