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 :

VBA-Excel-Pb avec left


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut VBA-Excel-Pb avec left
    Bonjour!
    Je travaille dans un code ou la fonction if left...fonctionne bien si je spécifie le nb de caractères à identifier...voir le code suivant...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (Left(rl.Cells(2), 6) = Left(r2.Cells(3), 6)) Then
    Je voudrais remplacer le chiffre 6 par (len(rl.cells(2) - 2) ce qui donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (Left(rl.Cells(2), (len(rl.cells(2) - 2)) = Left(r2.Cells(3), (len(rl.cells(3) - 2))) Then
    Mais cela ne fonctionne pas...
    Merci à celui qui pourra m'aider

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 902
    Points
    55 902
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Dans la deuxième partie de ton égalité, tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Left(r2.Cells(3), (len(rl.cells(3) - 2)))
    Left(r2.Cells(3), (len(rl.cells(3) - 2)))

    Est-ce normal?
    "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...
    ---------------

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    non, effectivement, c etait pas normal...
    J ai cru que j allais passer pour un c.. mais en fait ca ne marche toujours pas en rectifiant ca
    Merci de ton aide

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 902
    Points
    55 902
    Billets dans le blog
    131
    Par défaut
    Tu as un petit cafouillage dans les parenthèses (en trop juste avant len, trop peu avant le -2

    Ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If (Left(rl.Cells(2), Len(rl.Cells(2)) - 2) = Left(r2.Cells(3), Len(r2.Cells(3)) - 2)) Then
    fonctionne-t'il?
    "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...
    ---------------

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    Ca bug toujours et il met "argument ou appel de procédure incorrect" en message d'erreur mais quand je regarde le fichier, il fait bien ce que je lui dit
    Je te mets le code en entier pour tout voir...
    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
       Sheets("Feuil1").Select
        Dim rw As Range 'Tableau de donnée Source
     Dim rl As Range ' ligne du tableau de donnée
     Dim r2 As Range
     Dim cDest As Range ' Cellule de destination
     
     
     
     Set cDest = Range("H1") ' 1°Cellule destination
     
     
     Set rw = Cells(3, 1).CurrentRegion ' on suppose que le tableau de donnee commence en C1..
     For Each rl In rw.Rows 'parcours les lignes du tableau de donnée source
       Debug.Print "Compare " & rl.Cells(3).Address & " et " & rl.Cells(2).Address
      For Each r2 In rw.Rows
    If (Left(rl.Cells(2), Len(rl.Cells(2)) - 2) = Left(r2.Cells(3), Len(r2.Cells(3)) - 2)) Then
          cDest.Value = r2.Cells(3)  ' Copie contenue colonnes c etD D ( 4°)
          cDest.Offset(0, 1) = r2.Cells(4)
          cDest.Offset(0, 2) = r2.Cells(5)
         Exit For
       End If
      Next
       Set cDest = cDest.Offset(1, 0) 'Passe ligne suivante
     Next
    Merci encore

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 902
    Points
    55 902
    Billets dans le blog
    131
    Par défaut
    Je ne comprends pas trop ton code...
    Notamment la ligne
    qui, à mon avis, boucle sur la même ligne que r1...
    Peux-tu expliquer ce que tu souhaites réaliser?
    "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...
    ---------------

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    soyons plus clairs...
    JE souhaite comparer la valeur de la case C avec celle de la case B...a 2 caractères près(les derniers)...si B=C alors copie en H ce qu'il y a dans les cases C D et E....
    voila ce que je souhaite faire...
    Merci

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 902
    Points
    55 902
    Billets dans le blog
    131
    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
     
    Sub Copie()
        Dim Cellule As Range ' objet Plage
     
        ' on itère sur les cellules de C1 jusqu'à la dernière cellule de c remplie
        For Each Cellule In Range("c1:c" & Range("c65536").End(xlUp).Row)
            If Left(Cellule, Len(Cellule) - 2) = Left(Cellule(1, 0), Len(Cellule(1, 0)) - 2) Then
                ' si égalité aux deux caractères de droite près, on copie en h
                Range(Cellule, Cellule(1, 3)).Copy Destination:=Range("h" & Cellule.Row)
            End If
        Next Cellule
    End Sub
    Cela fonctionne-t'il?

    P.S.: ajouter la sélection de la feuille avant, je l'avais oublié
    "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...
    ---------------

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    désolé mais ca renvoie la meme erreur et ca bloque toujours a la ligne If left...

  10. #10
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 902
    Points
    55 902
    Billets dans le blog
    131
    Par défaut
    Dans mon exemple, je n'ai pas testé le left... - 2
    Si tu as une cellule en C qui contient moins de 2 caractères ou qui est vide, il y a plantage...

    Il faudrait donc insérer une vérification que len(...) renvoie au moins 2 et décider de ce qui se passe si ce n'est pas le cas...

    Ok?
    "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...
    ---------------

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    ca donnerait un truc comme ca mais je ne sais pas comment sortir de la boucle si X ou XX <1
    JE ne peux pas mettre end sub car j ai encore un bout de code après
    merci si tu peux encore m aider

    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
      Sheets("Feuil1").Select
         Dim Cellule As Range ' objet Plage
        Dim X As String
         Dim XX As String
        X = (Len(Cellule) - 2)
        XX = (Len(Cellule(1, 0)) - 2)
     
     
        ' on itère sur les cellules de C1 jusqu'à la dernière cellule de c remplie
        For Each Cellule In Range("c1:c" & Range("c65536").End(xlUp).Row)
            If Left(Cellule, X) = Left(Cellule(1, 0), XX) Then
                ' si égalité aux deux caractères de droite près, on copie en h
                Range(Cellule, Cellule(1, 3)).Copy Destination:=Range("h" & Cellule.Row)
                If X < 1 Then
                If XX < 1 Then
     
            End If
            End If
            End If
        Next Cellule

  12. #12
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    j'ai pas tous relu mais pour sortir d'une boucle FOR c'est Exit FOR...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If X < 1 Then Exit For

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    merci bbil
    maintenant ca bloque a X = (Len(Cellule) - 2)
    ca me semble correct pourtant ...
    Merci a ceux qui m aideront

  14. #14
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    ça bloque ...? un message ..?


    à oui j'avais pas tout relu .. mais là ou tu fais XX = len(Cell...) ..
    Cellule n'ai pas encore initialisée...! et est "nulle" Nothing....

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    j ai essayé comme ca mais la ca bloque a If left....imcompatibilité de 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
       Sheets("Feuil1").Select
         Dim Cellule As Range ' objet Plage
        Dim X As String
         Dim XX As String
     
     
     
        ' on itère sur les cellules de C1 jusqu'à la dernière cellule de c remplie
        For Each Cellule In Range("c1:c" & Range("c65536").End(xlUp).Row)
     
            If Left(Cellule, X) = Left(Cellule(1, 0), XX) Then
     
                   If X < 1 Then Exit For
                If XX < 1 Then Exit For
                        X = (Len(Cellule) - 2)
        XX = (Len(Cellule(1, 0)) - 2)
                ' si égalité aux deux caractères de droite près, on copie en h
                Range(Cellule, Cellule(1, 3)).Copy Destination:=Range("h" & Cellule.Row)
     
     
     
            End If
     
     
        Next Cellule

  16. #16
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    C'est quoi X et XX pour toi ... ? pourquoi les déclare tu en chaine... len renvoi un entier ...?..... ensuite pour la 1° iteration de ta boucle ... ton X et XX sont = à 0...car pas initialisés.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Points : 23
    Points
    23
    Par défaut
    bonsoir capitaine93,

    Dans ton dernier code, tes variables X et XX ne contiennent rien. N'est ce pas le problème ?

    fast

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    en fait comme ca, ca marche...

    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
    Sheets("Feuil1").Select
        Dim rw As Range 'Tableau de donnée Source
     Dim rl As Range ' ligne du tableau de donnée
     Dim r2 As Range
     Dim cDest As Range ' Cellule de destination
     Dim X As String
     Dim XX As String
     
     
     
     
     Set cDest = Range("H1") ' 1°Cellule destination
     
     
     Set rw = Cells(3, 1).CurrentRegion ' on suppose que le tableau de donnee commence en C1..
     
     For Each rl In rw.Rows 'parcours les lignes du tableau de donnée source
       Debug.Print "Compare " & rl.Cells(3).Address & " et " & rl.Cells(2).Address
     
      For Each r2 In rw.Rows
    X = 1
    XX = 1
    X = (Len(rl.Cells(2)) - 2)
    XX = (Len(r2.Cells(2)) - 2)
    If X < 1 Then Exit For
    If XX < 1 Then Exit For
     
    If (Left(rl.Cells(2), X) = Left(r2.Cells(3), XX)) Then
     
     
          cDest.Value = r2.Cells(3)  ' Copie contenue colonnes c etD D ( 4°)
          cDest.Offset(0, 1) = r2.Cells(4)
          cDest.Offset(0, 2) = r2.Cells(5)
         Exit For
     
       End If
      Next
       Set cDest = cDest.Offset(1, 0) 'Passe ligne suivante
     Next

    merci de votre aide et de vos précieux conseils

  19. #19
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    juste pour le fun ... pourquoi t'obstine tu as déclarer tes variables X et XX en string ... alors que tu les utilises ensuite comme des entiers !!

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    je viens de me rendre compte que string ne s'applique pas a ce genre de variable...mais bon vu que ca passait comme ca, j ai pas creusé...
    EN fait, j'aurais du déclarer en integer...reprends moi si j ai dit une bêtise...
    Merci pour ce commentaire bbil, ca me fait progresser encore un peu plus

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

Discussions similaires

  1. VBA EXCEL : Probleme avec On Error
    Par izalec dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2006, 10h23
  2. [VBA Excel] sauvegarde avec le contenu de la formule
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/07/2006, 16h19
  3. [VBA Excel] Tableau avec données du userform et de formules
    Par Viper7 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/06/2006, 13h29
  4. [VBA][EXCEL]PB avec la commande WorksheetFunction.VLookup
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/11/2005, 16h41
  5. [VBA-Excel] Plagen avec Cells
    Par Damsou dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/01/2005, 10h49

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