Boucle 80000 lignes

eriiic a écrit :

Là ça copierait juste une ligne en trop, sans décaler d'une colonne. C'est un .Resize(), pas un .Offset()

ah oui, t'as raison, j'me suis trompé : j'ai bêtement confondu .Resize() avec .Offset() merci d'l'avoir fait remarquer ! mais dans c'cas, j'vois plus d'explication possible ! donc là, il faudrait voir le fichier du demandeur (s'il revient sur ce sujet).

dhany

Bonjour à tous, (Désolé erric j'avais oublié les salutations)

Merci beaucoup pour votre aide. J'ai un peu de mal à comprendre cette formule. Il y avait toujours une ligne en moins dans le calcul de ligne total.

Voici un fichier exemple pour voir ce que j'obtiens

2pb1.xlsm (27.19 Ko)

Bonjour rorotada,

Je te retourne ton fichier modifié :

4pb1.xlsm (26.57 Ko)

J'ai pas compris pourquoi tu as mis un 2ème bloc With : un seul suffit !

Et si finalement tu veux les valeurs et pas les formules, pourquoi mettre des formules remplacées juste après par un copier / coller valeurs (et pas directement les valeurs) ? remarque : j'ai laissé en commentaire ton instruction : '.Value = .Value

Tu verras que les résultats (les formules) sont en colonne C.

À te lire pour avoir ton avis.

dhany

Un grand merci dhany ça fonctionne à merveille!!!

En plus j'avais fait une macro pour convertir les formules en valeurs et elle prend beaucoup de temps à tourner ducoup c'est parfait d'obtenir directement les valeurs.

Attention : avec ce que j'ai fait, y'a des formules ! tu préfères avec les valeurs directement, sans passer par des formules ?

si oui, patiente un moment : je vais te faire une nouvelle version (et l'exécution du code VBA sera très rapide aussi !).

Je préfère des valeurs.

Est ce que c'est la bonne solution pour obtenir des valeurs à la place d'une formule avec ce code?

Sub CAL()

With Worksheets("Data").[C1].Resize(Cells(Rows.Count, "F").End(xlUp).Row)

.Formula = "=F" & .Row & "/G" & .Row

.Value = .Value

End With

End Sub

Oui, ça marche comme cela, mais je vais faire une version où ça met directement les valeurs, sans mettre une formule juste avant.

Super, je veux bien une nouvelle version stp

Voici la nouvelle version :

7pb1.xlsm (27.12 Ko)

Ctrl e ➯ travail effectué

Alt F11 pour voir la macro, puis revenir sur Excel

Amélioration :

J'ai ajouté une sécurité : avec la version précédente, un 0 en colonne Gerreur de division par zéro !

c'est évité avec cette nouvelle version, et cette fois, plus de formules : valeurs mises directement !

dhany

Ouaw je suis impressionné, un grand merci je vais l'intégrer de suite dans ma macro

y'a pas d'quoi, c'est avec plaisir !

Bonjour,

Et si finalement tu veux les valeurs et pas les formules, pourquoi mettre des formules remplacées juste après par un copier / coller valeurs (et pas directement les valeurs) ?

Peut-être parce qu'il avait suivi un bon conseil et que c'est 30 fois plus rapide ?

Son code : 0.01 s (en remettant le .value=.value),

le tien : 0.34 s. Il n'y a pas photo...

eric

Bonjour eriiic,

Pour le temps, oui, j'suis d'accord avec toi : y'a pas photo ! mais :

1) la vitesse de 0,34 s est pas énorme, donc si elle suffit, pourquoi pas ?

2) pour ta méthode, est-ce possible de mettre directement les valeurs, sans mettre avant les formules ?

je trouve que c'est bizarre de mettre des formules pour les écraser aussitôt après par les valeurs !

3) même si ta méthode est préférable d'un point de vue temps, il n'y a pas la sécurité que j'ai ajoutée pour

éviter une éventuelle erreur de division par 0 si une cellule de la colonne G est vide ou contient 0.

dhany

1) pourquoi pas oui

2) aussi bizarre soit-elle, si elle est plus efficace et bien... elle est plus efficace.

Excel calcule avec tous les threads à sa disposition, couramment 8 actuellement donc 8 évaluations de formules en simultané. VBA n'en n'utilise qu'un seul.

VBA toujours plus rapide ? ça dépend...

3)

il n'y a pas la sécurité que j'ai ajoutée pour éviter une éventuelle erreur de division par 0

Je n'appelle pas ça une sécurité mais un choix. A faire ou pas, c'est selon ce que décide le concepteur.

0 est une valeur tout à fait valide, pas une valeur d'erreur qu'il est parfois important de laisser pour faire apparaître des anomalies..

Ceci dit un specialcells() permet d'atteindre toutes les valeurs d'erreur et de les changer en une fois, imperceptible.

eric

Quand tu parles de « threads », c'est bien le nombre des cœurs logiques du microprocesseur, n'est-ce pas ? j'ai un Intel Core i5-3450 CPU @ 3.10 GHz ; je crois bien que cet unique processeur physique contient 4 cœurs logiques, donc ça ferait 4 threads ; ce que tu dis avec 8 threads, ça doit être pour les processeurs i8, pas pour les i5 ! et je crois pas que les i8 soient si répandus que ça ! c'est pour ceux qui ont de gros besoins en montage vidéo ou en jeux très gourmands en ressources système (et surtout, c'est plus onéreux).

Mais c'est vrai que même avec 4 threads « seulement », le gain de vitesse est appréciable ! alors si vraiment le demandeur rorotada a besoin d'une super vitesse turbo, je lui conseille ce que tu lui as proposé (mais avec éventuels #DIV/0!) ; je mets donc ici le code VBA de son message de 14:27 :

Sub CAL()
  With Worksheets("Data").[C1].Resize(Cells(Rows.Count, "F").End(xlUp).Row)
    .Formula = "=F" & .Row & "/G" & .Row
    .Value = .Value
  End With
End Sub

Pour ce point de division par zéro, perso, je mets toujours un test pour éviter l'affichage du message d'erreur ; mais je veux bien croire que certains préfèrent le voir ; c'est donc une question de goûts.


Tu a écrit :

Excel calcule avec tous les threads à sa disposition ... VBA n'en n'utilise qu'un seul.

Quel dommage ! si Microsoft sait gérer les threads, j'me demande pourquoi il a pas fait pareil pour VBA !

dhany

Un coeur peut avoir plusieurs threads (hyperthreading)

Mon PC, qui n'est pas de la 1ère jeunesse, a un i7 4 coeurs/8 threads.

Il date de 2008, je ne parle pas de science-fiction ou de trucs inaccessibles.... Aujourd'hui tu as même des i5 avec 8 threads.

 je lui conseille ce que tu lui as proposé

Je ne lui ai rien proposé, il est arrivé avec.

Je voulais juste signaler que ton 'avancée' n'en était pas forcément une, qu'il ne reparte pas avec de fausses certitudes.

Ca dépend...

eric

Tu a écrit :

Je voulais juste signaler que ton 'avancée' n'en était pas forcément une, qu'il ne reparte pas avec de fausses certitudes.

Oui, tu as bien fait de souligner cela ; je me rends compte que finalement, la 1ère méthode avec .Formula puis .Value est préférable, si on veut bien se passer du test de division par 0 ; cela dit, même si au lieu de 0.01 s ma sub prend 0.34 s, ça fait quand même moins d'1 seconde ! et j'suis pas hyper pressé au point d'pas pouvoir attendre une petite seconde, ni au point d'chronométrer ma sub montre en main ! j'suppose que des performances aussi élevées sont surtout valables pour des puristes d'Excel.

Merci pour ton complément d'infos sur les cœurs et les threads.

dhany

Bonjour,

ça te fait 0.33 sec pour boire un café

et le titre était Boucle 80000 lignes ,où sont ces lignes ?

P.

Bonjour à tous,

screen

ooops, la bourde ! non, surtout pas ceux-là (même en 0.34 secondes, ou moins) !!! c'est le p'tit déj de mbbp !

j'voudrais pas qu'il m'accuse de plagiat !!! https://forum.excel-pratique.com/viewtopic.php?p=618136#p618136

dhany

Je change de sujet, merci à tous

Rechercher des sujets similaires à "boucle 80000 lignes"