XL 2010 optimisation recherche vba

kan3pz

XLDnaute Occasionnel
Bonjour à tous,
je viens de me créer une macro pour récupérer l'entête de mes colonnes sur chaque ligne si l'on trouve la concaténation d'un code et de cette en-tête dans une base.
Le problème c'est que cette base est en réalité très lourde (300K lignes) du coup l'exécution de ma macro est vraiment très long, je pense qu'il serait possible de l'optimiser mais je ne vois pas comment...
Par formule c'est un simple RECHERCHEV...

Voici mon code et je vous joins un fichier :

Code:
Sub Cherche()

Dim Classe As Range, Produit As Range

    Worksheets("Feuil1").Activate
    tablo = Range("A1:BT" & Range("A" & Rows.Count).End(xlUp).Row)

    Set Produit = Worksheets("Base").Range("G:G")


    For n = 2 To UBound(tablo, 1)
        For m = 55 To UBound(tablo, 2)
            Set Classe = Produit.Cells.Find(what:=Cells(n, 1) & "_A_" & Cells(1, m), LookAt:=xlWhole)
           
            If Not Classe Is Nothing Then
                Cells(n, m) = Cells(1, m)
            End If
           
        Next
    Next
End Sub

Merci d'avance !
 

Pièces jointes

  • recherche.xlsm
    17.3 KB · Affichages: 47

Bebere

XLDnaute Barbatruc
bonsoir
kan code à tester

Code:
Sub Cherche()
    Dim tablo, Produit, i As Long, n As Long, m As Long, g, d

    Worksheets("Feuil1").Activate
    tablo = Range("A1:BT" & Range("A" & Rows.Count).End(xlUp).Row)
    Produit = Worksheets("Base").Range("G:G")
    For i = 1 To UBound(Produit, 1)
        g = Val(Left(Produit(i, 1), 5)): d = Val(Right(Produit(i, 1), 3))
        For n = 2 To UBound(tablo, 1)
            If tablo(n, 1) = g Then
                For m = 55 To UBound(tablo, 2)
            If tablo(1, m) = d Then Worksheets("Feuil1").Cells(n, m) = d 'tablo(n, m)
                Next
            End If
        Next
      Next i
     
    End Sub
 

kan3pz

XLDnaute Occasionnel
Bonjour Bebere,
J'ai juste une première remarque le code fonctionne que partiellement car les 3 derniers caractères de mon code (variable d) peuvent être numériques (exple 444) ou texte (G00). Ton code ne renvoie la valeur que lorsque d est numérique.
J'ai essayé d = Right(Produit(i, 1), 3) mais là c'est l'inverse...
J'ai essayé aussi de paramétrer avec un If IsNumeric sans succès...

Merci de ton aide,
 

kan3pz

XLDnaute Occasionnel
Bebere comme je l'ai fait remarquer lorsque l'on enlève le val dans le cas où les 3 derniers caractères sont bel et bien numériques cela ne marche pas...
il faudrait rajouter une condition :

If IsNumeric Right(Produit(i, 1), 3) Then
d = Val(Right(Produit(i, 1), 3))
Else
d = Right(Produit(i, 1), 3)

J'ai essayé mais j'ai une erreur de syntaxe que je ne comprends pas.... sauf s'il est possible de comparer les 3 derniers caractères sans se soucier de leur format...

Merci
 

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 184
dernier inscrit
Di Martino