Chercher une valeur dans plusieurs feuilles excel

Résolu/Fermé
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 - 16 sept. 2016 à 20:43
 nihadlahit - 22 sept. 2016 à 11:16
Bonjour,

je suis débutante en vba,je voudrais créer une macro qui réalise les fonctionnalités suivantes:
je note que le bouton de ma macro se trouve dans la feuille 1
1) sélectionner la feuille 2
2) demander à l'utilisateur de saisir une valeur X ,puis récupérer cette valeur dans la cellule A3 de la feuille 2
3) si la valeur saisi par l'utilisateur existe dans la cellule A1 des autres feuilles ,je dois demander
à l'utilisateur de saisir une autre valeur différente de X.Si non sortir de la boucle.
j'ai essayé le code suivant ,mais ça ne marche pas
With Worksheets("feuille2")
Sheets("feuille2").Select
Worksheets("feuille2").Cells(1, 3).Value = InputBox("Entrez le N° de l'article:")
End With
For Each O In Worksheets
    If O.Range("A1").Value = Worksheets("feuille2").Cells(1, 3).Value Then
     MsgBox ("le numéro de l'artice que vous avez saisi existe deja")
     Worksheets("feuille2").Cells(1, 3).Value = InputBox("Re-Entrez le N° de l'article:")
      End If
        Exit For
Next O

qu'est ce que je peux faire??

cordialement,






A voir également:

2 réponses

Utilisateur anonyme
17 sept. 2016 à 00:42
Bonjour nihadlahit,

Au point 2), tu as écris : « ... récupérer cette valeur dans la cellule A3 »,
mais dans ton programme, tu utilises Cells(1, 3) ! Je croyais que tu avais
compris que c'est : Cells(ligne, colonne) ! Or (ligne 1, colonne 3) = C1,
pas A3 ! Mais peut-être est-ce juste une inversion malencontreuse de
ta part ? Ça peut arriver à tout programmeur, moi y compris...

---------------------------------------------

Note que tu as mis un With inutilement, puisque tu ne l'utilises pas !
En l'utilisant, ça donnerait :


With Worksheets("feuille2")
  .Select
  .Cells(3, 1) = InputBox("Entrez le N° de l'article :")   ' en A3 !
End With


Et en plus, compte tenu de ton programme, il vaudrait mieux
placer le End With juste après le Next O, ce qui permettrait
alors d'enlever les 2 Worksheets("feuille2") qui sont dans ta
boucle For (mais en laissant bien sûr le point juste à droite).

Mais tu vas voir de suite qu'on peut fort bien s'en passer !

---------------------------------------------

En effet, comme la majeure partie du travail se fait en feuille 2,
le mieux est d'aller dessus dès le début, comme tu l'as fait,
mais avec : Worksheets("feuille2").Select

Ce sera plus rapide qu'avec Sheets("feuille2").Select car VBA cherchera
alors la feuille uniquement dans celles de type feuille de calcul, et pas
dans les autres types de feuille.

Étant d'emblée sur "feuille2", inutile d'utiliser un With pour cela
puisqu'il est inutile de préciser la feuille ; car sans indiquer de
façon explicite le nom de la feuille, ta macro fera tout le travail
sur la feuille active, donc "feuille2" puisque c'est celle en cours ;
et si on a besoin d'une autre feuille que "feuille2", c'est là qu'il
faut préciser explicitement cette feuille (et si on doit le faire
souvent, c'est là qu'il est utile d'utiliser With).

---------------------------------------------

Si on résume ce que tu veux faire, c'est : entrer un n° article
sur "feuille2" et en A3, puis le refuser s'il existe déjà sur les
autres feuilles, en A1. Or pour cela, ton programme est très
mal construit, car il y a 2 InputBox ! Essaye de le réécrire
de telle façon qu'il n'y ait qu'un seul InputBox.

2 autres questions à te poser : quand ça compare A3 de "feuille2"
avec A1 de toutes les autres feuilles : y compris "feuille1" où tu
as le bouton de ta macro ? Et est-ce utile de comparer avec A1
de "feuille2" ? Eh oui : ton For Each O est bien pour toutes les
feuilles, y compris "feuille1" et "feuille2" ! Donc si la comparaison
s'avère inutile pour ces 2 feuilles, autant les éviter, n'est-ce-pas ?

---------------------------------------------

Bon courage et bonne chance ! Cordialement.  😊
 
0
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
Modifié par nihadlahit le 17/09/2016 à 12:49
Merci pour tes explication,
concernant votre première question:
1) quand ça compare A3 de "feuille2" avec A1 de toutes les autres feuilles : y compris "feuille1" où tu as le bouton de ta macro ?
---> en effet,je ne veux pas introduire la feuille1 dans cette comparaison.
et Pour la deuxième question:
Et est-ce utile de comparer avec A1 de "feuille2" ?
Non
j'ai essayé de corriger mon code,mais ça marche pas :

Worksheets("feuille2").Select
Worksheets("feuille2").Cells(1, 3).Value = InputBox("Entrez le N° de l'AT:")

Dim x As Byte
For x = 3 To Sheets.Count
If Worksheets(x).Range("A1").Value = Worksheets("Import").Cells(1, 3).Value Then
MsgBox ("le numéro de l'AT que vous avez saisi existe deja")
Worksheets("Import").Cells(1, 3).Value = InputBox("Re-Entrez le N° de l'AT:")
End If
Exit For
Next
End Sub


comment je peux réécrire les 2 imputbox en un seul?

cordialement,
0
Utilisateur anonyme > NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017
18 sept. 2016 à 07:13
 
Tu as très bien fait de préciser ce que j'avais deviné : il est inutile de faire
la comparaison pour "feuille1" et "feuille2" !

Tu crois vraiment que c'est utile, un Exit For juste avant le Next du For .. Next ?
Moi, je ne crois pas, et tu peux l'enlever sans aucun problème !  😉  Mais si tu
avais fait une meilleure indentation de ton code VBA, tu l'aurais peut-être vu ?

Toujours pour ta boucle For .. Next, c'est toujours mieux de préciser la variable
utilisée : comme tu as mis For x ..., c'est mieux de mettre après Next x ; ça fait
que l'exécution du code sera plus rapide ; et plus le nombre de boucles est
important, plus ça compte !

Pour réécrire ton programme avec un seul InputBox() au lieu de 2, je te laisse
chercher toi-même encore un peu ; je te le dirai plus tard, sauf si un autre
intervenant te donne la solution avant.  😊
 
0