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 condition valeur cellule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    gestion
    Inscrit en
    Mai 2017
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : gestion

    Informations forums :
    Inscription : Mai 2017
    Messages : 163
    Par défaut Vba condition valeur cellule
    Bonjour,

    voilà mon problème, j'ai ce petit bout de code en vba qui ne fonctionne pas,

    Est ce que quelqu'un peut me dire pourquoi svp ?

    L'objectif est que si égalité il y a entre la valeur d'une cellule se trouvant dans "la feuille 1 plage cellule 1:1 à 200000:30"
    et la valeur de la cellule se trouvant "dans la feuille 2 cellule 2:1" alors une msgbox apparait disant "ok"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub tango()
     
    If Worksheets("Feuil1").Range(Cells(1, 1), Cells(200000, 30)).Value = Worksheets("Feuil3").Range(Cells(2, 1)).value Then
    MsgBox "ok"
    End If
     
    End Sub
    quelqu'un a t-il une solution pour faire fonctionner ce code ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 33
    Par défaut
    Bonjour manufer,

    Dans ton programme, tu recherches si une plage de plusieurs cellule a la même valeur qu'une seule cellule. Ce ne sont pas les mêmes objets et donc cela ne peut pas marcher.
    Il faut alors que tu vérifies chaque ligne de ta plage de données si j'ai bien compris ce que tu voulais faire.
    Essaye :
    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
     
    Sub tango()
    Dim lig As Long
    Dim col As Long
     
    Worksheets("Feuil1").Active
     
    For lig = 1 To 200000   'Sur les lignes allant de 1 à 200000
        For col = 1 To 30   ' Sur les collones allant de 1 à 30
            If Cells(lig, col) = Worksheets("Feuil3").range(Cells(2, 1)).Value Then ' Si il y en a une qui correspond
                MsgBox "La cellule ligne " & lig & ", colonne " & col & "est la même ", vbOKOnly + vbDefaultButton1 + vbExclamation, " Cellule trouvée"
                Exit Sub    ' On quitte le sub
                Else
            End If
        Next col
    Next lig
     
    End Sub
    Voila un exemple qui pourrait marcher, à toi de changer le nom de tes feuilles et de ta plage si cela change.
    Si tu as des questions n'hésite pas
    N'oublies pas de mettre le #code à chaque fois quand tu mets un code :p
    En espérant t'avoir aidé !

  3. #3
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,
    Plutôt que d'utiliser une boucle qui va rendre le temps d'éxecution de ta macro long, utilise la méthode Find :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
        If Not Sheets("Feuil1").Range(Cells(1, 1), Cells(200000, 30)).Find(Range("B2").Value) Is Nothing Then MsgBox "ok"
    End Sub

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 33
    Par défaut
    rebonjour Riaolle,

    Effectivement la méthode que j'emploie est très bourinne et je ne connaissais pas cette fonction mais est-ce qu'avec cette fonction "find", tu peux sortir la valeur de la cellule dans une MsgBox?

    Cordialement,
    Un aspirant à la programation

  5. #5
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Oui, si tu lis le lien, tu verras que la méthode Find renvoie un Range (si elle trouve une correspondance). Il suffit donc de travailler dessus comme sur une Range :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
        Dim trouvee As Variant
        trouvee = Sheets("Feuil1").Range(Cells(1, 1), Cells(200000, 30)).Find(Range("B2").Value)
        If Not trouvee Is Nothing Then MsgBox "La cellule se trouve à la ligne n° : " & trouvee.Row & " et la colonne n° : " & trouvee.Column
    End Sub

  6. #6
    Membre confirmé
    Homme Profil pro
    gestion
    Inscrit en
    Mai 2017
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : gestion

    Informations forums :
    Inscription : Mai 2017
    Messages : 163
    Par défaut
    Bonjour à tous

    Merci pour vos reponses qui me sont très utiles,

    Le "find" je ne connais pas je vais tâcher de me documenter dessus.

    J'ai été orienté vers une boucle (ubound),

    Problème c'est que lorsque j'ai voulu bouclé sur des cellules non vide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim i As Long
    Dim j As Byte
    Dim fin As Variant
     
    Sheets("feuil1").Activate
     
    fin = Worksheets("txcouvglo").Range("A1:AD200000").SpecialCells(xlCellTypeConstants).Select
     
    For i = 1 To UBound(fin, 1)
     
        For j = 1 To UBound(fin, 2)
    ça ne fonctionne pas à partir du "For"

    par contre j'arrive à boucler si je supprime la dernière partie de la variable .SpecialCells(xlCellTypeConstants).Select.

    Auriez-vous une explication à ça ?

  7. #7

  8. #8
    Membre confirmé
    Homme Profil pro
    gestion
    Inscrit en
    Mai 2017
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : gestion

    Informations forums :
    Inscription : Mai 2017
    Messages : 163
    Par défaut
    Bonjour à vous,

    Merci Riaolle et dysorthographie,

    j'ai voulu retranscrire ce qui avait été dit précédemment,

    Mais je me rend compte que lorsque je lance la boucle, elle ne m'affiche pas de bug mais pas de résultat non plus.

    Bonjour à tous,

    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
    Sub test()
     
    'Déclaration des variable
    Dim cellu As Range
    Dim i As Long
    i = 1
     
    'je lance la boucle sur la plage dont je vais extraire les données
     
    For Each cellu In Worksheets("txcouvglo").Range("A1:AD200000") '.SpecialCells(xlCellTypeConstants)
     
    'déclaration de la variable trouvee
        Dim trouvee As Variant
     
    'Si je trouve les correspondance entre les deux plages
     
        If trouvee = Sheets("txcouvglo").Range("A1", "AD200000").Find(Worksheets("feuil3").Range("B2:D10").Value) Then
     
    'A chaque fois qu'une cellule de la feuille   "txcouvglo " dans la plage spécifié est égales aux données présentes en feuille 3 dans les plages spécifiés
    ' je copie la ligne entière de la feuille "txcouvglo " et la colle dans la feuille 2
     
    trouvee.Sheets("txcouvglo").Range("A1", "AD200000").SpecialCells(xlCellTypeConstants).EntireRow.Copy Sheets("feuil2").[A65000].End(xlUp).Offset(i, 0)
     
    End If
    Next cellu
    Problème c'est qu'elle ne me renvoie aucune valeur en feuille 2

    Ai-je oublié quelque chose svp ?

  9. #9
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Effectuer déjà cette recherche manuellement depuis Excel …
    Une fois une correspondance trouvée donc manuellement,
    juste activer l'Enregistreur de macro puis réitérer la manipulation :   une base de code est livrée sur un plateau !

    Et là ce sera facile de constater tout est pourtant déjà dans l'aide VBA interne de cette méthode Find

  10. #10
    Membre confirmé
    Homme Profil pro
    gestion
    Inscrit en
    Mai 2017
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : gestion

    Informations forums :
    Inscription : Mai 2017
    Messages : 163
    Par défaut
    C'est peut être très clair pour vous mais je peux vous assurer que pour ce que je veux faire il n'y a aucune explication complète.

    Ce sont des bribes d'informations éparses et disparates.

    Je suis pourtant bien conscient que ce ne doit pas être difficile,

    Je continue de chercher, si vous avez des pistes sérieuses, je suis intéresse parce que je suis bloqué.

    Merci à vous.

  11. #11
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    En lisant bien l'aide VBA interne de cette méthode puis en l'appliquant avec les paramètres adéquats …

    Sinon manuellement depuis Excel la recherche donne déjà quoi ?

  12. #12
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour, je réponds à ton post #17.
    As-tu bien compris l'utilisatio nd'une boucle For Each?
    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim cellu As Range
    Dim val As String
    For Each cellu In Sheets(1).Range("A1:B10")
        val = val & cellu.Value
    Next cellu
    MsgBox val
    Cette boucle parcours les cellules de A1 à B10 et concatène leur valeurs. A chaque iteration, on utilise le fait qu'on parcours des cellules --> cf. on utilise cellu. Dans ta boucle, tu n'utilises jamais cellu, mais tu fais la même chose à chaque iteration de la boucle.
    Tu veux chercher le mot qu'il y a dans cellu, donc il faut que tu utilises cellu pour ta recherche. Regarde bien quelle est la syntaxe de Find !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plage_de_recherche.Find(mot_à_trouver)
    Ce n'est pas ce que tu as écrit.
    Dans ton cas, ce serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("txcouvglo").Range("A1:AD200000").Find(cellu.Value)
    Sachant que là tu cherches ton mot dans la même liste de mot que celle que tu parcours, donc tu vas forcément le trouver ... Quelle est la plage de cellules où il faut chercher le mot ?
    Ensuite, je ne comprends, pas bien ce que tu fais là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     trouvee.Sheets("txcouvglo").Range("A1", "AD200000").SpecialCells(xlCellTypeConstants).EntireRow.Copy
    Tu veux copier la ligne de trouvee, n'est-ce pas?
    Tout d'abord, un petit exemple imagé:
    Maison("Dupond").Salle("cuisine")
    Dans la logique de programmation en VBA (programmation orientée objet), ici tu dis que tu t'intéresses à la cuisine de la maison Dupond. Si tu écris :
    Salle("cuisine").Maison("Dupond")
    tu dis que tu t'intéresses à la maison Dupond de la cuisine. Ca ne va pas ! Dans ce que tu écris, si on ne prend que les 2 premiers objets : trouvee.Sheets("txcouvglo"), tu dis que tu veux t'intéresser à la feuille "txcouvglo" de la cellule trouvee. Ce n'est pas possible. Je ne comprends pas non plus pourquoi tu utilises SpecialCells. Si tu veux copier la ligne de trouvee, il suffit de copier la ligne de trouvee :
    Enfin, pourquoi utilises-tu la variable i ? Elle vaut toujours 1, non ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Dim cellu As Range
    For Each cellu In Worksheets("txcouvglo").Range("A1:AD200000")
        Dim trouvee As Variant
        trouvee = Sheets(feuille de recherche).Range(plage de recherche).Find(cellu.Value)
        If Not trouvee Is Nothing Then trouvee.EntireRow.Copy Sheets("feuil2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    Next cellu

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

Discussions similaires

  1. [XL-2003] Macro VBA copie valeur cellule excel et colle dans doc word
    Par tony020422 dans le forum Macros et VBA Excel
    Réponses: 54
    Dernier message: 03/06/2009, 09h21
  2. Réponses: 2
    Dernier message: 28/05/2009, 15h44
  3. [VBA-E]Lancer une macro sur changement de valeur cellule ?
    Par jeremiegrenoble dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/03/2006, 14h22
  4. [VBA-Excel]Décale colonne tant que valeur cellule ....
    Par Angel79 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 28/02/2006, 17h56
  5. [VBA-E]Récupérer valeur cellule
    Par wanou44 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 06/02/2006, 12h52

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