[VBA] Recherche "xlPart" dans un tableau virtuel

Bonjour,

J'ai ajouté le pseudonyme d'h2so4 car il est à l'origine du code sur lequel je travaille ces temps-ci.

Ce code consiste à comparer des tableaux virtuels pour récupérer les informations qui m'intéressent de manière très rapide ; la comparaison se fait sur les valeurs strictement identiques.

Est-il possible de réaliser une comparaison sur des valeurs proches ?

En l'occurrence, j'ai essai de comparer des données dans lesquelles il est renseigné l'année avec des données pour lesquelles l'année n'est pas renseignée. Mais ce sont exactement les mêmes.

Le code en question se présente comme ça :

Public Sub maj_bsfl_2()
Dim i&, lrbf&, lcbf&, lrtx&, ns As Byte, nv As Byte, et As Byte, cib As Byte, cib1 As Byte, cho As Byte, a&, tablo(), dict As Object, tablo1, tablo2, tablo3

    Set dict = CreateObject("scripting.dictionary")

    With Sheets("TAXREF")
        lrtx = .UsedRange.SpecialCells(xlCellTypeLastCell).Row
        cib = .Range("1:1").Find("NOM_VALIDE", LookIn:=xlValues, Lookat:=xlWhole).Column
        cib1 = .Range("1:1").Find("NOM_COMPLET", LookIn:=xlValues, Lookat:=xlWhole).Column
        tablo1 = .Range(.Cells(2, cib1), .Cells(lrtx, cib1))
        tablo2 = .Range(.Cells(2, cib), .Cells(lrtx, cib))
        For i = LBound(tablo1) To UBound(tablo1)
            dict(tablo1(i, 1)) = tablo2(i, 1)
        Next i
    End With

    With Sheets("baseflor_maj_2020_04_18")
        lrbf = .UsedRange.SpecialCells(xlCellTypeLastCell).Row
        lcbf = .UsedRange.Columns.Count
        cho = .Range("1:1").Find("CHOROLOGIE", LookIn:=xlValues, Lookat:=xlWhole).Column
        .Columns(cho).Insert
        .Columns(cho).Insert
        .Cells(1, cho) = "NOM_VALIDE_TAXREF" 'Utilisation de la variable "cho" qui est = à (cho -2) après insertion colonnes
        .Cells(1, cho + 1) = "Erreur_TAXREF"

        ns = .Range("1:1").Find("NOM_SCIENTIFIQUE", LookIn:=xlValues, Lookat:=xlWhole).Column
        nv = .Range("1:1").Find("NOM_VALIDE_TAXREF", LookIn:=xlValues, Lookat:=xlWhole).Column
        et = .Range("1:1").Find("Erreur_TAXREF", LookIn:=xlValues, Lookat:=xlWhole).Column

        ReDim tablo(1 To lrbf - 1, 1 To 1)
        tablo3 = .Range(.Cells(2, ns), .Cells(lrbf, ns))

    For a = 1 To UBound(tablo3)
        If dict.exists(tablo3(a, 1)) Then
            tablo(a, 1) = dict(tablo3(a, 1))
        Else
            tablo(a, 1) = "-" ' tablo3(a, 1)
            .Cells(a + 1, et) = "Erreur"
        End If
    Next a
    .Cells(2, nv).Resize(lrbf - 1, 1) = tablo
    End With
End Sub

Je joins un document, mais je doute qu'il soit utile, pour réaliser les tests il faudrait les BDD complètes, qui sont un peu trop lourdes...

Je peux faire un document complet joint via cjoin si besoin !

A plus tard !

Bonsoir,

sur base des données que tu as fournies, il me semble que si tu utilises la colonne LB_NOM_VALIDE au lieu de NOM_VALIDE pour TAXREF et LB_NOM_SCIENTIFIQUE au lieu de NOM_SCIENTIFIQUE pour baseflor, tu as résolu le problème non ?

Bonsoir,

Je commence à être fatigué...

C'est effectivement le cas, j'avais modifié les colonnes pour éviter certaines erreurs au départ, mais là c'est exactement ce qu'il me fallait.

Merci pour votre aide !

Je vais probablement avoir une troisième question sur cette macro prochainement, car je ne trouve rien qu'il puisse y répondre pour le moment.

Bonne fin de journée !

Bonjour,

Pour effectuer des comparaisons rapides sur des valeurs exactes , il y a dictionary

Pour des valeurs approximatives (contenu dans) , je ne connais que Filter(Table,mot) si la table une seule dimension.

Je l'utilise pour des recherches multi-mots du type ET/OU

Option Compare Text
Dim f, Choix()
Private Sub UserForm_Initialize()
   Set f = Sheets("bd")
   Choix = Application.Transpose(f.Range("a2:a" & f.[A65000].End(xlUp).Row))
   Me.ListBox1.List = Choix
End Sub

Private Sub TextBox1_Change()
   Set d1 = CreateObject("scripting.dictionary")
   mots = Split(Trim(Me.TextBox1), ",")
   For Each m In mots
     mots2 = Split(Trim(m), " ")
     tbl = Choix
     For i = LBound(mots2) To UBound(mots2)
       tbl = Filter(tbl, mots2(i), True, vbTextCompare)
     Next i
     For i = LBound(tbl) To UBound(tbl): d1(tbl(i)) = "": Next i
   Next m
   If d1.Count > 0 Then Me.ListBox1.List = d1.keys
   Me.ListBox1.ListIndex = -1
End Sub

Boisgontier

Rechercher des sujets similaires à "vba recherche xlpart tableau virtuel"