Microsoft 365 Application.WorksheetFunction.VLookup ne fonctionne pas au delà de 8500 lignes

DimiJuju

XLDnaute Nouveau
Bonjour tout le monde,

Je suis un neophyte en programmation VBA. Heureusement google est mon amis.

Par contre, j'ai cherché des solutions sur la toile mais j'ai rien trouvé.


J'aimerais connaitre la raison pour laquelle la fonction Vlookup en vba ne fonctionne pas au delà de 8500 lignes.

Je m'explique:

Dans mon fichier j'ai 2 feuilles. La première est un champs d'encodage semi-automatique à partir de la feuille 2.

Ainsi si je met un code en G15, mon code VBA recherche celui-ci dans la colonne A de la feuille 2 et complètes les différentes cellules avec les information
trouvés dans la ligne correspondante à mon code. sachant que ce dernier n'apparait qu'une seule fois. Pas de doublon possible.

Si le code en G15 se trouve dans les 8000 premières lignes tout fonctionne à merveille, au delà sa marche plus.

J'ai retourné le code dans tout les sens, je trouves pas l'erreur.
calim2.gif


voici le code en question:


Private Sub Worksheet_Open()
Cells(c15, 3) = Date
Sheets("Action").Visible = 2
Sheets("Paramettre").Visible = 2
ActiveWorkbook.protect Structure:=True, Windows:=False

On Error Resume Next
If Not Intersect(Target, [G15]) Is Nothing Then
'charger les données Code M, Descriptions, Poids
If Target.Value <> "" Then
Application.EnableEvents = False
[D10] = Application.WorksheetFunction.VLookup(Target.Value, Sheet2.Range("A2:K60001"), 4, False)
End If

End Sub


' Insértion automatique de l'heure d'encodage
Private Sub Worksheet_Change(ByVal Target As Range)

On Error Resume Next
If Not Intersect(Target, [G15]) Is Nothing Then
'charger les données Code M, Descriptions, Poids
If Target.Value <> "" Then
Application.EnableEvents = False
[I15] = Application.WorksheetFunction.VLookup(Target.Value, Sheet2.Range("A2:K60000"), 3, False)
[I17] = Application.WorksheetFunction.VLookup(Target.Value, Sheet2.Range("A2:K60000"), 4, False)
[M15] = Application.WorksheetFunction.VLookup(Target.Value, Sheet2.Range("A2:K60000"), 6, False)
[L2] = Application.WorksheetFunction.VLookup(Target.Value, Sheet2.Range("A2:K60000"), 7, False)
[O7] = Application.WorksheetFunction.VLookup(Target.Value, Sheet2.Range("A2:K60000"), 10, False)

If Not IsError(Application.WorksheetFunction.VLookup(Target.Value, Sheet2.Range("A2:K60000"), 14, False)) Then
Quoi = Application.WorksheetFunction.VLookup(Target.Value, Sheet2.Range("A2:K60000"), 2, False)
Quoi2 = Quoi


Merci pour vos éclaircissement

DimiJuju
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @DimiJuju :),

Pour commencer une feuille de Calcul n'a pas d'évènement Open.
Si vous pensiez effectuer des opérations à l'ouverture du classeur, alors il s'agit de l'évènement Open du classeur et cet évènement déclenche la procédure Private Sub Workbook_Open() qui se trouve dans le module de code de ThisWorkbook.

Si vous pensiez simplement faire une procédure non évènementielle, alors il n'est pas du tout conseillé de l'appeler avec un nom qui ressemble à une procédure évènementielle.

Dans dans votre procédure (évènementielle ou non), il manque un "endif".

Dans votre procédure évènementielle Worksheet_Change(ByVal Target As Range), vous utilisez l'instruction : Application.EnableEvents = False.

Donc vous demandez à VBA (à compter de cette instruction) de ne pas lancer de procédure si on détecte un quelconque évènement. Avez-vous pensé à réactiver le traitement suite à un évènement quelconque avant de sortir de la procédure ? Si ce n'est pas le cas, il n'y aura plus d'action évènementielle par la suite. Si vous modifiez G15, l'évènement sera sans doute détecté mais aucune action ne sera entreprise par VBA et donc l'exécution de Worksheet_Change() ne se lancera pas.

Pour réactiver le traitement des évènements, utiliser l'instruction Application.EnableEvents = True

Le plus simple est de nous fournir un petit fichier exemple (c'est ce préconise la charte d'XLD) pour déjà voir ce qui se passe au niveau du code.

Rem :
à priori Vlookup fonctionne très bien même avec un grand nombre de lignes. D'ailleurs dans votre programme, il y a d'autres manières de faire qui évitent de faire plusieurs VLookup. Une seule recherche peut donner la ligne n qui nous intéresse et alors on peut lire directement les données des colonnes sans aucune recherche supplémentaire.

Nota : j'ai quelque doute sur l'instruction Cells(c15, 3) = Date. Cette instruction n'est correcte que si C15 était une variable et si cette variable contenait un numéro de ligne (et ce n'est certainement pas une référence à la cellule C15).
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour welcome with us:D
j'ajouterais que bloquer les gestions d'erreur vous auraient déjà pas mal aidé a comprendre ou vous
avez fait des erreurs
les gestions d'erreurs on les utilise uniquement si la méthode ou fonction vba ne le gère pas
dans tout les autres cas on peu s'en passer
d'ailleurs pour un des vlookup vous avez utilisé if iserror(....)
qui contrairement a on error resume next sans goto 0 ne renvoie pas le code a sa derniere ligne

d'autre part regardez un peu du coté des fonctions equiv et match en vba

j'aimerais bien voir ce fichier moi
 
Dernière édition:

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin