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 avec la fonction Left [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 67
    Par défaut Problème avec la fonction Left
    Bonjour tout le monde,


    Je suis encore assez débutant en VBA, mais je m'entraine à faire quelques exercices.

    Le dernier en date : trier une série de nom d'un classeur.

    Plus précisément, je veux que le curseur identifie les valeurs qui sont des textes pour ensuite les mettre, dans une autre feuille, dans la colonne de la première lettre du mot en question, et ce, les uns à la suite des autres.

    J'ai donc utilisé la fonction left, mais je galère à faire tourner ma macro.

    Voici mon code actuel:
    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
    Sub Tri()
     
    Dim numligne As Integer
    Dim numcolonne As Integer
    Dim Var_mot As String
    Dim Var_lettre As String
     
     
     
    For numligne = 1 To 6
        For numcolonne = 1 To 5
            If Not numeric Then
     
             Sheets("Mots").Select
             Cells(numligne, numcolonne).Activate
             Var_mot = Cells(numligne, numcolonne).Value
             Var_lettre = "=LEFT(Var_mot,1)"
     
                       Sheets("Tri").Select
                       Columns("Var_lettre").Select
                    If Range("Var_lettre" & 1).Value = "" Then
                       Range("Var_lettre" & 1).Value = l
                    Else
                       Range("Var_lettre" & 2).Value = l
                    End If
                        If Range("Var_lettre" & 2).Value <> "" Then
                            Range("Var_lettre" & 1).Select
                            Selection.Selection(xlDown).Offset(1, 0).Value = Var_mot
                        End If
            End If
        Next
    Next
    Je reste à votre disposition si vous avez besoin de précision.

    Merci d'avance

    Coklin

  2. #2
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Si tu t'entraine on va commencer par nettoyer ton code évite d'utilisert les .select c'est dans 99% des cas totalement inutile et cela ralenti le 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
    Dim numligne As Integer
    Dim numcolonne As Integer
    Dim Var_mot As String
    Dim Var_lettre As String
     
     
     
    For numligne = 1 To 6
        For numcolonne = 1 To 5
            If Not numeric Then
     
     
             Var_mot = Sheets("Mots").Cells(numligne, numcolonne).Value
             Var_lettre = "=LEFT(Var_mot,1)"
     
                With Sheets("Tri")
     
                    If .Range("Var_lettre" & 1).Value = "" Then
                       .Range("Var_lettre" & 1).Value = l
                    Else
                       .Range("Var_lettre" & 2).Value = l
                    End If
                    If .Range("Var_lettre" & 2).Value <> "" Then
                        .Range("Var_lettre" & 1).Selection(xlDown).Offset(1, 0).Value = Var_mot
                    End If
                End With
            End If
        Next
    Next
    Ensuite je ne comprend pas trop ce que tu veux faire. Tu met la valeur 1 dans la première ou deuxième ligne dans la colonne qui dépend de la première lettre de ton mot. Je ne vois pas en quoi cela permet de trier.
    De plus si deux mot commence par la même lettre tu ne le verra pas.


    Tu devrais également vérifier que la première lettre n'est pas un nombre
    utilise la commande Isnumeric, ou mieu la commande like qui permet de vérifier qui c'est bien un lettre et non de la ponctuation (regarde l''aide il y a bcp d'exemple)

    A mon avis tu devrais repenser l'algorithme de ton programme.

    Si j'ai bien compris, tu veux

    récupérer la première lettre de ton mot
    vérifier que c'est bien une lettre
    si c'est le cas copier le mot dans la colonne qui corespond

    C'est bien ca?

    ps : c'est relativement normale de ne pas avoir de réponse un dimanche soir a 21h45

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 67
    Par défaut
    Salut Krovax,


    D'abord merci pour ta réponse. Ensuite tu as bien compris ce que je voulais faire.

    Concernant la vérification des lettres, j'ai mis un if not numeric au début qui me permet d'éliminer les textes qui contiendraient des chiffres ou bien des nombres tout simplement.


    Ensuite, je n'ai pas encore utilisé la fonction tri, qui n'est pas très compliqué à faire (key 1, ascending, etc.). La difficulté ici étant surtout de récupérer la lettre de gauche (donc la première) du texte de chaque cellule pour mettre le mot dans la colonne correspondant à cette lettre (dans une autre feuille intitulée "Tri")

    D'où l'utilisation de Left, qui me permet de prendre la lettre de gauche, mais il doit y avoir une erreur de syntaxe ou d'algorithme.

    Donc la logique de mon code :
    1 - passer par tous les mots
    2 - ne retenir que les textes
    3 - Pour chaque texte, prendre la lettre de gauche
    4 - Ranger le mot dans la colonne correspondante
    a. Si la colonne est vide, alors le mot est en première place
    b. Si la cellule 1 est pleine mais la 2 vide, alors le mot est en cellule 2
    c. Si la cellule 1 et 2 sont pleine alors on fait stocke le mot dans la cellule Range(colonne & 1).End(xldown).Offset(1,0). Soit la première cellule vide de la colonne.

    Est-ce un peu plus clair?

    Coklin

  4. #4
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    If not numeric ne signifie rien tu ne lui dit pas ce qu'il doit tester pour lui il va tester une variable appelé numeric que tu na pas déclaré. Ce qui met fait dire que tu n'est pas en option explicite
    La variable n'est pas déclaré elle est de base a false donc ton teste marche tout le temps et est totalement inutile

    Met au tout début de ton module avant la première procédure ca t'évitera ce genre d'erreur

    Pour le reste c'est plus claire mais ce n'est pas vraiment ce que tu fais
    tu fais (ou essaye de faire)
    Si la première ligne de la colonne est vide tu met un 1 (et c'est tout)
    Si non tu met 1 dans la deuxième ligne
    si la deuxième ligne n'est pas vide tu met le mot dans la première ligne vide (au mieu la troisième position)

    Du coup tu rate systématiquement le premier mot d'une colonne et tu as deux 1 dans les premières lignes

    Je suis un peu mieux réveillé et j'ai repris ton code voila quelque remarque
    var_mot est déjà une variable si ut le met entre guillemet pour VBA ce n'est pas la variable que tu appelle mais tu lui parle d'un chaine de caractère qui contient "var_mot"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("Var_lettre" & 1).Value
    doit etre remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range(Var_lettre & "1").Value
    (les guillemet autour du 1 sont facultative)


    Regarde ce code je n'ai pas testé mais ca devrais mieux fonctionner


    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
    Dim numligne As Integer
    Dim numcolonne As Integer
    Dim Var_mot As String
    Dim Var_lettre As String
    Dim DerniereLigne As Long
     
     
    For numligne = 1 To 6
        For numcolonne = 1 To 5
             Var_mot = Sheets("Mots").Cells(numligne, numcolonne).Value
             Var_lettre = Left(Var_mot,1)
             If Var_lettre Like "[A-Za-z]" Then 'on vérifie que le premier caractère est bien une ettre soit majuscule soit minuscule
                With Sheets("Tri")
                    DerniereLigne = .Range(Var_lettre & "65536").End(xlUp).Row 'on récupère le numéro de la dernière ligne de la colonne
                    If .Range(Var_lettre & "1") = "" Then DerniereLigne = 0 'DerniereLignevau au minimum 1 donc la la première ligne était vide on écrirai dans la deuxième
                    .Range(Var_lettre & DerniereLigne + 1) = Var_mot 'on met le mot dans la ligne qui suit la dernière ligne de la colonne
                End With
            End If
        Next numcolonne
    Next numligne

  5. #5
    Membre chevronné
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Par défaut
    Salut,

    Ce ne serait pas plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Var_lettre = Left(Var_mot,1)
    ++
    Minick

  6. #6
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    bien vu je n'avais pas fait attention a ca le lundi matin est difficile
    Je modifie mon code

    pour coklin les guillement signifie du texte VBA n'essayera jamais de de regarder ce qu'il y a dedans. QUe tu mettes "Bonjour" ou "1+1" il se comportera de la meme facon
    ou n'afficheront pas 2

    la tu aura un 2 car sans les guillemet ce n'est pas du texte mais un calcul

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

Discussions similaires

  1. [AC-2010] Problème avec la fonction left()
    Par Guy FALESSE dans le forum IHM
    Réponses: 2
    Dernier message: 13/11/2013, 19h08
  2. [Débutant] problème avec la fonction left
    Par chuspyto dans le forum VB.NET
    Réponses: 3
    Dernier message: 02/05/2013, 04h10
  3. Problème avec la fonction left.
    Par arnold95 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/10/2007, 13h49
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 13h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 10h04

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