Plantage excel, nombre de calcul trop important ?
Yderian
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai un soucis avec mon programme, j'essaie de faire un tri des doublons à partir d'une base de donnée (on va dire tableau1) vers le tableau2. Mon soucis c'est qu'à l'origine, mon tableau2 est vide. Ainsi j'ai trois cas de figure :
- La comparaison entre la ligne X du tableau1 est différente de la ligne Y du tableau => Il ne se passe rien, on regarde la ligne Y+1 (hypothèse implicite qui n'apparait pas dans le code)
- On observe que la ligne X du tableau1 est égale à la ligne Y+1 du tableau 2 => On place un compteur à côté pour compter le nombre de doublon
- 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
Alors la comparaison et tout le tatoin j'arrive à le faire avec les moyens du bords. le problème, c'est que excel plante au bout de 30sec de moulinage. Soit c'est mon pc (vive les pc de bureau !) soit c'est mon programme. On va partir du principe que c'est mon programme qui n'est pas bon. Pouvez-vous m'aider à voir ce qui ne va pas ?
Ce code devrait à terme comparer un nombre de cellule assez important. Pour l'instant j'en ai plus de 7000 et ça peut augmenter drastiquement. Cependant, j'ai pu voir sur d'autre poste que certains ont plusieurs centaines de millier de ligne. Je pense donc que ça devrait pouvoir être réalisable.
Bien cordialement
Yderian
J'ai un soucis avec mon programme, j'essaie de faire un tri des doublons à partir d'une base de donnée (on va dire tableau1) vers le tableau2. Mon soucis c'est qu'à l'origine, mon tableau2 est vide. Ainsi j'ai trois cas de figure :
- La comparaison entre la ligne X du tableau1 est différente de la ligne Y du tableau => Il ne se passe rien, on regarde la ligne Y+1 (hypothèse implicite qui n'apparait pas dans le code)
- On observe que la ligne X du tableau1 est égale à la ligne Y+1 du tableau 2 => On place un compteur à côté pour compter le nombre de doublon
- 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
Alors la comparaison et tout le tatoin j'arrive à le faire avec les moyens du bords. le problème, c'est que excel plante au bout de 30sec de moulinage. Soit c'est mon pc (vive les pc de bureau !) soit c'est mon programme. On va partir du principe que c'est mon programme qui n'est pas bon. Pouvez-vous m'aider à voir ce qui ne va pas ?
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 TableauSource(0) As String 'TableauSource est le tableau duquel on tire les informations Dim TableauCible() As String 'TableauCible est le tableau dans lequel on mets les informations et qui va nous servir de comparateur Dim i As Double Dim j As Double Dim v As Double Dim w As Double w = 1 ReDim TableauCible(derniere_ligne) 'on definei la taille de la matrice qui doit être égale au nombre de ligne que l'on a dans le premier tableau For i = 1 To 100 'On donne la dimension du tableau en fonction du nombre de ligne que l'on va étudier TableauSource(0) = Ws_Feuille_destination.Cells(i, 6) 'ici on prends la valeur que l'on veut comparer For j = 1 To w TableauCible(w) = Ws_feuille_Gephi.Cells(j, 1) 'On attribut une valeur à la matrice ' Ws_feuille_Gephi.Cells(j + 1, 1) = TableauCible(j) If TableauSource(0) = TableauCible(w) Then n = Ws_feuille_Gephi.Cells(i + 1, 3) n = n + 1 Ws_feuille_Gephi.Cells(i + 1, 3) = n ' Verification = True ElseIf TableauCible(w) = "" Then Ws_feuille_Gephi.Cells(i, 1) = TableauSource(0) Ws_feuille_Gephi.Cells(i, 2) = Ws_Feuille_comparaison.Cells(3, 8) Ws_feuille_Gephi.Cells(i, 3) = 1 w = w + 1 Next j Next
Ce code devrait à terme comparer un nombre de cellule assez important. Pour l'instant j'en ai plus de 7000 et ça peut augmenter drastiquement. Cependant, j'ai pu voir sur d'autre poste que certains ont plusieurs centaines de millier de ligne. Je pense donc que ça devrait pouvoir être réalisable.
Bien cordialement
Yderian
A voir également:
- Plantage excel, nombre de calcul trop important ?
- Calcul moyenne excel - Guide
- Nombre de jours entre deux dates excel - Guide
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
2 réponses
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
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
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
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...
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
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.
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 ?