XL 2016 VBA- fail d'optimisation

Zhanties

XLDnaute Nouveau
Bonjour,

j'ai réussi ma première version pour traiter des données sur mon fichier annexe à l'aide des boucles for if classique.
Cependant mon fichier principal étant extrêmement volumineux (950 000 lignes), cela ne peux marcher sans risque de le faire planter.
La solution est donc, de ce que j'en ai lu de faire des structures en bloc mais je ne suis pas encore assez doué pour cela. J'ai suivi ce tuto sur internet,
qui marche quand je réplique celui de l'exemple, mais quand je l'applique à mon propre code un problème survient : https://www.lecfomasque.com/vba-rediger-des-macros-plus-rapides/
Sinon, je sais que l'on peut aussi le faire via des tableaux mais je ne suis pas plus doués que ça non plus sur ce sujet.

Voici mon fichier annexe ci-joint où mon test de structure en bloc est fait dans le module "test2" sur la partie "calcul du nombre d'hommes et de femmes" comme dans l'exemple du lien.

Merci de votre retour,
cordialement.
 

Pièces jointes

  • Optimisation test.xlsm
    23.4 KB · Affichages: 13

Zhanties

XLDnaute Nouveau
Bonjour sousou,

merci, effectivement on peut de cette manière mais j'aimerai éviter car cela ajoute des lignes dans un fichier qui est déjà bien lourd.
Evidemment sur mon fichier annexe, c'est tout à fait adapter et je t'en remercie.

Cependant j'aimerai vraiment pouvoir voir une méthode d'optimisation qui me sera utile sur d'autres projets en plus de celui-ci.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @Zhanties , @sousou , @Paf ,

Il me semble que des formules suffisent et sont rapides. Voir les formules en colonnes O et P.
Cliquez sur le bouton "Initialiser à ..." pour obtenir un fichier d'environ 1 million de lignes.
Une fois le million de lignes créé, modifiez une valeur du tableau et constatez la vitesse de calcul dans les colonnes O et P.
 

Pièces jointes

  • Zhanties- Optimisation test- v2.xlsm
    23.7 KB · Affichages: 11
Dernière édition:

Zhanties

XLDnaute Nouveau
Bonjour @sousou ; @Paf et @mapomme

Tout d'abord merci de vos réponses. N'y arrivant pas par VBA, j'avais effectivement réalisé mes calculs par excel. Cependant mes formules étaient plus longues que celle de mapomme qui sont bien plus synthétiques et donc plus efficace, et le tableau dynamique de sousou est une solution utile que je n'avais pas pensé.

En ce qui concerne Paf, j'ai pris en compte ton commentaire et j'ai donc refais mon excel et épuré le code vba présent que j'avais laissé en entier pour ne laisser que la partie utile à ma demande, ce qui est beaucoup plus lisible, et ceux avec plus de commentaires.
En effet, même si les 2 solutions présentes ci-dessus marchent (que je vais garder), j'aimerai savoir pourquoi ma ligne de code ne fonctionne pas.

J'ai en effet dans mon premier module non optimisé une simple boucle for each avec un critère if qui fonctionnent mais moulinant trop de calcul et faisant planter mon excel avec le fichier mère si celui-ci est lancé (mais fonctionne en pas par pas pour s'assurer de la validité de la macro).
Dans mon second exemple, j'ai essayé de suivre le tuto de ce lien : https://www.lecfomasque.com/vba-rediger-des-macros-plus-rapides/ à partir de la section "Astuce de structure de code" qui montre comment écrire et lire dans les feuilles en bloc.

Cependant, je suis conscient qu'il ne s'agit pas de l'unique méthode car comme semble l'indiquer @Paf , cela peut aussi se rédiger par tableau et dictionary. Ce qui m'intéresse aussi. En effet, j'avais essayé en premier lieu avant de partir sur le tuto du lien de partir sous une forme de tableau mais sans plus de succès.

En espérant avoir été plus claire pour Paf :) et je vous remercie encore une fois sur les solutions alternatives apportées qui marche nickel qui me seront toujours utile.
 

Pièces jointes

  • Optimisation test2.xlsm
    17.9 KB · Affichages: 5

Dranreb

XLDnaute Barbatruc
Moi je l'écrirais comme ça :
VB:
Sub Extraction_Données3()
   Dim TDon(), TRés(1 To 1, 1 To 3), L As Long
   TDon = Feuil1.[A2:H2].Resize(Feuil1.Cells(Rows.Count, 1).End(xlUp).Row - 1).Value
   For L = 1 To UBound(TDon, 1)
      If Not IsEmpty(TDon(L, 7)) Then
         Select Case TDon(L, 3)
            Case "M.": TRés(1, 1) = TRés(1, 1) + 1
            Case "MME", "MLE", "MM.": TRés(1, 2) = TRés(1, 2) + 1
            Case Else: TRés(1, 3) = TRés(1, 3) + 1
            End Select: End If: Next L
   Feuil2.[A6:C6].Value = TRés
   End Sub
 

Zhanties

XLDnaute Nouveau
Merci de vos retours, vos 2 méthodes marchent nickels et en plus réduisent le nombre de variables. Rien à redire sur le résultat :D
Petite question finale pour @Dranreb sur la ligne suivante :
TRés(1 To 1, 1 To 3) <-- en lecture de tableau il s'agit bien de dire ligne 1 sur 3 colonnes ? Qui s'écrit aussi de cette manière TRés (1, 3) ? Ou je suis à coté? ^^
 

Dranreb

XLDnaute Barbatruc
Pas tout à fait.
TRés(1, 3) assume plutôt en général TRés(0 To 1, 0 To 3), soit 2 lignes et 4 colonnes, à moins qu'on ait spécifié en tête du module Option Base 1. Je n'utilise pas cette option: c'est un coup à l'oublier et ne plus comprendre comment marchent certaines procédures. Je préfère donc toujours préciser les bornes inférieures des dimensions d'un tableau de dimensions fixes.
 

Discussions similaires

Réponses
9
Affichages
150

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 811
dernier inscrit
caroline29260