bonjour à tous 8
j’ai un petit soucis quoi que j’écris dans ma cellule C8
et me note toujours 15,8
je vous joins un fichier essai
merci pour votre aide
essai recherche plusieurs cellule.xlsm (149,2 Ko)
Hello
n’étant pas habitué au VBA, mais une piste vers cela…
Dans ton code, sauf erreur de ma part, tu n’as pas déclaré les variables et tu mets i=2 donc en i Excel mettra toujours 2 et le résultat de la recherche seras toujours 15,8
Bonsoir
Mon code a été modifié de manière maladroite d’où ta déconvenue
Je l’ai corrigé et maintenant pour moi cela fonctionne
Testes et dis moi
essai recherche plusieurs cellule.xlsm (46,0 Ko)
Bonsoir Taz067
" tu n’as pas déclaré les variables"
Ce code est de ma conception
Par principe je ne ne déclare jamais des variables
Je suis pour de l’efficacité et non un purisme d’écriture qui de mon point de vue n’apporte rien d’intéressant mais que des déboires si celui-ci est erroné
Je codifie depuis des années avec cette philosophie sans la moindre difficulté c’est donc devenue ma devise
Maintenant chacun voit midi à sa porte
Pour la variable i elle est défini pour la nécessité de la boucle Do While Loop qui suit
Au départ une valeur doit lui être déterminée qui évolue ensuite dans les lignes de code de cette boucle et plus précisément celle-ci avant le Loop :
i = i + 1
Loop
La boucle continue tant que la condition de sa première ligne est tenue :
Do While i < Sheets(« Paramètres »).Range(« B » & Rows.Count).End(xlUp).Row + 1
et plus précisément :
i < Sheets(« Paramètres »).Range(« B » & Rows.Count).End(xlUp).Row + 1
valeur de i inférieur au numéro de la dernière ligne+1 de colonne « B » de l’onglet « Paramètres »
dés que la variable i est supérieure la boucle s’arrète
Voilà pour les explications
Bonne soirée
T’inquiète, je n’y connais pas grand-chose en codage VBA, et comme j’ai toujours vu les variables déclarés, je me disais que ça pouvait venir de là, c’est tout
Je ne m’inquiète pas mais tenais à préciser ma position sur le sujet
Ces propos sont les miens et exclusivement les miens
Je concois tout à fait que l’on puisse penser différemment
Il en reste pas moins que les déclarations ou non de variable n empêche en rien le fonctionnement du code qui suit peut-être à le rendre plus rapide mais cela reste à démontrer
Je vais très certainement faire hurler les puristes par tous ces propos mais il faut avoir le courage de ses opinions
Au plaisir d échanger avec toi
bonsoir FFO
j’ai essayer ton fichier, cela ne fonctionne pas
soit je tombe sur 18,2 ou soit il me donne aucun résultat alors que mes cotes dans C8,D8 et E8 existe
sur plusieurs essai il me change le chiffre que j’ai inscrit en C8
je déclare aussi presque jamais mes variables, sauf quand c’est nécessaire comme ici le s doit être un string, certainement pas un chiffre (integer).
Sub Recherche()
Dim s As String, sh, c, i, Lgne
If Range("C8") = "" Then
MsgBox ("Veuillez renseigner la cellules N° Forme avant d'exécuter ce traitement !!!")
Exit Sub
End If
Range("I8", "M8").Value = ""
With Sheets("Paramètres")
For i = 2 To .Range("B" & Rows.Count).End(xlUp).Row + 1 'boucle ces cellules
s = .Range("B" & i).Value
If Len(s) Then 'cellule non vide
On Error Resume Next
Set sh = Sheets(s) 'essayer à assigner feuille
On Error GoTo 0
If Not sh Is Nothing Then 'feuille existe
Set c = sh.Columns("I:I").Find(What:=Range("C8"), After:=sh.Range("I4"), LookIn:=xlValues, LookAt:=xlWhole) 'rechercher cellule
If Not c Is Nothing Then 'cellule trouvé
ligne = c.Row
Range("C8").Value = sh.Range("C" & ligne).Value
Range("I8").Value = sh.Range("I" & ligne).Value
Range("J8").Value = sh.Range("J" & ligne).Value
Range("K8").Value = sh.Name
Range("L8").Value = sh.Range("L" & ligne).Value
Range("M8").Value = sh.Range("M" & ligne).Value
b = True
Exit For
End If
End If
End If
Next
End With
If Not b Then MsgBox "erreur"
End Sub
bonsoir Cow18
j’ai les mêmes erreurs que FFO soit 18.2 ou aucun résultat
le but du fichier
c’est que si il y a une concordance en C8 chercher si il y en a une en D8 ainsi de suite
mais toujours dans la même ligne de l’onglet horizontaux
en sachant que E8,F8,G8 et H8 peuvent être vide
et si il y a concordance remplir en I8,J8,K8,L8 et M8
merci pour votre aide
bonjour, ce n’ai aucun idée comment vos données sont organisés, donc un essai, autrement voulez-vous montrer ce que vous voulez exactement ?
Sub Recherche()
Dim s As String, sh, c, i, Lgne
If Range("C8") = "" Then
MsgBox ("Veuillez renseigner la cellules N° Forme avant d'exécuter ce traitement !!!")
Exit Sub
End If
Range("I8", "M8").Value = ""
With Sheets("Paramètres")
For i = 2 To .Range("B" & Rows.Count).End(xlUp).Row + 1 'boucle ces cellules
s = .Range("B" & i).Value
If Len(s) Then 'cellule non vide
On Error Resume Next
Set sh = Sheets(s) 'essayer à assigner feuille
On Error GoTo 0
If Not sh Is Nothing Then 'feuille existe
Set c = sh.Columns("C:C").Find(What:=Range("C8"), After:=sh.Range("I4"), LookIn:=xlValues, LookAt:=xlWhole) 'rechercher cellule
If c Is Nothing Then Set c = sh.Columns("D:D").Find(What:=Range("D8"), After:=sh.Range("D4"), LookIn:=xlValues, LookAt:=xlWhole)
If c Is Nothing Then Set c = sh.Columns("E:E").Find(What:=Range("E8"), After:=sh.Range("E4"), LookIn:=xlValues, LookAt:=xlWhole)
If c Is Nothing Then Set c = sh.Columns("F:F").Find(What:=Range("F8"), After:=sh.Range("F4"), LookIn:=xlValues, LookAt:=xlWhole)
If c Is Nothing Then Set c = sh.Columns("G:G").Find(What:=Range("G8"), After:=sh.Range("G4"), LookIn:=xlValues, LookAt:=xlWhole)
If c Is Nothing Then Set c = sh.Columns("H:H").Find(What:=Range("H8"), After:=sh.Range("H4"), LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then 'cellule trouvé
ligne = c.Row
Range("C8").Value = sh.Range("C" & ligne).Value
Range("I8").Value = sh.Range("I" & ligne).Value
Range("J8").Value = sh.Range("J" & ligne).Value
Range("K8").Value = sh.Name
Range("L8").Value = sh.Range("L" & ligne).Value
Range("M8").Value = sh.Range("M" & ligne).Value
b = True
Exit For
End If
End If
End If
Next
End With
If Not b Then MsgBox "erreur"
End Sub
Bonjours
Il faudrait que tu me dise ce que tu cherches à realiser
Quelle donnée tu saisis dans quelle cellule pour obtenir quelles données de quel onglet source et cible
Etayes d’un exemple
La donnée saisie
L’action effectuée
Les données récupérées (de quelle source dans quelle cible)
Plus d’explications pour bien comprendre
Désolé pas très claire
Tu dis ceci :
« la recherche se fait dans les cellule de C8 à H8, le but est de chercher la correspondance dans l’onglet Horizontaux »
« si la valeur de C8 est bonne, rechercher la valeur en D8 et ainsi de suite jusqu’à H8 en sachant que de E à H cela peut etre vide »
une seule cellule à la fois ?
Sinon l’ordre des cellules de recherche : C8 puis D8 puis E8 puis F8 puis G8 et enfin H8 avec une ou plusieurs cellules dans cette ordre ou intégralité de celle-ci ?
La correspondance des colonnes pour chacune d’elle dans l’onglet de recherche « Horizontaux » ?
Dans ton exemple tu fais référence onglet « Horizontaux » aux données de la ligne 15 qui correspond au N° Forme 13 colonne « I »
Pourquoi ne pas rechercher ce N° Forme directement dans cette colonne qui te donnerai le même résultat ?
Testes ton fichier ci-joint avec la donnée 13 en cellule « I8 » qui correspond au N° Forme 13 et tu verras que le résultat souhaitait est obtenu
Merci pour ces précisions
Sub Recherche()
Dim s As String, sh, c, i, aJoindre, Ligne
If StrComp("Formulaire de recherche", ActiveSheet.Name, 1) <> 0 Then MsgBox "mauvaise feuille", vbCritical: Exit Sub
If Range("C8") = "" Then MsgBox "Veuillez renseigner la cellules N° Forme avant d'exécuter ce traitement !!!", vbCritical: Exit Sub
Range("I8:M8").ClearContents
With Sheets("Paramètres")
For i = 2 To .Range("B" & Rows.Count).End(xlUp).Row + 1 'boucle ces cellules
s = .Range("B" & i).Value
If Len(s) Then 'cellule non vide (nom de feuille)
On Error Resume Next
Set sh = Sheets(s) 'essayer à assigner feuille
On Error GoTo 0
If Not sh Is Nothing Then 'feuille existe
i = Application.Max(4, sh.UsedRange.Row + sh.UsedRange.Rows.Count + 1)
sh.Range("C4:H" & i).Name = "MyD"
aJoindre = Evaluate("offset(myd,,,,1) & ""|"" & offset(myd,,1,,1) & ""|"" & offset(myd,,2,,1) & ""|"" & offset(myd,,3,,1) & ""|"" & offset(myd,,4,,1) & ""|"" & offset(myd,,5,,1)")
'Debug.Print Replace(Join(Array([C8], [D8], [E8], [F8], [G8], [H8]), "|"), ",", ".")
Ligne = Application.Match(Replace(Join(Array([C8], [D8], [E8], [F8], [G8], [H8]), "|"), ",", "."), aJoindre, 0)
If IsNumeric(Ligne) Then 'ligne trouvé
Ligne = Ligne + Range("MyD").Row - 1 'ajouter le décalage
Range("I8").Resize(, 5).Value = sh.Range("I" & Ligne).Resize(, 5).Value 'coller ces données
b = True 'drapeau haut
Exit For
Else
Range("I8").Resize(, 5).Value = "???"
End If
End If
End If
Next
End With
If Not b Then MsgBox "erreur" 'sans drapeau = message
End Sub
En réalité les cellules cde C8 a H8 sont des côte réelle
Donc vers forme commune
Le but est de donner des côte dans chaque cellule et qu’on trouve la forme qui correspond
Donc si C8 est bonne chercher D8 mais sur la même ligne car on peut mettre qu’une seule forme
Donc toutes la ligne doit correspondre sinon si aucune correspond c’est qu’il n’existe pas de forme
Pas pû essayé ton fichier aujourd’hui je ne suis pas chez moi
Je fais un essai demain
Merci
J’ai modifié le code de la macro pour une autre approche
Saisis les données à rechercher dans les cellule « C8 » à « H8 » puis cliques sur le bouton « RECHERCHE »
Si les mêmes données saisies sont trouvée sur une des lignes de l’onglet « Horizontaux » colonnes « C » à « H » dans le même ordre les valeurs pour cette ligne des colonnes « I » à « M » de cet onglet sont intégrée en cellules « I8 » à « M8 »
Attention l’onglet de recherche « Horizontaux » est inscrit en dur dans ce nouveau code
Testes et dis moi
sans l’onglet « horizontaux » en dur
Sub Recherche()
Dim shP, sh
Sheets("Formulaire de recherche").Select
données = Join(Array("", Range("C8"), Range("D8"), Range("E8"), Range("F8"), Range("G8"), Range("H8"), ""), "/")
Range("I8:M8").ClearContents
Set shP = Sheets("paramètres")
For i = 2 To shP.Range("B" & Rows.Count).End(xlUp).Row
On Error Resume Next
Set sh = Sheets(CStr(shP.Range("B" & i).Value))
On Error GoTo 0
If Not sh Is Nothing Then
For j = 2 To sh.Range("C" & Rows.Count).End(xlUp).Row
If données = Join(Array("", sh.Range("C" & j).Value, sh.Range("D" & j).Value, sh.Range("E" & j).Value, sh.Range("F" & j).Value, sh.Range("G" & j).Value, sh.Range("H" & j).Value, ""), "/") Then
Range("I8").Resize(, 5).Value = sh.Range("I" & j).Resize(, 5).Value
b = True
Exit For
End If
Next
End If
If b Then Exit For
Next
If Not b Then MsgBox "problème"
End Sub
bonjour nickel ca fonctionne parfaitement
merci beaucoup
Bonjour
Super !!!
Merci pour ce retour
N’oublies pas de valider cette dernière proposition un plus sympathique
Au plaisir de t’aider à nouveau