VBA Incompatibilité de type 13

Bonjour à tous,

Je voudrais utiliser une recherchev en VBA en utilisant Application.Vlookup pour enrichir une base de données.

Le but du jeu étant, dans un fichier de plus de 100 000 lignes et des dizaines de colonnes, de gagner du temps par rapport à l'utilisation du .Formula = Vlookup.... puis collage valeur.

Mon code :

Sub RDG_formules()

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

'Définition de la variable v_derligne
Dim v_derligne As Long

'Recherche de la dernière ligne du tableur
  v_derligne = Range("A" & Rows.Count).End(xlUp).Row

'Boucle sur CRN
Range("C2:C" & v_derligne).Value = Application.IF(Range("B2") = "" - "", Application.VLookup(Range("B2") & Range("A2"), ['ARBRE CRN'!A:S], 13, False), Application.VLookup(Range("Q2"), ['ARBRE CRN'!A:S], 13, False))

'confirmer l'exécution de la macro
    MsgBox ("Mise à jour terminée")

End Sub

En utilisant .Formula ça donnait ça et ça marchait très bien mais trop long à mon goût sur un fichier de 200 mo.

'Boucle sur CRN
With Range("C2:C" & v_derligne)
'recherchev
    .Formula = "=IF(B2=""-"",VLOOKUP(B2&A2,'ARBRE CRN'!A:S,13,FALSE),VLOOKUP(B2,'ARBRE CRN'!A:S,13,FALSE))"
    .Value = .Value
'End With

J'ai sûrement mal écrit ma fonction car j'ai un message d'erreur "incompatibilité de type 13" mais je ne vois plus comment m'en sortir... Avez-vous une idée svp ?

Je vous remercie pour votre lecture et votre aide éventuelle.

29fichier-test-2.xlsm (114.12 Ko)

Bonjour,

Une proposition

84fichier-test-2.xlsm (101.66 Ko)

A+

Bonjour Frangy et merci pour ta proposition qui fonctionne très bien !

J'avais déjà écrit un code similaire mais en mesurant le temps de traitement sur un fichier de plus de 100 000 lignes avec de nombreuses colonnes c'est moins rapide que le .Formula=Vlookup...

D’où mon souhait d'arriver à utiliser Application.IF(Vlookup pour gagner encore du temps par rapport à .Formula=IF(Vlookup.

En tout cas merci du temps que tu as consacré à mon cas je garde ta variante précieusement!

Re-bonjour,

Je serais curieux de connaitre le temps que tu gagnes en utilisant .Formula=Vlookup... sur 100 000 lignes

A+

Bonjour à tous,

Un vlookup en vba quelle que soit la façon sera toujours plus lent que mis sur la feuille.

Une version plus rapide, mais de mémoire il y a un soucis avec transpose() pour plus de 64000 lignes.

Si c'est le cas il faudra découper le traitement en paquets.

A tester...

eric

30fichier-test-2.xlsm (107.71 Ko)

Bonsoir eriiic et merci pour ce nouveau test !

Vous dites tous les deux que le .Formula est forcément plus lent que rédigé sous forme de boucle.

Alors c'est peut-être simplement la boucle que j'avais écrite qui est nettement moins performante que les vôtres.

J'essaie vos travaux sur mon gros fichier demain au boulot et je vous donnerai les temps de traitement par rapport au .Formula.

Si quelqu'un peut m'expliquer mon erreur sur la fonction Application.xxx de mon premier post, je suis preneur, au moins pour ma culture même si ça va moins vite.

Merci encore pour votre travail à tous les deux et à demain pour les chronos!

M'est avis que c'est plutôt evaluate() que tu devrais utiliser.

If est connu de vba et n'a pas besoin de application.

Vous dites tous les deux que le .Formula est forcément plus lent que rédigé sous forme de boucle.

Non, je disais par opposition à une formule mise directement sur une feuille.

Version modifiée pour dépasser les 65000 lignes.

100000 lignes : 0.75s

eric

J'ai retesté vos codes sur 210 064 lignes sur 1 seule colonne :

Frangy : 5 minutes 35 pour le 1er test et 5 minutes 29 pour le second. Je ne comprends pas pourquoi c'est devenu si long, j'ai juste rajouter des données en colonnes A & B....

eriic : 1.3 seconde

Vlookup : 2.9 secondes

Je ne connaissais pas "Timer" mais j'en prends bonne note!!

Merci encore à tous les deux.

Je vais me pencher sur Evaluate()

Rechercher des sujets similaires à "vba incompatibilite type"