Récupération de la localisation d'une cellule dans *.xls

Signaler
Messages postés
6
Date d'inscription
jeudi 3 mai 2007
Statut
Membre
Dernière intervention
10 décembre 2007
-
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
-
bonjour,
je débute et suis entrain de faire une petite macro vba (excel) qui permet de lire des mots sur un onglet
- voir dans la colonne d'un autre onglet si ce mot est présent ou non
- et sur une nouvelle feuille, juste mettre si oui ou non ce mot est présent


j'aimerais aussi récupérer la 'localisation' de la/des cellule/s (genre
'A1', 'E15') mais je ne sais pas comment récupérer cette localisation
avec 'Activecell'


si qqun voit comment faire, merci !! du coup de pouce/tuyau

tennen    

10 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
Est ce que ActiveCell.Address ne te conviendrait pas?

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Pour ton premier point, tu n'as absolument pas besoin de faire une macro.
Tu trouveras ton bonheur dans les formules Excel, et plus précisément avec RECHERCHEV pour une colonne.

Pour récupérer les coordonnées de la cellule, il faut utiliser la propriété .address :
ActiveCell.address et tu as des options pour le style d'adresse remontée, soit au format R1C1, soit $A$1
Mais tu peux avoir aussi ces infos avec la formule CELLULE.
Cela dépend donc de tes besoins.

Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Non mais oh, c'est pas bientôt fini oui !
Messages postés
6
Date d'inscription
jeudi 3 mai 2007
Statut
Membre
Dernière intervention
10 décembre 2007

merci Julien et Molenn, oui, avec ActiveCell.Address je n'obtiens malheureusement pas la ligne je ne sais pas pourquoi :
ça m'affiche $K$1 (la recherche se fait sur la colonne K) alors que le mot ou +tot le nom se trouve en $K$879 (du moins la première fois, étant donné qu'il apparait 14* dans la colonne .. )

Sinon, il ya environ 12 000 enregistrements, d'où la macro ..

tennen
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Le nb d'enregistrements n'est absolument pas gênant pour ce que tu veux faire :

Feuille 1, colonne K : ta liste de 12000 mots.
Feuille 2, colonne A : une liste de mot que tu veux chercher dans ta colonne K, Feuille 1.

Ta macro va lire chaque mot de la colonne A pour savoir s'il existe dans K.
Et bien, il te suffit de coller dans la colonne B de la feuille 2 la formule suivante :
SI(ESTERREUR(RECHERCHEV(A1;Feuille1!K:K;1;FAUX))VRAI;"Non";"Oui")
Plus qu'à copier la formule en face de tous les mots de ta colonne A et tu sauras s'ils se trouvent dans la colonne K. Et ce, en temps réel en plus !

Sinon, il est normal que ton ActiveCell.adress te remonte $K$1 puisque lorsque tu fais ton .find, tu sélectionnes d'abord une colonne. C'est la colonne l'active Cell, et comme ta sélection est la colonne et non une plage dans la colonne (genre K1:K12000), il te donne les coordonnées de la toute première cellule.
Il ne faut pas chercher l'address de l'activeCell, mais celle de ta recherche (en fait, le .find n'active pas la cellule à proprement parler dans ta macro).

Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Tiens, et si tu veux la localisation du mot dans la colonne K, pas besoin de macro ni de .address, tu peux utiliser la ofrmule EQUIV.
On reste dans mon exemple au dessus.
Feuille 2, colonne C, tu mets la formule suivante :
=EQUIV(A1;Feuille1!K:K)
Tu copies partout et hop, tu as l'adresse (forcément la colonne K, et tu as le numéro de la ligne).
Si tu as plusieurs itération dans ta colonne, tu rajoutes un critère :
EQUIV(A1;Feuil2!C:C;0) ou EQUIV(A1;Feuil2!C:C;1)
Le 0 te donne la ligne du premier mot rencontré et le 1 la position du dernier mot dans la colonne.

Molenn
Messages postés
6
Date d'inscription
jeudi 3 mai 2007
Statut
Membre
Dernière intervention
10 décembre 2007

merci molenn,
ça déconne un peu de mon côté (avec recherchev et equiv aussi .., je ne récupère pas les valeurs souhaitées, mais je vais me tenter de me débrouiller avec  (je dois bien y arriver à un moment donné non?)
bonne aprèm
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Etonnant, pour EQUIV, attention, ça remonte la position relative dans la matrice. Ca te donne bien le numéro de ligne quand ta matrice est la colonne parce que dans ce cas, la première ligne porte bien le n°1.
C'est à adapter mais avec les formules, je ne vois pas où peuvent se situer les problèmes.

Donne juste un exemple, par ex. les 5 premières lignes de ta feuille 1 et les formules que tu as écrites sur la feuille 2 et on corrigera ce qui pose pb.

Molenn
Messages postés
6
Date d'inscription
jeudi 3 mai 2007
Statut
Membre
Dernière intervention
10 décembre 2007

bon, pardon

en fait, le mot que je cherche dans une autre colonne sur une autre feuille

n'occupe pas toute la cellule mais se trouve dans une chaîne de caractère dans une cellule .. est ce que ça pose problème pour recherchev et rechercheh? et equiv?

et de plus, comme j'ai commencé avec cette macro, j'aimerais essayer de continuer avec, donc ..
après .find,
comment faire pour sélectionner cette cellule?

voilà, bon
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut,

j'ai un snippet tout fait :

Public Function FindWord(ByVal sWord As String, Optional vPlage As Variant, Optional wSheet As Variant = "ActiveSheet") As String()
        Dim bVerifPlage As Boolean, rStartCell As Range
    If Not wSheet = "ActiveSheet" Then Sheets(wSheet).Select
        'vérification de la feuille à traiter
    If Not IsMissing(vPlage) Then bVerifPlage = True
        'vérification d'une possible plage
       
        Dim cMyAddress      As New Collection
        Dim sRes()          As String
        Dim ParseRange()    As String
    
    If bVerifPlage = False Then
        ' s'il n'y pas de plage, on vérifie dans toute la feuille
        Cells.Find(What:=sWord, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
            , SearchFormat:=False).Activate: cMyAddress.Add ActiveCell.Address
        Set rStartCell = ActiveCell
        Do
            Cells.FindNext(After:=ActiveCell).Activate: cMyAddress.Add ActiveCell.Address
        Loop While ActiveCell.Address <> Range(rStartCell).Address
        
        ' on place l'adresse des cellules dans un tableau de données
        ' il sera facile de savoir après quelles cellules contiennent
        ' les données recherchées. (où même sélectionner ces cellules)
            ReDim sRes(cMyAddress.Count - 1)
        For i = 0 To cMyAddress.Count - 1
            sRes(i) = cMyAddress.Item(i + 1)
        Next i
    Else
        ' s'il y pas une plage, on vérifie seulement dedans
            Dim rPlage As Range
        Set rPlage = vPlage
        ' on instancie l'objet (plage) en récupérant sa valeur
        ParseRange = Split(CStr(rPlage.Address), ":")
        ' ici je récupère la dernière cellule de recherche, afin de la sélectionner
        ' comme ça, le résultat sera chronologique (sinon, la recherche s'effectue
        ' depuis la cellule sélectionnée)
        Range(ParseRange(1)).Select
        
        rPlage.Find(What:=sWord, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
            , SearchFormat:=False).Activate: cMyAddress.Add ActiveCell.Address
        Set rStartCell = ActiveCell
        Do
            rPlage.FindNext(After:=ActiveCell).Activate: cMyAddress.Add ActiveCell.Address
        Loop While ActiveCell.Address <> Range(rStartCell.Address).Address
        
        ' on place l'adresse des cellules dans un tableau de données
        ' il sera facile de savoir après quelles cellules contiennent
        ' les données recherchées. (où même sélectionner ces cellules)
            ReDim sRes(cMyAddress.Count - 2)
        For i = 0 To cMyAddress.Count - 2
            sRes(i) = cMyAddress.Item(i + 1)
        Next i
    End If
    FindWord = sRes: Set cMyAddress = Nothing: Erase sRes
End Function

Sub Exemple_Utilisation()
    Dim sResult() As String, l As Integer
    
    sResult = FindWord("bonjour", Range("C23:Z114"), "Feuil3")
    '  autres exemples d'utilisation
    'sResult = FindWord("abc", Range("A1:B20"))
    'sResult = FindWord(UserForm1.ComboBox1.Text, Range("A1:B20"))
    
    For l = 0 To UBound(sResult)
        Debug.Print "-" & sResult(l) & "-"
    Next l
    Erase sResult
End Sub

~ <small> Mortalino ~ Colorisation automatique </small>

@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~