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 Valeur -> écrire dans une colonne de cette ligne


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut Recherche Valeur -> écrire dans une colonne de cette ligne
    Bonjour,

    Grand (gros?) débutant en programmation, je me suis attaqué à quelque chose qui me dépasse complètement
    (c'est comme ça qu'on apprend parait-il )

    Alors voila
    Dans un cadre professionnel je dois permettre à mes utilisateurs de filtrer
    un fichier excel en fonction de cases à cocher cochées ou non.

    Le but : mettre un X au bout des lignes qui contiennent la ou les valeurs
    recherchées
    La méthode : 1. rassembler les valeurs à rechercher 2.les rechercher dans
    chaque ligne 3. mettre un X au bout de chacune de ces ligne 4.filtrer sur
    tous les X dans la colonne M

    Je commence donc par rassembler les Caption de ces cases dans une variable
    String :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If TypeName(Ctrl) = "CheckBox" Then
        If Ctrl.Value = True Then
            strTemp = strTemp & Ctrl.Caption & ";"
        End If
    End If
    Ensuite le but est de rechercher cette valeur dans la colonne K de chaque
    ligne, et pour chaque ligne dans laquelle se trouve cette valeur, mettre un
    X dans la colonne M. Ce X me permettra ensuite de filtrer tranquillement mon
    fichier. Sauf que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
        For i = 1 To nbLignes
            If (InStr(1, CStr(Range("K" & i).Value), strTemp, vbTextCompare) = 
    1) Then
                Range("M" & i) = "X"
            End If
    ne marche pas !! j'ai beau faire ce que je peux, il me met un X dans toutes les lignes, meme la ligne d'en-tete de colonne >_<

    une idée mes bons messieurs-dames ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    bonsoir

    tu peux utiliser un bout de code de ce style qui recherche la valeur de strTemp dans la colonne K et met un X sur la même ligne en colonne K

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    With Range("k1:k" & Range("A65535").End(xlUp).Row)
        Set c = .Find(strTemp, LookIn:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                c.Offset(0, 2) = "X"
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With
    ok
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut
    Bonsoir
    CheckBoxes de la boite à outils Contrôles sur une feuille de calcul (ActiveX)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub CheckBoxes()
    Dim oleObj As OLEObject
    For Each oleObj In ActiveSheet.OLEObjects
    If TypeOf oleObj.Object Is MSForms.CheckBox Then
       If oleObj.Object.Value Then
          For Each cell In Range("K1:" & Cells(Rows.Count, 11).End(xlUp).Address)
             If cell.Value = oleObj.Name Then
                cell.Offset(, 2).Value = "X"
            End If
          Next
      End If
    End If
    Next
    End Sub
    Bonne soirée

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    merci zyhack et merci Abed_H !

    Mais comment fait-on si la valeur de ma variable est du type " chat;chien;biere blanche; " ?

    en effet mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If TypeName(Ctrl) = "CheckBox" Then
        If Ctrl.Value = True Then
            strTemp = strTemp & Ctrl.Caption & ";"
        End If
    End If
    enregistre les valeur des Caption de plusieurs Checkbox à la suite, mais séparées par des " ; "
    le problème auquel je suis confronté est qu'il recherche " Chat; " mais ne trouve pas puisque dans la colonne il n'y a que " Chat "

    Comment régler ce problème de ; voire d'espaces dans les Caption ? Je veux qu'il recherche chaque valeur comprise entre des " ; "

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Autant pour moi je n'avais pas vu le point virgule en fin de ligne.

    le plus simple serait de les traiter au fur et à mesure en imbriquant les deux codes

    si Ctrl.Value = true on recherche Ctrl.caption et on met les X tous de suite puis on passe au controle suivant

    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
     
    If TypeName(Ctrl) = "CheckBox" Then
        If Ctrl.Value = True Then
            With Range("k1:k" & Range("A65535").End(xlUp).Row)
                Set c = .Find(Ctrl.Caption, LookIn:=xlValues)
                If Not c Is Nothing Then
                    firstAddress = c.Address
                    Do
                        c.Offset(0, 2) = "X"
                        Set c = .FindNext(c)
                    Loop While Not c Is Nothing And c.Address <> firstAddress
                End If
            End With
        End If
    End If
    Si ça te semble bien !
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Oui, ton code me semble bien !
    J'aime bien ta manière d'écrire le code, on sens que ce n'est pas ton premier language, ou en tout cas ça change de ce qu'on voit dans les tutos.

    Mais je l'ai testé et ça ne marche pas il ne me met aucun X nulle part, que ce soit en recherchant la valeur en majuscule, en minuscule, avec ou sans espaces, etc. etc.

    Franchement je ne comprend pas pourquoi

    Si tu as une idée fait le moi savoir, je vais essayer de le faire moi-même
    sinon tu peux aussi m'indiquer comment modifier ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(Rows.Count, "A").End(xlUp).Row
    pour lui dire de compter a partir de la 3ème ligne

    J'ai énormément de mal avec les sélections de plages, je mélange absolument tout, les Cells, Row, Rows, Range, tous les points avant ou après, bref c'est l'enfer pour moi de définir une plage ...
    (si t'as un bon tuto la-dessus je suis preneur)

    Merci !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    En refaisant la vérification le code fonctionne pour moi mais j’ai quand même trouvé deux possibilités. (C’est le problème quand il faut adapter du code sans avoir la feuille et le contexte sous les yeux)

    1)
    Dans mon code tu trouves cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Range("k1:k" & Range("A65535").End(xlUp).Row)
    La partie Range("A65535").End(xlUp).Row renvoie le numero de ligne de la dernière valeur trouvé dans la colonne A.

    Si tu n’a rien dans cette colonne essaye en remplaçant par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Range("k1:k" & Range("K65535").End(xlUp).Row)
    2) critères de recherche
    Cette ligne permet de sélectionner les critères de recherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = .Find(CheckBox1.Caption, LookIn:=xlValues)
    Essaye en la modifiant comme ceci (pour + d'infos regarde l'aide de la fonction Find)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = .Find(CheckBox1.Caption, LookIn:=xlValues, LookAt:=xlPart)

    Quand à ta deuxième question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Cells(Rows.Count, "A").End(xlUp).Row
    pour lui dire de compter a partir de la 3ème ligne
    essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A3:A" & Range("A65535").End(xlUp).Row).Rows.Count
    Et pour le tuto je ne connais pas encore assez tout ce que contient le site mais as-tu essayé de lancer une recherche ?
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Merci grace a toi ça marche parfaitement ^_^

    Je comprend un peu mieux les fonctions de recherche et de plages de recherche. Je vais voir pour trouver d'autres ressources.

    Si tu as le temps et l'envie, tu peux essayer de regarder cet autre message que j'ai posté, concernant un problème somme-toute assez simple de Compteur (ou pas?).

    Encore Merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/04/2009, 21h22
  2. Faire la recherche d'un élement dans une colonne avec la fonction match
    Par ckrikri dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/11/2008, 11h54
  3. Copier valeur non vide dans une colonne
    Par Toad08 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/03/2008, 21h40
  4. Recherche d'un mot dans une colonne classée
    Par RéviAT dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/03/2008, 14h20

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