XL 2016 Acclération Sierreur VBA

Strick-TD

XLDnaute Nouveau
Bonjour à tous, débutant sur VBA j'ai une macro où à l'intérieur j'ai une fonction sierreur avec une variable sur 12.000 lignes qui est un peu longue.
Avec l'aide de ce forum, j'ai réussi à réduire le temps de ma rechercheV, j'ai voulu reprendre ce model pour réduire ma fonction sierror sauf que ça ne fonctionne pas (il n'y a pas d'erreur) j'ai des zéros partout. Pourriez-vous m'aider svp ? Merci beaucoup.
VB:
'Fonction Si erreur actuelle un peu longue'
For j = 2 To 12000
If Cells(j, 9).Value = "x" Then
Cells(j, 19).Value = "=iferror(Cells(j, 18) * Cells(j, 8),0)"
Else
Cells(j, 19).Value = 0

End If
Next j

'Fonction rechercheV rapide
DerLig = sh.Range("Q" & Rows.Count).End(xlUp).Row
    sh.Range(Cells(2, 18), Cells(DerLig, 18)) = "=iferror(VLOOKUP(RC[-1],'[DB Articles.xlsx]Synthèse'!C3:C4,2,0),0)"
    sh.Range(Cells(2, 18), Cells(DerLig, 18)).Value = sh.Range(Cells(2, 18), Cells(DerLig, 18)).Value
    
    
    'Test d'amélioration de la fonction SIERROR qui ne marche pas
DerLig2= sh.Range("Q" & Rows.Count).End(xlUp).Row
    sh.Range(Cells(2, 19), Cells(DerLig, 19)) = "=iferror(Range(Cells(2, 18), Cells(DerLig, 18))*Range(Cells(2, 8), Cells(DerLig, 8)),0)"
    sh.Range(Cells(2, 19), Cells(DerLig, 19)).Value = sh.Range(Cells(2, 19), Cells(DerLig, 19)).Value
 

vgendron

XLDnaute Barbatruc
Hello
dans ton premier sirreur, il manque un élément
Cells(j, 19).Value = "=iferror(Cells(j, 18) * Cells(j, 8),0)"

et dans le deuxième (celui qui ne fonctionne pas..)
je doute que meme sans vba, la formule fonctionne... tu devrais peut etre passer par la fonction Sommeprod..
en fait;. on ne sait pas ce que tu veux calculer...


oups.. pardon.. je confond avec la fonction iif....
cela dit.. un fichier exemple serait le bienvenu
 

Strick-TD

XLDnaute Nouveau
Hello
dans ton premier sirreur, il manque un élément
Cells(j, 19).Value = "=iferror(Cells(j, 18) * Cells(j, 8),0)"

et dans le deuxième (celui qui ne fonctionne pas..)
je doute que meme sans vba, la formule fonctionne... tu devrais peut etre passer par la fonction Sommeprod..
en fait;. on ne sait pas ce que tu veux calculer...


oups.. pardon.. je confond avec la fonction iif....
cela dit.. un fichier exemple serait le bienvenu
Bonjour merci de votre réponse,

Oui j'ai essayé de rajouter l'élément si il y a "x" en colonne 9 mais ça ne fonctionne pas pour autant.
Mon but serait de faire quelque chose de beaucoup plus court qu'une variable. Auriez-vous une suggestion svp ?
 

vgendron

XLDnaute Barbatruc
Je ne comprend toujours pas le calcul que tu fais pour la colonne S
si il y a un X dans la colonne I (sur la ligne concernée) alors tu fais le produit entre les deux colonnes H et R "COMPLETES"
1) à moins d'un calcul matriciel, ca ne donnera rien
2) ta colonne H est vide.. donc. matriciel ou pas.. le résultat sera toujours nul..

3) peut etre que ton calcul est plutot =SIERREUR(SI(I2=x;H2*R2;0);0) et tu tires la formule vers le bas.. ??
 

Strick-TD

XLDnaute Nouveau
Vgendron,

Excusez moi j'ai voulu adapté le plus vite possible un fichier bis pour vous et il y a une erreur c'est pas la colonne H mais la colonne F.
Pour vous expliquez d'un point de vue macro, je fais une rechercheV de mon article en colonne R (recherche colonne Q dans mon excel DB articles) pour savoir le prix. Ensuite le but est en colonne S de faire une formule si il y a un "x" dans ma colonne "I" alors je multiplie les quantités (colonne F) par le prix (colonne R): Sierreur(si(I2=x;F2*R2;0);0)
Cette fonction (sierreur) fonctionne avec une variable sauf que je souhaiterai aujourd'hui accélérer cette fonction car sur 12.000 lignes c'est beaucoup trop long. Donc s'il y avait une solution possible vous me sauverez bien :)
 

Strick-TD

XLDnaute Nouveau
avec ta formule.. il aurait fallu corriger
Sierreur(si(I2=x;F2*R2;0);0)
par ca:
Sierreur(si(I2="x";F2*R2;0);0)
Merci pour cette réponse.
Malheureusement mon but en postant ce message était de supprimer la variable pour la fonction si erreur car ici ça marche très bien sur 20 lignes mais sur 12.000 lignes ça met environ 30 secondes (je veux le réduire car j'ai 200 fichiers à lancer) et je voudrais le passer à 1 seconde par fichier.
Du coup ma question initial était de savoir si en prenant modèle sur la recherchev que j'ai posté ou alors une autre solution (sans modifier la rechercheV car celle-ci fonctionne très bien et rapidemment) serait-il possible d'accélérer la fonction sierreur ?

J'ai essayé d'adapter votre macro sur ma macro initial (plus longue que ce que je vous ai mis en exemple et c'est beaucoup trop long a tout modifier pour moi.
Merci encore pour votre aide
 

vgendron

XLDnaute Barbatruc
J'ai essayé d'adapter votre macro sur ma macro initial (plus longue que ce que je vous ai mis en exemple et c'est beaucoup trop long a tout modifier pour moi.
il faut savoir faire un choix... soit tu passes un peu de temps à modifier ton code pour gagner du temps par la suite, soit tu perds du temps à chaque execution...
et si tu postais ton code en entier, on pourrait peut etre t'aider à optimiser
ou alors, tu indiques comment tu souhaites faire fonctionner le code fourni..
genre.. pour chaque classeur ouvert, pour chaque classeur d'un répertoire,
tous tes classeurs ont ils bien la meme structure (= les données sont toujours au meme endroit.....)
 

Discussions similaires

Statistiques des forums

Discussions
311 713
Messages
2 081 806
Membres
101 819
dernier inscrit
lukumubarth