utilisation de Find dans une fonction perso
Bonjour, tout le monde.
J’essaye de me construire en VBA Excel (2010) une fonction personnalisée qui me permette de découvrir s’il existe dans une feuille de mon fichier autre que la courante, une ligne contenant deux ou trois cellules identiques à celles que j’indique en argument.
C’est tordu, comme explication, je vais faire un exemple. Liste de mouvements bancaire dans la feuille ‘2012’! Dans la feuille courante, par contre, liste de mouvement provenant d’autre source, et contenant peut-être des différences avec l’autre liste. Champs occupés : 4 (date, description, montant débit, montant crédit) ; dans une colonne un peu plus loin, je mets ma fonction, qui a une syntaxe du genre =MaCompDB(feuille; cellule1; cellule2; cellule3). La feuille que j’indique dans la fonction est celle dans laquelle il faut chercher le « doublon », tandis que les cellules sont celles de la feuille courante, dont je cherche les valeurs.
En d’autres termes:
col A B C D E
ligne
…
5 5/6/2012 chèque untel 123,00 = MaCompDB (‘2012!’;A5;B5;C5)
La fonction doit répondre à la question : combien de cellules trouves-tu dans l’autre feuille et sur une même ligne, contenant les mêmes valeurs que les cellules que je t’indique ?
Or, depuis que j’ai découvert que la commande Find restitue une adresse, c’est tout un monde qui s’est ouvert à moi ! Du coup, je peux en extraire un numéro de ligne et de colonne…
J'ai beaucoup cherché dans les forums. Parmi les différentes sources, celle-ci me semble excellente : www.cpearson.com/excel/rangefind.htm. Dommage que je comprenne si peu l’anglais !
Code:
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 26
| Function MaCompDB (Fgl As Worksheet, cella1 As Range, cella2 As Range, Optional cella3 As Range)
MaCompDB = 0
Dim risp As Range, c1 As String
c1 = cella1.Column 'résulte sous forme de numéro
v1 = cella1.Value
c2 = cella2.Column
v2 = cella2.Value
If Not cella3 Is Nothing Then
c3 = cella3.Column
v3 = cella3.Value
End If
With Fgl.UsedRange
Set risp = .Find(v1, LookIn:=xlValues) 'Comment limiter cette recherche à la colonne indiquée dans la variable c1 ?
Fadd = risp.Address
If Not risp Is Nothing Then
r = risp.Row
MaCompDB = MaCompDB + 1
Else
Exit Function
End If
If Cells(r, c2).Value = v2 Then MaCompDB = MaCompDB + 1
If Not cella3 Is Nothing Then
If Cells(r, c3).Value = v3 Then MioConfrDB = MioConfrDB + 1
End If
End With
End Function |
Bien évidemment, ça ne marche pas! (Pendant l'écriture de la fonction dans la cellule, il me dit que la syntaxe n'est pas bonne, comme si j'oubliais une parenthèse).
Quelqu’un peut m’aider ?
Merci, à bientôt !