Plantage excel, nombre de calcul trop important ?
Fermé
Yderian
Messages postés
7
Date d'inscription
jeudi 21 mai 2015
Statut
Membre
Dernière intervention
22 mai 2015
-
22 mai 2015 à 12:39
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 26 mai 2015 à 10:45
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 26 mai 2015 à 10:45
A voir également:
- Plantage excel, nombre de calcul trop important ?
- Calcul moyenne excel - Guide
- Liste déroulante excel - Guide
- Si et excel - Guide
- Word et excel gratuit - Guide
- Déplacer une colonne excel - Guide
2 réponses
Yderian
Messages postés
7
Date d'inscription
jeudi 21 mai 2015
Statut
Membre
Dernière intervention
22 mai 2015
22 mai 2015 à 14:06
22 mai 2015 à 14:06
Voici la suite,
Finalement, l'ordinateur a réussi à faire tourner le programme sans planter. Donc c'est un problème du programme. Je viens d'effectuer plusieurs amélioration et maintenant j'aimerais savoir comment l'optimiser. Pour l'instant, comme je l'ai dis, je n'ai que 7000 lignes en entré et ça prends déjà pas mal de temps sur mon pc. Auriez-vous des idées ?
Voici le code qui fait ce qu'on lui demande ^_^
Bien cordialement,
Yderian
Finalement, l'ordinateur a réussi à faire tourner le programme sans planter. Donc c'est un problème du programme. Je viens d'effectuer plusieurs amélioration et maintenant j'aimerais savoir comment l'optimiser. Pour l'instant, comme je l'ai dis, je n'ai que 7000 lignes en entré et ça prends déjà pas mal de temps sur mon pc. Auriez-vous des idées ?
Voici le code qui fait ce qu'on lui demande ^_^
derniere_ligne = Sheets("Feuil2").Range("A1").End(xlDown).Row derniere_ligne2 = Sheets("Resultats").Range("A2").End(xlDown).Row derniere_colonne = Sheets("Feuil3").Range("G3").End(xlDown).Row Dim Verification As Boolean Dim Verification2 As Boolean Ws_feuille_Gephi.Cells(1, 1) = "Source" Ws_feuille_Gephi.Cells(1, 2) = "Target" Dim TableauSource() As String Dim TableauCible() As String Dim i As Double Dim j As Double Dim v As Double Dim w As Double w = 1 ReDim TableauCible(derniere_ligne) ReDim TableauSource(derniere_ligne) ' For v = 1 To derniere_colonne ' TableauSource(1) = Ws_Feuille_comparaison.Cells(v + 2, 8) For i = 1 To derniere_ligne 'On donne la dimension du tableau en fonction du nombre de ligne que l'on va étudier TableauSource(i) = Ws_Feuille_destination.Cells(i, 6) For j = 1 To w Verification = False TableauCible(w) = Ws_feuille_Gephi.Cells(j + 1, 1) 'MsgBox (TableauCible(w)) 'MsgBox (TableauSource(i)) ' Ws_feuille_Gephi.Cells(j + 1, 1) = TableauCible(j) If TableauSource(i) = TableauCible(w) Then n = Ws_feuille_Gephi.Cells(j + 1, 3) n = n + 1 Ws_feuille_Gephi.Cells(j + 1, 3) = n ' Verification = True 'MsgBox ("OK") ElseIf TableauCible(w) = "" And Verification = False Then Ws_feuille_Gephi.Cells(j + 1, 1) = TableauSource(i) Ws_feuille_Gephi.Cells(j + 1, 2) = Ws_Feuille_comparaison.Cells(3, 8) Ws_feuille_Gephi.Cells(j + 1, 3) = 1 Verification = True w = w + 1 ' MsgBox ("Vide") ElseIf TableauCible(w) <> TableauSource(0) Then ' MsgBox ("PasOk") End If If Verification = True Then Exit For End If Next j Next
Bien cordialement,
Yderian
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
23 mai 2015 à 07:59
23 mai 2015 à 07:59
bonjour,
le mieux serait que tu mettes un extrait (et non un exemple vite fait mal fait) de ton classeur
pour cela
Mettre le classeur sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le lien proposé dans le message de réponse
ce que je comprend mal :
Mon soucis c'est qu'à l'origine, mon tableau2 est vide. Ainsi j'ai trois cas de figure :
...
...
Dans le cas ou on n'a aucune des options précédente, c'est que la ligne du tableau2 est vide et donc on la rempli par la ligne X du tableau1
le mieux serait que tu mettes un extrait (et non un exemple vite fait mal fait) de ton classeur
pour cela
Mettre le classeur sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le lien proposé dans le message de réponse
ce que je comprend mal :
Mon soucis c'est qu'à l'origine, mon tableau2 est vide. Ainsi j'ai trois cas de figure :
...
...
Dans le cas ou on n'a aucune des options précédente, c'est que la ligne du tableau2 est vide et donc on la rempli par la ligne X du tableau1
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
Modifié par michel_m le 23/05/2015 à 11:51
Modifié par michel_m le 23/05/2015 à 11:51
Re,
pas envie de mettre le nez dehors vu les rafales de mistral dans mon coin :-(
en attendant ci joint un exemple qui est -peut-^tre- ce que tu désires mais cela pourrait, toujours peut-^tre, t'aider à la conception de ton classeur
on compare 2 listes de 10000 lignes (3 colonnes mais peu importe) feuille1 et feuille2
et on restitue les communs en feuille3
le tout en un peu moins de 0,17 secondes
https://www.cjoint.com/?3ExlWbLIC85
pas envie de mettre le nez dehors vu les rafales de mistral dans mon coin :-(
en attendant ci joint un exemple qui est -peut-^tre- ce que tu désires mais cela pourrait, toujours peut-^tre, t'aider à la conception de ton classeur
on compare 2 listes de 10000 lignes (3 colonnes mais peu importe) feuille1 et feuille2
et on restitue les communs en feuille3
le tout en un peu moins de 0,17 secondes
https://www.cjoint.com/?3ExlWbLIC85
Salut,
Je te remercie beaucoup pour ce que tu as fait. J'ai pu regarder chez moi mais la, prendre le fichier au bureau est juste impossible. Du coup, je n'y ai plus du tout accès... Comment faire ?
Sinon, ce qui est compliqué c'est qu'il ne faut pas que gérer les doublons. En fait ça ce passe en trois temps :
Les protagonistes :
- Tableau1 (c'est de lui qu'on va extraire les informations)
- Tableau2 (il est vide au début)
On prends la première ligne du Tableau 1 et on la compare au tableau 2. Si c'est vide, on rempli (donc la il faut faire une matrice qui évolue en fonction de ce qu'on va mettre dedans). Mais surtout, la difficulté, c'est que le Tableau2 est en deux dimensions ! Je m'explique
Pour chaque institut/Industriel/Pots de fleures, on va rajouter un petit compteur à côté. Et à chaque fois qu'on va en remarquer un (de doublon), on va faire une petite incrémentation de 1 (que j'appellerais, le poids). Donc ça c'est pour l'initialisation de la deuxième dimension. En gros, on aura le noms des pots de fleurs d'un côté et le poids de l'autre. Mais ce n'est toujours pas tout !
En plus du poids général, il faut un poids spécifique par instituts. Alors la il y a deux possibilité, sois je choisi les pots de fleurs à regarder, soit, a chaque fois que je vais avoir un nom de pots de fleurs que je ne connais pas, je l'ajoute sur l'autre dimension et j'incrementerais de 1 la valeur a chaque fois que je trouverais ce pots de fleurs travaillant avec un autre (je ne sais pas si vous me suivez...)
Exemple
X poids général X1 X2 X3 X4 X5 X6
X1 2 1 1 0 0 0 0
X2 11 0 7 2 1 0 1
X3 1 0 1 0 0 0 0
X4 14 5 0 5 0 4 0
X5 1 0 0 0 1 0 0
X6 6 0 2 0 2 0 2
Est-ce mieux avec cette exemple ?
Merci d'avance pour votre aide, je galère vraiment avec morceau de code....
Yderian
Je te remercie beaucoup pour ce que tu as fait. J'ai pu regarder chez moi mais la, prendre le fichier au bureau est juste impossible. Du coup, je n'y ai plus du tout accès... Comment faire ?
Sinon, ce qui est compliqué c'est qu'il ne faut pas que gérer les doublons. En fait ça ce passe en trois temps :
Les protagonistes :
- Tableau1 (c'est de lui qu'on va extraire les informations)
- Tableau2 (il est vide au début)
On prends la première ligne du Tableau 1 et on la compare au tableau 2. Si c'est vide, on rempli (donc la il faut faire une matrice qui évolue en fonction de ce qu'on va mettre dedans). Mais surtout, la difficulté, c'est que le Tableau2 est en deux dimensions ! Je m'explique
Pour chaque institut/Industriel/Pots de fleures, on va rajouter un petit compteur à côté. Et à chaque fois qu'on va en remarquer un (de doublon), on va faire une petite incrémentation de 1 (que j'appellerais, le poids). Donc ça c'est pour l'initialisation de la deuxième dimension. En gros, on aura le noms des pots de fleurs d'un côté et le poids de l'autre. Mais ce n'est toujours pas tout !
En plus du poids général, il faut un poids spécifique par instituts. Alors la il y a deux possibilité, sois je choisi les pots de fleurs à regarder, soit, a chaque fois que je vais avoir un nom de pots de fleurs que je ne connais pas, je l'ajoute sur l'autre dimension et j'incrementerais de 1 la valeur a chaque fois que je trouverais ce pots de fleurs travaillant avec un autre (je ne sais pas si vous me suivez...)
Exemple
X poids général X1 X2 X3 X4 X5 X6
X1 2 1 1 0 0 0 0
X2 11 0 7 2 1 0 1
X3 1 0 1 0 0 0 0
X4 14 5 0 5 0 4 0
X5 1 0 0 0 1 0 0
X6 6 0 2 0 2 0 2
Est-ce mieux avec cette exemple ?
Merci d'avance pour votre aide, je galère vraiment avec morceau de code....
Yderian
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
>
Yderian
26 mai 2015 à 10:45
26 mai 2015 à 10:45
Pourquoi ne pas poser le VRAI problème au départ ? :(
Il faut bien te rendre compte que ce que tu demandes n'est pas forcément facile et que personne ne veut passer parfois plusieurs heures à essayer de résoudre un problème bénévolement pour se voir dire après coup « il faut en plus que.... »
Il faut bien te rendre compte que ce que tu demandes n'est pas forcément facile et que personne ne veut passer parfois plusieurs heures à essayer de résoudre un problème bénévolement pour se voir dire après coup « il faut en plus que.... »
Modifié par michel_m le 22/05/2015 à 17:23
commentaire uniquement de procédure car je n'ai pas trop pigé ce que tu voulais faire.!
1/Dommage que tu nous donnes pas le début de la macro car je n'ai pas vu
application.screenupdating=false
qui fige le défilement de l'écran: confort et rapidité
2/ pourquoi des compteurs déclaré en doubles alors que ce sont des entiers; pour 7000 lignes ce sont des Integers
integer=2octets, double: 8 octets
3/pour tes variables tableaux source et cible inutile de boucler
par exemple
tablo=range("A1:G" & derniereligne tableau de 1 à der_lig et ici 7 colonnes)
et tu supprimes la déclaration redim inutile et fausse si tu n'as pas mentionné "option base 1" en ent^te de module
4/ tu bosses alors uniquement de tableasource à tableau cible et tu crées une variable tableau T_resultats qui collecteras les résultats plutôt que d'écrire dans les cellules
et tu restitues le résultat
dans le genre: 'si plusieurs colonnes dans t_résultat
Range("depart").resize(ubound(t_resultats),nbrede colonnes)=t_resultats
le gros avantage des variables tableaux est d'éviter les AR Ram-processeur-cartegraphique très chronophage,donc à toi de jouer
Il est peut-^tre aussi intéressant d'utiliser un objet "dictionary" mais comme je ne pige ta demande...
22 mai 2015 à 18:27
Bref, l'idée du tableau est de trouver toutes les données en double. En gros je vais avoir des instituts des noms d'entreprises en entré (1 par ligne) et ensuite j'ai le pays. Donc ce que je veux faire c'est comparer le nom que je vais regarder aux noms d'entreprise qui seront déjà inscrit dans le tableau2. Si il trouve une occurence, alors j'ai un petit compteur qui monte a côté. Et c'est presque tout ! Enfin c'est le début déjà.
Alors déjà pour le vba je débute donc j'ai encore du mal avec ce langage(comme tt les langage^^) et donc je ne comprends pas tonpoint 3. Peux tu plus le détailler ? Si j'ai le temps, je vais voir pour regarder les modifications quand je rentre chez moi et je reviens vers toi au plus vite !
Merci encore
Yderian
22 mai 2015 à 20:25
Modifié par PlacageGranby le 22/05/2015 à 20:47
Comme Michel_m le suggère dans son point #1.
Ton gain principal va se faire avec au debut de ta macro
Et à la toute fin.
En gros, en plus d'avoir a calculer, Excel se donne comme mission d'afficher en real time tout les changements au fur et a mesure et il perd énormément de temps et de ressource à le faire.
Donc avec screenupdating, on peut dire à Excel de ne pas s'enfarger avec l'affichage, et l'affichage sera rafraichit seulement à la fin du calcul.
23 mai 2015 à 08:02
Application.screenupdating - true
puisque la macro rend la main au système!
d'autre part
qui fige le défilement de l'écran: confort et rapidité
te semble insuffisant ?