Trouver les cellules contenant un mot [Résolu]

Messages postés
38
Date d'inscription
dimanche 13 octobre 2013
Statut
Membre
Dernière intervention
26 avril 2019
- - Dernière réponse : Pauyr
Messages postés
38
Date d'inscription
dimanche 13 octobre 2013
Statut
Membre
Dernière intervention
26 avril 2019
- 22 oct. 2013 à 11:25
Bonjour,

Je me permets de poster ici car après avoir recherché une solution à mon problème, je ne l'ai toujours pas trouvée.

Dans mon classer, j'ai une feuille (feuille1) contenant une base de données.
Cette base de données référence des opérations effectuées par des tiers.
Un tiers est identifié par un numéro unique.
Cette base de données est alimentée chaque mois, et donc de nouveaux tiers peuvent être ajoutés.

Pour traiter cette base de données, j'ai créé une autre feuille (feuille2)
Dans feuille2, j'ai commencé par créé une colonne référençant chaque numéro unique à partir des données de feuille1 :

Sub Copie_Numeros()

'Sélection de la feuille1 & copie des valeurs dans la feuille Contrôles
ActiveWorkbook.Worksheets("feuille1").Select
ActiveSheet.Range("L2:L" & Range("A" & Rows.Count).End(xlUp).Row).Copy Worksheets("feuille2").Range("A2")

'Suppression des doublons
ActiveWorkbook.Worksheets("feuille2").Select
ActiveSheet.Range("A2").RemoveDuplicates Columns:=1, Header:=xlNo

(Au passage, à quoi correspond Columns:=1 ? Je l'ai laissé parce que ça marchait mais j'aimerai comprendre ce que j'écris ou recopie !)

Je voudrais regrouper certaines valeurs associées à chaque ligne de feuille1 pour un même numéro ; ou alors tirer une valeur parmi plusieurs, etc. (par exemple, regrouper tous les montants des transactions effectuées par un certain numéro, ou bien extraire la date de la plus vieille/récente transaction, etc.)

Mon idée était de commencer par chercher toutes les lignes associées à un certain numéro (ou bien les cellules, puisque après je vais devoir prendre la valeur d'une certaine cellule de cette ligne) pour les traiter ensuite.

Seulement je n'arrive pas à me servir de la fonction (si c'en est une) find. Et je ne sais pas si elle peut me retourner une plage (Range) de cellules qui seront discontinues.

Ou alors peut-être existe-t-il un outil plus simple ?

J'espère avoir été clair et je vous remercie de l'aide que vous m'apportez,
Cordialement.
Afficher la suite 

9/29 réponses

Messages postés
38
Date d'inscription
dimanche 13 octobre 2013
Statut
Membre
Dernière intervention
26 avril 2019
0
Merci
J'ai formaté ma colonne date en dd/mm/yyyy mais je ne peux toujours pas me passer du petit bout de code dont je parlais pour que ça marche.

Je comprends que tu ne veuilles pas que cela devienne un apprentissage, pas de problème. J'espérais juste pouvoir comprendre certaines choses qui ne l'étaient pas et où Google ne m'aidait pas.

Il est probable que je brûle des étapes mais j'ai des impératifs et j'essaie donc de trouver un compromis entre compréhension totale et efficacité ; je conçois que ce n'est probablement pas le mieux pour apprendre mais je fais comme je peux.

Encore une fois, merci pour tes réponses.
Bonne continuation :)
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209 -
Relis-moi,
si tu veux pouvoir faire facilement des comparaisons sur date et heure, les deux (date et heure) sont à mettre dans une seule cellule.
Et la cellule ne doit pas être formatée en "dd/mm/yyyy", mais en ""dd/mm/yyyy hh:mm:ss;@ "
As-tu testé l'exemple que je t'ai montré ? Il est assez "parlant".
Commenter la réponse de Pauyr
Messages postés
38
Date d'inscription
dimanche 13 octobre 2013
Statut
Membre
Dernière intervention
26 avril 2019
0
Merci
En effet je n'avais pas compris que c'était plus simple de les regrouper en une cellule.
Je l'ai fait et, après avoir contourner le fait que VBA traite les dates en format US, j'arrive à obtenir correctement la mindate et maxdate.

Ça serait trop beau si tout marchait et maintenant le FindAll me retourne nothing quand je recherche le mindate dans la range des dates. J'ai vérifié avec des msgbox, la plage où je cherche correspond bien à une plage dans la colonne des dates et mon mindate est bien une valeur de cette plage. J'en perds mon latin.
Commenter la réponse de Pauyr
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
J'ignore comment est écrit et utilisé ton FindAll .
Je ne vois d'ailleurs pas pourquoi tu n'utilises pas toiut simplement soit la méthode Find, qui y est précisément assortie d'un exemple dans l'aide VBA, qui recherche plusieurs occurences (le Findnext, c'est çà !)
Je viens de faire des tests ===>>> aucun problème !

jordane45
Messages postés
25819
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 juin 2019
312 -
Salut Ucfoutu,
toiut simplement soit la méthode Find, qui y est précisément assortie d'un exemple dans l'aide VBA, qui recherche plusieurs occurences (le Findnext, c'est çà !)

C'est bien de cela qu'il s'agit..
Il utilise simplement une fonction qui le fait "tout" seul ^^


Function FindAll(ByVal sText As String, ByRef oSht As Worksheet, ByRef sRange As String, ByRef arMatches() As String) As Boolean
' --------------------------------------------------------------------------------------------------------------
' FindAll - To find all instances of the1 given string and return the row numbers.
' If there are not any matches the function will return false
' --------------------------------------------------------------------------------------------------------------
On Error GoTo Err_Trap
Dim rFnd As Range ' Range Object
Dim iArr As Integer ' Counter for Array
Dim rFirstAddress ' Address of the First Find
' -----------------
' Clear the Array
' -----------------
Erase arMatches
Set rFnd = oSht.Range(sRange).Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)

If Not rFnd Is Nothing Then
 rFirstAddress = rFnd.Address
 Do Until rFnd Is Nothing
 iArr = iArr + 1
 ReDim Preserve arMatches(iArr)
 arMatches(iArr) = rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligne
 Set rFnd = oSht.Range(sRange).FindNext(rFnd)
 If rFnd.Address = rFirstAddress Then Exit Do ' Do not allow wrapped search
 Loop
 FindAll = True
Else
 ' ----------------------
 ' No Value is Found
 ' ----------------------
 FindAll = False
End If
' -----------------------
' Error Handling
' -----------------------
Err_Trap:
If Err <> 0 Then
 MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
 Err.Clear
 FindAll = False
 Exit Function
End If
End Function
Commenter la réponse de ucfoutu
0
Merci
En effet je pense que le problème vient du fait que je ne sais pas précisément ce que fait le findall et que du coup y'a peut-être un couac là-dedans.

J'ai contourné le problème en faisant une recherche "manuelle" dans ma range, du type :

For Each c In cell
                    If c.Value = mindate Then
                        Set cell2 = c
                        Exit For
                    End If
                Next c


J'imagine que c'est un peu ce que fait find, j'essayerai après manger.
Commenter la réponse de Pauyr
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Houla !
J'étais TRES LOIN de me douter que la présente discussion allait être l'occasion de mettre à jour un comportement mystérieux de VBA !
C'est pourtant le cas ...
Je suis en train de réfléchir à la manière de mettre en exergue ce "mystère" sans trop "perdre" les diverses pensées.
Lorsque j'aurai terminé d'y réfléchir et arrêté la meilleure manière de démontrer, je crois que je vais ouvrir une discussion à part entière à ce sujet. Je dis tout de suite qu'elle ne fera pas honneur à MicroSoft.
Je ne reviendrai qu'ensuite sur la présente discussion, en expliquant que :
- dans un tel cas, l'utilisation de la méthode Find est possible (je l'ai fait), mais déconcertante et assez dangereuse car la moindre erreur dans le code ne permettrait plus jamais de "revenir en arrière" !!!! (vous en verrez une démonstration étonnante dans la discussion ad-hoc que je créerai à ce propos !)
Un indice (et en aucun cas une explication) : l'utilisation de xlValues est la cause de dégâts inattendus !
- qu'il vaut mieux dans de telles conditions y aller de bon coeur avec d'autres méthodes (j'en proposerai alors au moins deux).

A Pauyr, maintenant : si tu as, dans ton projet, déjà utilisé pour ce Find la constante xlValues, tu es maintenant totalement coincé et (quoique tu fasses) ne pourras plus corriger. Find ne trouvera plus rien parmi tes dates. Et ceci : que tu utilises FindAll de jhordane ou directement Find (même punition pour le même motif)
Je te rassure : tu n'y es pour rien, pas plus que Jordane ou moi-même, le seul responsable de cette énormité étant ... MicroTruc ...
Commenter la réponse de ucfoutu
Messages postés
25819
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 juin 2019
312
0
Merci
Concernant la recherche de Dates, je vous invite à lire ceci :
Excel Find Method to Search for a Date

et un autre petit article qui peut aussi vous interesser :
Pourquoi utiliser XlFormulas ou XlValues ?
Commenter la réponse de jordane45
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
Commenter la réponse de ucfoutu
0
Merci
Houla !
J'étais TRES LOIN de me douter que la présente discussion allait être l'occasion de mettre à jour un comportement mystérieux de VBA !
C'est pourtant le cas ...


Je sais pas pourquoi mais j'en ressens une certaine fierté. J'ai gagné un bon pour deux questions idiotes du coup ? Un apprentissage de 30 mn ?

Blague à part, l'utilisation de xlvalues dont tu parles ça concerne un des arguments optionnel de findall ? Je ne m'en sers pas il me semble ..

Les autres méthodes dont tu parles, ça peut être ma méthode "à la main" ? Moi tant que ça marche pour le moment, même si c'est pas forcément le plus efficient ...

Merci pour tes liens Jordane.
Commenter la réponse de Pauyr
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Je viens de trouver une parade tortueuse mais efficace, que j'ai exposée là :
http://codes-sources.commentcamarche.net/forum/affich-10009256-anomalie-de-fonctionnement-de-la-methode-find-de-vba-excel#p10009283
A toi d'en profiter.
Pauyr
Messages postés
38
Date d'inscription
dimanche 13 octobre 2013
Statut
Membre
Dernière intervention
26 avril 2019
-
Merci pour ces investigations poussées !
Commenter la réponse de ucfoutu