VBA : fonction de recherche dans une variable tableau

dionys0s

XLDnaute Impliqué
Bonjour le forum :cool:

je sollicite votre aide une fois de plus.

Je travaille sur des tableaux de grande dimension, et désordonnés. Pour les "relire", j'ai un code qui sélectionne des lignes du tableau initial, en fonction de critères, et qui les reverse à un endroit. A cet endroit, j'ai un nouveau tableau désordonné que je réordonne pour pouvoir faire des relecture et corrections plus rapidement et efficacement.

Après relecture/corrections, je reverse les corrections dans le tableau initial. Pour le moment, j'utilise la fonction .Find pour le faire (repérer la bonne ligne dans laquelle verser les corrections), mais lorsque le volume de données est important, la macro rame. Du coup je souhaite fonctionner avec des variables tableau. J'ai bien pensé à faire des parcours successifs de mes variables tableaux, mais le gain de temps est non observable à ce stade.

Ma question est la suivante : existe-t-il une fonction analogue à .Find, mais qui pourrait s'exécuter dans ma variable tableau ?

D'avance merci pour votre aide ^_^
 

Pièces jointes

  • RechercherDansTablo.xlsm
    63.8 KB · Affichages: 67

VDAVID

XLDnaute Impliqué
Re : VBA : fonction de recherche dans une variable tableau

Bonjour dionys0s,

Peut-être comme ceci, je ne suis pas sûr d'avoir tout compris:

Code:
Sub TestTabl()

    Dim tablIni(), TablDest()
    Dim maPlageIni As Range, maPlageDest As Range
    Dim i As Long, k As Long, h As Long
    Dim Ws As Worksheet
    Dim Flag1 As Boolean
        
        Set Ws = Sheets("Feuil1")
    
        Set maPlageIni = Ws.Range("K4:M23")
        
        k = 1
        tablIni = maPlageIni.Value
        ReDim TablDest(UBound(tablIni()), 3)
        
        For i = UBound(tablIni()) To LBound(tablIni()) Step -1
        
            If tablIni(i, 3) <> "" Then
                
                TablDest(k, 1) = tablIni(i, 1)
                TablDest(k, 2) = tablIni(i, 2)
                TablDest(k, 3) = tablIni(i, 3)
                k = k + 1
                
            End If
            
        Next i
        Set maPlageDest = Ws.Range("A4:C" & UBound(TablDest()))
        maPlageDest.Value = TablDest
        
End Sub

PS: Il faut être en option base 1 comme dans ton fichier
Bonne journée !
 

dionys0s

XLDnaute Impliqué
Re : VBA : fonction de recherche dans une variable tableau

Bonjour VDAVID

merci pour ta proposition, mais je me demandais plutôt s'il existait une fonction native assimilable à .Find (du genre .Find(LeTabloVar,LaDimension,LaValeur) et qui renverrait l'index dans la dimension concernée).
J'ai déjà mis en place ce type de boucle qui fonctionne très bien mais je voulais optimiser le temps de calcul et ne pas parcourir toutes les lignes du tableau à chaque fois pour chaque titre etc...
 

dionys0s

XLDnaute Impliqué
Re : VBA : fonction de recherche dans une variable tableau

Bonjour Pierrot, bonjour Tirou

@Pierrot : je n'arrive pas à utiliser match. Est-ce parce que j'ai un tableau variant en 2D déclaré à partir dans .Range ?

@Tirou : effectivement je n'ai pas de doublon. Ceci dit je ne comprends pas (ne maîtrise pas) ce que tu proposes. Pourrais-tu préciser s'il te plait ? Merci d'avance :)
 

dionys0s

XLDnaute Impliqué
Re : VBA : fonction de recherche dans une variable tableau

Re,
j'ai du mal à m'exprimer clairement il semblerait. Je pensais que mon bout de code dans le fichier exemple serait plus clair :confused:

Mes variables tableaux sont dimensionnées en Variant et établies à partir d'un .Range, donc directement en 2 dimensions.
Je dois faire ma recherche uniquement dans la première colonne du tableau initial (c'est à dire dans la dimension 1 de la variable tableau non ?). Donc je suppose que si je ne précise pas la dimension à mon équivalent .Find ça ne peut pas fonctionner non ?
 

Pierrot93

XLDnaute Barbatruc
Re : VBA : fonction de recherche dans une variable tableau

Re,

bah... fonctionne si ton tableau est bien dimensionné....
Code:
Option Explicit
Sub test()
Dim t As Variant, v As String, x As Variant
t = ActiveSheet.Range("A4:A12")
v = "zzz"
x = Application.Match(v, t, 0)
If IsError(x) Then MsgBox "Non Trouvé..." Else MsgBox x
End Sub
 

Tirou

XLDnaute Occasionnel
Re : VBA : fonction de recherche dans une variable tableau

De mémoire pour préciser la dimension de recherche, il faut passer par un truc qui ressemble à Application.index(tableau, [num1erDim], [num2emDim]) mais d'autres sauront mieux te dire.

Pour le dictionnaire index, je te renvois à Formation Excel VBA JB qui l'expliquera mieux que moi. Je n'arrive pas à faire le lien direct à la bonne page, donc vas dans dictionnaire, puis tu arrives à destination par un CTRL-F(Index)
Le principe est de de rajouter à ton dictionnaire toutes les en-têtes de tes colonnes (ou lignes) et d'y associer le numéro de colonne (ou ligne) correspondant. Ainsi, tu peux naviguer rapidement dans ton tableau sans nécessiter la moindre boucle

exemple :
ValeurCherchée = Tableau(monDico(EntêteLigne), monDico2(enTêteColone))

En bref, surtout bien si tu as des données croisées.
 

dionys0s

XLDnaute Impliqué
Re : VBA : fonction de recherche dans une variable tableau

Re,

@Pierrot. Mon problème vient du fait que mon tableau a plusieurs colonnes.
Ce code-ci me renvoit le bon index :
VB:
Sub test()

    Dim t As Variant, v As String, x As Variant

    t = ActiveSheet.Range("K4:K23")

    v = "TITRE 14"

    x = Application.Match(v, t, 0)

    If IsError(x) Then MsgBox "Non Trouvé..." Else MsgBox x

End Sub

Celui-ci me renvoit "Non trouvé"

VB:
Sub test()

    Dim t As Variant, v As String, x As Variant

    t = ActiveSheet.Range("K4:L23")

    v = "TITRE 14"

    x = Application.Match(v, t, 0)

    If IsError(x) Then MsgBox "Non Trouvé..." Else MsgBox x

End Sub

@Tirou : Merci, je vais aller regarder de ce côté-ci aussi.
 

Pierrot93

XLDnaute Barbatruc
Re : VBA : fonction de recherche dans une variable tableau

Re,

bah... tu disais :
Code:
Je dois faire ma recherche uniquement dans la première colonne du tableau initial
préférable de dimensionner le tableau en conséquence, non ??
 

dionys0s

XLDnaute Impliqué
Re : VBA : fonction de recherche dans une variable tableau

Re,

@Pierrot : je ne pense pas, dans la mesure où le résultat de la recherche (l'index trouvé dans le tableau initial) va me permettre de modifier une valeur dans le tableau en question, mais sur la colonne 2.

@Tirou : j'ai trouvé ce qui a l'air d'être une réponse assez puissante à problème (ctrl+F "Recherche rapide dans une colonne d'un tableau 2D" pour l'avoir) mais à l'exécution du code, j'ai un plantage et le message d'erreur "un composant activeX ne peut pas créer d'object". Un rapport avec le fait de travailler sous Excel MAC 2011 ?
 

Pierrot93

XLDnaute Barbatruc
Re : VBA : fonction de recherche dans une variable tableau

Re,

regarde peut être ceci alors :
Code:
Option Explicit
Sub test()
Dim t As Variant, v As String, x As Variant
t = ActiveSheet.Range("A4:C12")
v = "zzz"
With Application
    x = .Match("zzz", .Index(t, , 1), 0)
    If Not IsError(x) Then MsgBox x
End With
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 316
Messages
2 087 173
Membres
103 490
dernier inscrit
zatougraf