Signaler

Chercher une valeur dans plusieurs feuilles excel [Résolu]

Posez votre question nihadlahit 48Messages postés lundi 9 septembre 2013Date d'inscription 18 septembre 2016 Dernière intervention - Dernière réponse le 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,


Afficher la suite 
Utile
+0
moins plus
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.  😊
 
albkan 1047Messages postés samedi 26 mars 2016Date d'inscription 22 septembre 2016 Dernière intervention - 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.  😊
 
Répondre
nihadlahit 48Messages postés lundi 9 septembre 2013Date d'inscription 18 septembre 2016 Dernière intervention - 18 sept. 2016 à 10:52
je te remercie infiniment pour tes explications qui sont très claire.
j'ai essayé de corriger mon code selon tes indications, maintenant ça marche mais avec 2 inputbox, en effet,je vois pas clairement l'utilité d'enlever un inputbox.

cordialement,
Répondre
albkan 1047Messages postés samedi 26 mars 2016Date d'inscription 22 septembre 2016 Dernière intervention - 18 sept. 2016 à 18:54
 
Tu as écris : « je ne vois pas clairement l'utilité d'enlever un inputbox ».

a) Pour ton 1er InputBox, que se passe-t-il si ton utilisateur entre un n° d'article A
qui existe déjà ? Ce n'est pas bon, et ton 2ème InputBox est là pour lui permettre
d'entrer à nouveau un autre n° d'article, n'est-ce-pas ?

b) Pour ton 2ème InputBox, que se passe-t-il si ton utilisateur entre le même
n° d'article A (volontairement ou non) ? Ou s'il entre un autre n° d'article B
qui lui aussi existe déjà ? Vas-tu mettre un 3ème InputBox pour lui permettre
de corriger ? Puis un 4ème InputBox pour pouvoir corriger une erreur de
n° d'article lors de la saisie du 3ème InputBox ? etc... ? Vu ?  😉
 
Répondre
albkan 1047Messages postés samedi 26 mars 2016Date d'inscription 22 septembre 2016 Dernière intervention nihadlahit - 19 sept. 2016 à 01:06
 
Ajout : Imagine que tu aies un utilisateur particulièrement retors qui s'obstine
à mettre à chaque fois un n° d'article déjà existant, cela vingt fois de suite !
Et qui met enfin un n° d'article non existant à sa 21ème saisie.

Vas-tu mettre 20 InputBox pour les vingt premières mauvaises saisies et une
dernière 21ème InputBox pour sa dernière bonne saisie ?  😉

Et qu'arrivera-t-il s'il revient la prochaine fois, encore plus têtu et obstiné, et
fait 50 mauvaises saisies avant la bonne ? Vas-tu mettre 51 InputBox dans
ton code VBA juste pour faire plaisir à ce Monsieur indélicat ?  😉

Je sais, tu vas me dire : « C'est pas d'chance ! » et « Personne n'est obstiné
à ce point ! » (même s'il voulait faire exprès d'embêter la gentille nihadlahit
qui fait de son mieux pour créer un beau programme VBA !).  😉

Effectivement, mais lorsque tu mets une saisie dans un code VBA, c'est un
« point d'achoppement » pour lequel il faut tout prévoir ! Donc par exemple,
pour la saisie d'un nombre, ne pas le mettre directement dans une variable
numérique car plantage si l'utilisateur entre une chaîne de caractères !
Solution : le nombre doit être stocké en tant que texte dans une chaîne de
caractères, à vérifier d'abord, puis à convertir ensuite en nombre.  😊
 
Répondre
nihadlahit- 19 sept. 2016 à 20:22
tes explications sont vraiment super!! je te remercie encore une fois.
voila ce que j'ai fait:


Worksheets("feuille2").Select
Dim v As Variant
Dim x As Byte
For x = 3 To Sheets.Count
v = InputBox("Entrez le N° de l'Article:")
If Worksheets(x).Range("A1").Value = v Then
MsgBox ("le numéro de l'Article que vous avez saisi existe deja!")
Else
Worksheets("feuille2").Range("C1").Value = v
Exit For
End If
Next x
Répondre
Ajouter un commentaire
Utile
+0
moins plus
Bonjour Nihadlahit,

si dessous proposition avec nombres entiers et gestion d'erreurs
si tes nombres sont des réels, changer ref et valeur en "single" au lieu d'integer

Option Explicit
'-------------------------------------------------------
Sub nouvelle_valeur()
Dim Nbre As Byte, D_a1 As Object, cptr As Byte, ref As integer
Dim Valeur As Integer, Rep As Byte

'-----------------préparation
Nbre = ThisWorkbook.Sheets.Count
' dictionary: permet la création d'une liste des occurences uniques
Set D_a1 = CreateObject("scripting.dictionary")
'boucle sur toutes les feuilles du classeur
For cptr = 1 To Nbre
ref = Sheets(cptr).Range("A1")
'si la valeur de "A1" n'existe pas, on l'inscrit dans le dictionary
If Not D_a1.exists(ref) Then: D_a1.Add ref, ""
Next
'---------------action
1
Valeur = Application.InputBox(prompt:="Introduire le nombre à insérer", Type:=1)
'teste si le nombre existe dans une des cellules A1 du classeur (donc inscrite dans le dictionary)
If D_a1.exists(Valeur) Then GoTo présent 'si oui déclenchement d'une erreur: renvoi dans le gestionnaire d'erreur
Sheets(2).Range("A3") = Valeur ' inscription dans la cellule

Exit Sub
'--------------gestionnaire d'erreur
présent:
Rep = MsgBox(" le nombre choisi: " & Valeur & " existe déjà, recommencer ?", vbYesNo, vbExclamation)
If Rep = vbYes Then GoTo 1 'renvoi à "1"
End Sub


La maquette de travail
http://www.cjoint.com/c/FIthPz1xgWE

nihadlahit- 19 sept. 2016 à 20:23
Merci bien, pour ton code :)
Répondre
nihadlahit- 21 sept. 2016 à 13:49
dans mon cas, l'utilisateur saisit une valeur de type String, lorsque je convertit les types des variables suivantes ref et valeur en String, le message d'erreur suivant s'affiche:
Nombre non valide.
qu'est ce que je peux faire?
Répondre
michel_m 13939Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 22 septembre 2016 Dernière intervention - 21 sept. 2016 à 14:00
bonjour

comme tu avais marqué "X", des vieux souvenirs de math m' ont emmener sur des nombres!... ;-)
je regarde en fin d'aprem ou demain matin
Répondre
michel_m 13939Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 22 septembre 2016 Dernière intervention - 22 sept. 2016 à 10:27
bonjour
ci joint correction pour des valeurs "texte" + gestion si clic sur annuler ou croix de l'inputbox que j'avais oublié

Option Explicit
'-------------------------------------------------------
Sub nouvelle_valeur()
Dim Nbre As Byte, D_a1 As Object, cptr As Byte, ref As String
Dim Valeur As String, Rep As Byte

'-----------------préparation
Nbre = ThisWorkbook.Sheets.Count
' dictionary: permet la création d'une liste des occurences uniques
Set D_a1 = CreateObject("scripting.dictionary")
'boucle sur toutes les feuilles du classeur
For cptr = 1 To Nbre
ref = Sheets(cptr).Range("A1")
'si la valeur de "A1" n'existe pas, on l'inscrit dans le dictionary
If Not D_a1.exists(ref) Then: D_a1.Add ref, ""
Next
'---------------action
1
Valeur = Application.InputBox(prompt:="Introduire la valeur à insérer", Type:=2)
'teste si la valeur saisie (type 2: texte) existe dans une des cellules A1 du classeur (donc inscrite dans le dictionary)

If D_a1.exists(Valeur) Then GoTo présent 'si oui déclenchement d'une erreur: renvoi dans le gestionnaire d'erreur
With Sheets(2)
.Range("A3") = Valeur ' inscription dans la cellule
If Valeur = False Then ' clic sur "annuler" ou croix dans l'inputbox
.Range("A3") = ""
GoTo fin
End If
.Activate
End With
Exit Sub
'--------------gestionnaire d'erreur
présent:
Rep = MsgBox(" la valeur choisie: " & Valeur & ", existe déjà, recommencer ?", vbYesNo, vbExclamation)
If Rep = vbYes Then GoTo 1 'renvoi à "1"
fin:
End Sub

Répondre
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !