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 :

boucle de condition [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut boucle de condition
    Bonjour,

    mon code identifie dans des chaines de caractères certains caractères et selon les caractères identifiés renvoie une réponse différente.

    Lorsque le programme s'exécute les chaines de caractères examinées passent dans tous les cas de ma boucle et comme mes chaines sont très longues, ils peut y avoir plusieurs cas possibles et brouiller la réponse attendue.

    Je voudrais que lorsque les caractères sont identifiés, le programme passe directement à la ligne suivante de mon tableur excel contenant la chaine de caractères suivante à examiner.

    Autrement dit : cherche "INB " si oui retourne le résultat et passe à la chaine de caractère suivante ; si non cherche "eva/" etc etc...

    Est ce qu'il ne me manque donc pas quelque chose dans ma boucle de condition ?

    Merci d'avance pour votre aide. J'espère être claire. Pardon pour les noms de variables bizarres.

    Voici mon code
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
     
    Private Sub CommandButton1_Click()
     
     Dim i As Integer
     
        Dim Chaine As String
     
        Dim Caract As String * 4
     
        Dim Voyel As String
     
        Dim objRange, cel As Range
        Dim res As Integer
     
    Range("C1").EntireColumn.SpecialCells(xlCellTypeConstants).Select
     
    For Each objRange In Selection
     
      For i = 1 To Len(objRange)
      Caract = Mid(objRange, i, 4)
     
            Select Case LCase(Caract)
     
            Case "inb "
     
            Voyel = Voyel & Mid(objRange, i, 7)
            objRange.Offset(0, -2).Value = Right(Voyel, 3)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 3)), Sheets("REF").Range("$A$1:$B$95"), 2, False)
     
            Case "eva/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$I$2:$J$9"), 2, False)
     
            Case "udd/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$G$2:$H$10"), 2, False)
     
            Case "cea/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$K$2:$L$7"), 2, False)
     
            Case "dra/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$M$2:$N$6"), 2, False)
     
            Case "nts/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$O$2:$P$15"), 2, False)
     
             Case Else
     
             End Select
     
           Next i
     
     
      Next objRange
     
    End Sub

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    A première vue, je sortirais de la boucle for en donnant à i la valeur de sortie de boucle

    Soit dans ton code

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Private Sub CommandButton1_Click()
     
     Dim i As Integer
     
        Dim Chaine As String
     
        Dim Caract As String * 4
     
        Dim Voyel As String
     
        Dim objRange, cel As Range
        Dim res As Integer
     
    Range("C1").EntireColumn.SpecialCells(xlCellTypeConstants).Select
     
    For Each objRange In Selection
     
      For i = 1 To Len(objRange)
      Caract = Mid(objRange, i, 4)
     
            Select Case LCase(Caract)
     
            Case "inb "
     
            Voyel = Voyel & Mid(objRange, i, 7)
            objRange.Offset(0, -2).Value = Right(Voyel, 3)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 3)), Sheets("REF").Range("$A$1:$B$95"), 2, False)
            i = Len(objRange)
     
            Case "eva/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$I$2:$J$9"), 2, False)
            i = Len(objRange)
     
            Case "udd/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$G$2:$H$10"), 2, False)
            i = Len(objRange)
     
            Case "cea/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$K$2:$L$7"), 2, False)
            i = Len(objRange)
     
            Case "dra/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$M$2:$N$6"), 2, False)
            i = Len(objRange)
     
            Case "nts/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$O$2:$P$15"), 2, False)
            i = Len(objRange)
     
             Case Else
     
             End Select
     
           Next i
     
     
      Next objRange
     
    End Sub

  3. #3
    Membre expérimenté
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Par défaut
    Bonjour,

    snas regarder de trop près dans ton code , je vois quelques erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    For i = 1 To Len(objRange)
      Caract = Mid(objRange, i, 4)
     
    '  problème car lorsque i > Len(objRange) - 4 =>    Mid(objRange, i, 4)  n'est pas défini , tu peux remplacer par   For i = 1 To Len(objRange) - 3
     
    ' mais problème dans la suite du code , tu utilises Mid(objRange, i, 7) ?
    Je ne comprends pas trop le but du code ; A mon avis , tu devrais utiliser une syntaxe du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if instr (   lcase ( objRange) , "eva/" ) > 0 then 
     
    Voyel = Voyel & Mid(objRange, instr (   lcase ( objRange) , "eva/" ) , 7 + instr (   lcase ( objRange) , "eva/" ) )
            objRange.Offset(0, -2).Value = Right(Voyel, 3)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 3)), Sheets("REF").Range("$A$1:$B$95"), 2, False)
     
     
     
     
    else
     
     
    .......
    Tu devrais donner plus d'infosou un fichier avec le type des chaines à analyser.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    Je ne suis pas sûr d'avoir tout compris mais teste ce qui suit :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    Private Sub CommandButton1_Click()
     
        Dim Pos As Integer
        Dim Voyel As String
        Dim objRange As Range
        Dim cel As Range
     
        'défini la plage de cellules
        Set objRange = Range("C1").EntireColumn.SpecialCells(xlCellTypeConstants)
     
        'parcour la plage
        For Each cel In objRange
     
            'effectue la recherche
            Pos = InStr(cel, "inb ")
     
            'si trouvé
            If Pos <> 0 Then
     
                Voyel = Voyel & Mid(cel, Pos, 7)
                cel.Offset(0, -2).Value = Right(Voyel, 3)
                cel.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 3)), Sheets("REF").Range("$A$1:$B$95"), 2, False)
                GoTo FinCel 'va à la fin de la boucle
     
            End If
     
            Pos = InStr(cel, "eva/")
     
            If Pos <> 0 Then
     
                Voyel = Voyel & Mid(objRange, Pos, 6)
                cel.Offset(0, -2).Value = Right(Voyel, 2)
                cel.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$I$2:$J$9"), 2, False)
                GoTo FinCel 'va à la fin de la boucle
     
            End If
     
            Pos = InStr(cel, "udd/")
     
            If Pos <> 0 Then
     
                Voyel = Voyel & Mid(cel, Pos, 6)
                cel.Offset(0, -2).Value = Right(Voyel, 2)
                cel.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$G$2:$H$10"), 2, False)
                GoTo FinCel 'va à la fin de la boucle
     
            End If
     
            Pos = InStr(cel, "cea/")
     
            If Pos <> 0 Then
     
                Voyel = Voyel & Mid(cel, Pos, 6)
                cel.Offset(0, -2).Value = Right(Voyel, 2)
                cel.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$K$2:$L$7"), 2, False)
                GoTo FinCel 'va à la fin de la boucle
     
            End If
     
            Pos = InStr(cel, "dra/")
     
            If Pos <> 0 Then
     
                Voyel = Voyel & Mid(cel, Pos, 6)
                cel.Offset(0, -2).Value = Right(Voyel, 2)
                cel.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$M$2:$N$6"), 2, False)
                GoTo FinCel 'va à la fin de la boucle
     
            End If
     
            Pos = InStr(cel, "nts/")
     
            If Pos <> 0 Then
     
                Voyel = Voyel & Mid(cel, Pos, 6)
                cel.Offset(0, -2).Value = Right(Voyel, 2)
                cel.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$O$2:$P$15"), 2, False)
                'GoTo FinCel ici pas nécessaire !
            End If
     
    FinCel:
     
          Next cel
     
    End Sub
    Hervé.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    Merci pour vos réponses.
    Je voulais savoir s'il y a un équivalent du break en C pour VBA pour sortir de ma boucle. Je vais tester vos propositions.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    Citation Envoyé par marie6631 Voir le message
    Merci pour vos réponses.
    Je voulais savoir s'il y a un équivalent du break en C pour VBA pour sortir de ma boucle.
    Oui, pour une boucle For...Next, c'est Exit For.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    La réponse de JFontaine fonctionne à un détail prés.

    Ma chaine de caractère est de type :

    type 1 :
    /01 INB/01 XXXXX/01 XXX INB/01 XXXX/01 XXXX/02 XXXX/16 INB YYY - NOM/XXX,/04 XXX/01 XXX/01 XXX/XXX/XXXXXX/ INB YYY
    Cela fonctionne : mon résultat est YYY

    type 2 :
    /01 INB/09 CEA/02 ZZZ/03 - INB YYY - NOM/03 XXX/XXXXXXXXX- INB YYY
    dans ce cas le résultat est ZZZ associé à la recherche de "cea/" et non YYY associée à la recherche "inb ".

    Je ne comprends pas pourquoi dans ce dernier cas cela ne fonctionne pas. Je voudrais le résultat YYY comme dans le type 1 puisque "inb " est présent. Je voudrais ZZZ que s'il n'y a que "cea/".

    Merci pour votre aide. J'espère être claire

    Voici le code pour rappel :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Private Sub CommandButton1_Click()
     
     Dim i As Integer
     
        Dim Chaine As String
     
        Dim Caract As String * 4
     
        Dim Voyel As String
     
        Dim objRange, cel As Range
        Dim res As Integer
     
    Range("C1").EntireColumn.SpecialCells(xlCellTypeConstants).Select
     
    For Each objRange In Selection
     
      For i = 1 To Len(objRange)
      Caract = Mid(objRange, i, 4)
     
            Select Case LCase(Caract)
     
            Case "inb "
     
            Voyel = Voyel & Mid(objRange, i, 7)
            objRange.Offset(0, -2).Value = Right(Voyel, 3)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 3)), Sheets("REF").Range("$A$1:$B$95"), 2, False)
            i = Len(objRange)
     
            Case "eva/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$I$2:$J$9"), 2, False)
            i = Len(objRange)
     
            Case "udd/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$G$2:$H$10"), 2, False)
            i = Len(objRange)
     
            Case "cea/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$K$2:$L$7"), 2, False)
            i = Len(objRange)
     
            Case "dra/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$M$2:$N$6"), 2, False)
            i = Len(objRange)
     
            Case "nts/"
     
            Voyel = Voyel & Mid(objRange, i, 6)
            objRange.Offset(0, -2).Value = Right(Voyel, 2)
            objRange.Offset(0, -1).Value = Application.WorksheetFunction.VLookup(Val(Right(Voyel, 2)), Sheets("REF").Range("$O$2:$P$15"), 2, False)
            i = Len(objRange)
     
             Case Else
     
             End Select
     
           Next i
     
     
      Next objRange
     
    End Sub
    Pardon mais je veux sortir de ma boucle de condition et non de la boucle for.

    merci d'avance

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    je veux sortir de ma boucle de condition et non de la boucle for.
    Je ne connais pas d'instruction similaire au "Break" en C permettant de sortir de ton Select...End Select.

    Ceci dit à moins que plusieurs conditions puissent être vérifiées ça ne te coûtera pas grand chose de le laisser finir de tester les Case.

    Au pire tu peux toujours t'en sortir avec Label un GoTo...

  9. #9
    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

    Citation Envoyé par marie6631 Voir le message
    Pardon mais je veux sortir de ma boucle de condition et non de la boucle for.

    merci d'avance


    Lorsqu'un CASE est validé, les CASE suivants ne sont pas évalués et le code saute directement sur End Select
    "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...
    ---------------

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    Merci pour votre réponse. Mon pb est désormais résolu.
    Bonne journée

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

Discussions similaires

  1. Boucle avec condition "perdu"
    Par guismoman33 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/06/2007, 10h38
  2. Problème de boucle et condition
    Par fantomas261 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 20/04/2007, 18h05
  3. [Tableaux] Boucles et conditions
    Par Hayabusa dans le forum Langage
    Réponses: 6
    Dernier message: 18/12/2006, 00h07
  4. Tirer les formules avec boucle et condition excel
    Par melodyyy dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 19/10/2006, 15h11
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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