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 dans une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 116
    Points : 56
    Points
    56
    Par défaut Recherche dans une colonne
    Bonjour a tous,

    Mon problème et de recherche dans une feuille appelé "base de donnée" ainsi que dans la colone A.

    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
     
    Private Sub CommandButton2_Click()
    ' Référence a trouver
     
            Sheets("Base de données").Select
     
     
            Set c = Cells.Find(What:=TextBox1.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
            On Error GoTo Erreur
            If c = "" Then
            UserForm1.Hide
            End If
            c.Activate 'active la cellule trouvée
            PrixU = ActiveCell.Offset(0, 1).Value 'décale pour trouver le prix unitaire
    J'ai essayé pleins de choses mes rien a faire un ne me cherche pas mes valeurs dans la colone A

    Si quelqu'un a une idée

    Merci d avance

  2. #2
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    bonjour

    je ne suis pas tres au fait de la fonction Find, mais voici quelques incoherences relevées en fonction de

    J'ai essayé pleins de choses mes rien a faire un ne me cherche pas mes valeurs dans la colone A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set c = Cells.Find(What:=TextBox1.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
    xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

    Activecell ---> Quelle est t elle ?
    Cells ? Pourquoi travailler sur toutes les cellules plutot que sur la colonne A seulement
    Formulas --> Ce sont des formules ou des valeurs ?
    XlByRows ---> Tu recherches par ligne ?

    essaye cela et dis nous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set c = Range("A:A").Find(What:=TextBox1.Value, After:=Range("A1"), LookIn:=xlValues, LookAt:= _
    xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 121
    Points : 119
    Points
    119
    Par défaut
    bonjour a tous,

    en meme temps, est-il utile d'utiliser la fonction find...

    comme tu sais ce que tu cherches et où tu le cherches ( colonne A ), il suffit de parcourir la colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dim val = textbox1.value
     
    range("A1").select
    do until val = activecell.value
        activecell.offset(1,0).select
    loop

  4. #4
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    Bonjour Remit

    Un TextBox (saisie manuelle) il est possible d'entrer n'importe quoi, une faute de frappe, une majuscule qui n'y est pas, un point, une virgule, un espace à la fin, et la valeur n'existe pas dans la base

    Ton code va passer les 65536 lignes en selectionnant chaque cellule l'une apres l'autre (Le temps passé est enorme pour simplement dire à la fin Valeur non trouvée), de plus, il ne mettra jamais Valeur non trouvée, Quand tu seras à la 65536 eme ligne, le OffSet(1,0) Provoquera une erreur qui t'enverra dans le deboggage

    Personnellement je prefere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim i as integer,drapeau as boolean
    drapeau = false
    With Sheets("Base de données")
    for i = 1 to .range("A65536").end(xlup).row
         if .range("A" & i)=textbox1.value then drapeau=true : exit for
    next
    if drapeau = false then 
       msgbox "Valeur non trouvée"
    else
       msgbox "la valeur se trouve en A" & i
    end if
    m'enfin c'est une question de gout

    Bonne journée

  5. #5
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonjour,

    Tout à fait d’accord avec toi sur l’inutilité de boucler sur toutes les cellules de la colonne A. Encore pire avec Excel 2007 ou 2008, ce ne sont plus 65 536 passages, mais 1 048 576 !

    Dans le même esprit, pourquoi commencer à la ligne 1 ?

    Plutôt que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim i as Integer, drapeau as Boolean
    ' ...
        For i = 1 to .Range("A65536").End(xlUp).Row
            If .Range("A" & i) = Textbox1.Value Then drapeau=True : Exit For
        Next
    Mieux vaut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim c as range, drapeau as Boolean
    ' ...
        For Each c in Intersect(.UsedRange, .Range("A:A"))
            If .c = Textbox1 Then drapeau=True : Exit For
        Next
    Mais surtout, pourquoi abandonner la méthode Find, bien plus rapide qu’une boucle :

    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
    Private Sub CommandButton2_Click()
    Dim c As Range, PrixU As Single, f As Worksheet
    ' Référence a trouver
        Set f = Sheets("Base de données")
        Set c = f.Range("A:A").Find(TextBox1, ActiveCell, xlValues, xlWhole, , , False)
            If c Is Nothing Then
                MsgBox "Vous avez entré une référence inexistante. Corrigez=la, ou cliquez sur ""Annuler"""
                Exit Sub
            Else
                UserForm1.Hide
            End If
        PrixU = c.Offset(0, 1).Value
        ' Msgbox pour vérifier que le traitement fonctionne
        MsgBox PrixU
        Unload Me
    End Sub
    J’ai enlevé le "Select" et le "Activate" du code d’origine, superflus si le traitement se poursuit, et ajouté un test pour afficher un message si le contenu de "TextBox1" n’est pas trouvé.

    Cordialement,

  6. #6
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    Bonjour michel

    Pour la boucle je repondais à remiT, sinon dans le post precedent j'avais proposé des modifs sur find qui est je le concede beaucoup plus rapide qu'une boucle

    j'aimerai avoir une precision sur ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Set f = Sheets("Base de données")
        Set c = f.Range("A:A").Find(TextBox1, ActiveCell, xlValues, xlWhole, , , False)
            If c Is Nothing Then
                MsgBox "Vous avez entré une référence inexistante. Corrigez=la, ou cliquez sur ""Annuler"""
                Exit Sub
            Else
                UserForm1.Hide
            End If
        PrixU = c.Offset(0, 1).Value
    C'est le Activecell qui me gene et j'aimerai comprendre

    à partir de la cellule active (de la feuille active) ????
    1- J'aurais mis dans la logique f.activecell
    2- Sommes nous sur que la cellule active est A1 ? J'aurais mis f.Range("A1")

    Peux tu me dire ou? je n'ai pas compris (comme je l'ai dit precedemment je ne suis pas familier de cette fonction)

    qu'est et qu'elle est l'inscidence de XlWhole

    merci pour ta reponse

    cordialement

  7. #7
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Re,

    Le ActiveCell est un résidu de test, avec "Base de données" comme feuille active. Désolé . Il faut le supprimer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set c = f.Range("A:A").Find(TextBox1, ActiveCell, xlValues, xlWhole, , , False)
    f.ActiveCell n’existe pas. ActiveCell appartient nécessairement à la feuille active : c’est la cellule dans laquelle apparaîtrait les caractères saisis, si l’on utilisait le clavier.

    Que A1 soit la cellule active n’a aucune importance. Find va agir dans l’ensemble des cellules concernées. La seule différence est la première cellule dans laquelle s'effectue la recherche. Je te rappelle par ailleurs que A1 n’appartient pas forcément à la zone de recherche (la première ligne de la feuille pouvant parfaitement être vide), auquel cas, A1 n’appartient pas au UsedRange.

    "xlWhole" équivaut à cocher "Totalité du contenu de la cellule" (Excel 2007) ou "Cellule entière" (Excel 2004), dans les options de la fenêtre "Rechercher", quand tu le fais manuellement : si une cellule contient "ActiveCell" (au hasard ) et que tu cherches "Cell", avec "xlWhole", la cellule ne correspondra pas aux critères de recherche, tandis qu’elle correspondra à ces mêmes critères avec "xlPart".

    Voilà,

    Cordialement,

  8. #8
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    re:

    Merci michel pour ces precisions je ne modifierai pas mes appli les bases ne sont pas volumineuses mais à l'avenir j'utiliserai Find

    Merci encore et tous mes voeux pour 2008

    @ +

  9. #9
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    De rien,

    Excellente année à toi également,

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

Discussions similaires

  1. recherche dans une colonne pour changer les données
    Par cimbra55 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/03/2009, 17h49
  2. Recherche dans une colonne
    Par wabo67 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/01/2009, 18h58
  3. Recherche dans une colonne
    Par david71 dans le forum Access
    Réponses: 4
    Dernier message: 26/06/2007, 21h37
  4. Recherche dans une colonne tableau Word
    Par cath007 dans le forum VBA Word
    Réponses: 2
    Dernier message: 13/06/2007, 18h35
  5. [VBA-E] Recherche dans une colonne
    Par snowkhan dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/03/2006, 15h21

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