Les Snippets

Connexion

Rechercher les adresses des cellules (excel) contenant un mot clé

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 18/10/2006 02:53:51 et initié par mortalino [Liste]
Vue : 11412
Catégorie(s) : Trucs & Astuces, Chaîne de caractères
Langages dispo pour ce code :
- VBA
- VB6



Langage : VBA
Date ajout : 30/10/2006
Posté par mortalino [Liste]

Public Function FindWord(ByVal sWord As StringOptional vPlage As VariantOptional 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 = NothingErase 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

Remarque :
Ce snippet remplace l'autre :
* prise en compte d'une plage de recherche (et non toute la feuille)
* Le résultat n'est plus aléatoire ; Find recherche à partir de la cellule sélectionnée, maintenant, la 1ere cellule (donc de la plage de recherche) se sélectionne pour éviter ce problème
Langage : VB6
Date ajout : 01/11/2006
Posté par mortalino [Liste]
' *** Référence : Microsoft Excel 11.0 Object Library (ou équivalent)
Public Function FindWord(ByVal sWord As String, ByVal sPathAndFileName As String, ByVal sSheet As String, Optional vPlage As Variant) As String()
        Dim bVerifPlage As Boolean, bFileNotRunning As Boolean
        Dim rStartCell As Range, rPlage As Range
        Dim xlApp As Excel.Application, xlBook As Object, xlSheet As Worksheet
        
    On Error Resume Next
        
    xlBook = GetObject(sPathAndFileName, "Excel.Aplication")
    If Err.Number <> 0 Then
        Err.Clear: bFileNotRunning = True
        Set xlApp = CreateObject("Excel.Application")
        xlApp.Visible = True
        Set xlBook = xlApp.Workbooks.Open(sPathAndFileName)
    Else
        Set xlApp = GetObject(, "Excel.Application")
    End If
    On Error GoTo 0
    
    xlBook.Sheets(sSheet).Select
    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
        xlApp.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
            xlApp.Cells.FindNext(After:=ActiveCell).Activate: cMyAddress.Add ActiveCell.Address
        Loop While ActiveCell.Address <> xlApp.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 - 1)
        For i = 0 To cMyAddress.Count - 1
            sRes(i) = cMyAddress.Item(i + 1)
        Next i
    Else
        ' s'il y une plage, on vérifie seulement dedans
        Set rPlage = Range(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)
        xlApp.Range(ParseRange(1)).Select
        
        xlApp.Range(vPlage).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
            xlApp.Range(vPlage).FindNext(After:=ActiveCell).Activate: cMyAddress.Add xlApp.ActiveCell.Address
        Loop While ActiveCell.Address <> xlApp.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
    If bFileNotRunning Then xlBook.Close False: xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    FindWord = sRes: Set cMyAddress = Nothing: Erase sRes
End Function


Private Sub Exemple_Utilisation()
    Dim sResult() As String, sFile As String, l As Integer
    
    sFile = "C:\Documents and settings\Mortalino\Bureau\Nouveau.xls"
    sResult = FindWord("bonjour", sFile, "Feuil1", "A1:B50")
    '         *** autres exemples d'utilisation *** :
    'sResult = FindWord("abc", sFile, "Feuil2", Range("A1:B20"))
    'sResult = FindWord(UserForm1.ComboBox1.Text, sFile, "Ma Feuille")
    
    For l = 0 To UBound(sResult)
        Debug.Print "-" & sResult(l) & "-"
    Next l
    Erase sResult
End Sub

Snippets en rapport avec : Find, Findnext, Cherche, Mot, Clé



Codes sources en rapport avec : Find, Findnext, Cherche, Mot, Clé

{ASP / ASP.NET} HIGHLIGHTING DE MOTS CLÉS TROUVÉS DANS UN TEXTE
Ce code permet de créer un paragraphe à partir d'une recherche de mots clés dans un texte. Le parag...

{ColdFusion} PETIT MOTEUR DE RECHERCHE PAR MOT(S) CLÉ(S)
Voici un petit code source sympa. Il vérifie l'existence de mot(s) clé(s) que vous aurez saisi da...

{PHP} GÉNÉRER UNE CHAÎNE ALÉATOIRE SANS BOUCLE NI CRYPTAGE (MD5 OU AUTRE)
Jusqu'à présent tous les générateurs de clé que j'ai trouvé utilisait une boucle ou les fonction sha...

{Delphi} BASE DE DONNÉE WIKI
Cette source permet de traiter le fichier xml de wiktionary d'environ 500Mo pour en faire un fichier...

{C / C++ / C++.NET} DLL EXPORT FINDER
Cherche dans quelle Dll est exportée une fonction / API (utile si vous ne vous souvenez plus de que...

{Delphi} DICO ET AIDE MOTS CROISÉE
Cette source sert d'abord de dictionnaire en utilisant la base de donnée libre du Wiktionary Elle s...

{Visual Basic, VB6, VB.NET, VB 2005} VBTEXTFINDER : UN MOTEUR DE RECHERCHE DE MOT DANS SON CONTEXTE EN VBA, VB6 ET VB9
VBTextFinder permet de retrouver l'ensemble des phrases (et paragraphes) contenant un mot donné que ...

{Visual Basic, VB6, VB.NET, VB 2005} OUVRIR LE REGISTRE EN DÉFFINISSANT LA CLÉ DE SON CHOIX.
Sous Windows XP, lorsque vous exécutez « RegEdit.exe » pour accéder à la base de registres, celui-ci...

{IRC} MÉLANGEUR DE MOT
C'est une fonction que j'utilise pour un plus gros projet (d'où les noms des var %devinette* vous ét...

{Delphi} FONCTIONS REXX
Ceci est une unité implémentant des fonctions à l'image de ce qui peut être fait en REXX. Elle co...