Macro trop "lourde" ?

Y compris Power BI, Power Query et toute autre question en lien avec Excel
B
BlackSheitan
Nouveau venu
Nouveau venu
Messages : 5
Inscrit le : 12 mai 2015
Version d'Excel : 2013

Message par BlackSheitan » 12 mai 2015, 19:53

Bonjour à tous,

J'ai écrit une petite macro Excel qui me permet de récupérer les titres d'un grand nombre d'articles issus de Wikipédia.
En réalité, la macro est une boucle qui me permet de récupérer environ 300 titres à chaque fois.
J'aurais aimé faire tourner cette boucle 100 fois (voire plus) afin de récupérer au moins 30000 titres.

Cependant, après 40 ou 50 passage dans la boucle, la macro semble faire planter Excel. J'ai mis une barre de progression pour me rendre compte du bon déroulement de la macro et vers 40% Excel semble tourner dans le vide.

Vraiment est-ce que mon ordinateur n'est pas assez puissant pour récupérer 30000 mots de moins de 255 caractères ou c'est moi qui passe à côté de qqch ?

Merci d'avance pour votre aide !

Et le code de ma macro:
Sub Wiki()

    Dim count As Integer
    Dim nb As Integer
    
    count = 0
    nb = 100
    
For i = 1 To nb

Application.ScreenUpdating = False
Application.StatusBar = "Déroulement " & ((i / nb) * 100) & "%"

If i > 1 Then
    a = 1
Else
    a = 0
End If

    count = count + 345 - a

    Worksheets("Feuil1").Activate
    Range("A" & count).Select
    Selection.Copy
    Worksheets("Feuil2").Activate
    Range("H2").Select
    ActiveSheet.Paste

    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;https://fr.wikipedia.org/w/index.php?title=Sp%C3%A9cial%3AToutes+les+pages&from=" & Range("H2") & "&to=&namespace=0&hideredirects=1", _
        Destination:=Range("$A$1"))
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With

    Rows("1:14").Select
    Selection.Delete Shift:=xlUp
    Rows("345:400").Select
    Selection.Delete Shift:=xlUp
    
    Range("A1:A344").Select
    Selection.Copy
    Worksheets("Feuil1").Activate
    Range("A" & count + 1).Select
    ActiveSheet.Paste
    
    Worksheets("Feuil2").Activate
    Cells.Select
    Selection.Delete Shift:=xlUp

Next

Application.StatusBar = False
Application.ScreenUpdating = True

End Sub
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 6'665
Appréciations reçues : 322
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 12 mai 2015, 20:11

Bonjour, bonsoir

Chez moi c'est du à une erreur de capacité !
vous définissez "count" et "i" en integer, vous êtes vous posé la question de savoir à quoi cela correspondait ?

Integer = variable numérique pour un nombre entier compris entre -32 768 et 32 767

Il vous faut donc définir vos deux variable en "long"

Long = variable numérique pour un nombre entier compris entre - 2 147 483 648 et 2 147 483 647

Il est un temps révolu (excel 2003 et moins) où integer suffisait, mais avec les nouvelles capacité d'Excel, avec plus 1 000 000 de lignes par feuille, il faut définir les lignes en Long et non plus en Integer.

@ bientôt

LouReeD
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
B
BlackSheitan
Nouveau venu
Nouveau venu
Messages : 5
Inscrit le : 12 mai 2015
Version d'Excel : 2013

Message par BlackSheitan » 12 mai 2015, 20:25

Merci pour cette réponse rapide :) !

Oh, effectivement je ne savais pas qu'une variable Integer pouvait contenir au maximum 32767. En réalité j'ai plutôt l'habitude d'utiliser d'autres langages et dans mes souvenirs Integer avait une plus grande capacité.

Quoi qu'il en soit mon problème persiste. Mes 2 variables sont désormais des long mais ma macro continue à planter à 47% (où count devrait être égal à environ 16000 seulement).
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 6'665
Appréciations reçues : 322
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 12 mai 2015, 20:32

je viens de faire juste un copier coller du code, il passe bien, sans erreur, ceci dit sur feuille2 il n'y a rien et en feuille1 à partir de la ligne 300 et plus environ jusqu'à 3600 et des poussières, il y a bien une série de mot.

Alors je ne vois pas...

@ bientôt

LouReeD
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 6'665
Appréciations reçues : 322
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 12 mai 2015, 20:54

ci joint le fichier final, si ça peut vous servir...
pour une histoire de taille les lignes 10000 à 30000 sont effacées de leur contenu... :wink:
@ bientôt

LouReeD
Classeur1.xlsm
(254.29 Kio) Téléchargé 19 fois
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
B
BlackSheitan
Nouveau venu
Nouveau venu
Messages : 5
Inscrit le : 12 mai 2015
Version d'Excel : 2013

Message par BlackSheitan » 12 mai 2015, 21:28

C'est vraiment très bizarre... Chez moi ça reste toujours bloqué vers les 40% :(.
En effet, dans mon fichier j'ai les 345 titres sur la 1ère feuille. La macro sélectionne le 345ème titre et fait une recherche pour afficher les 344 suivants sur la 2ème feuille. Puis je coupe-colle tout à la fin de la liste de la 1ère feuille et on recommence.

Du coup le problème doit venir de mon PC. Mais j'ai beau regarder dans le gestionnaire des tâches au niveau du processeur et de la mémoire, tout semble OK...
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 6'665
Appréciations reçues : 322
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 12 mai 2015, 22:26

il n'y a rien de plus sur votre fichier qui "prendrait" de la place ?
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
B
BlackSheitan
Nouveau venu
Nouveau venu
Messages : 5
Inscrit le : 12 mai 2015
Version d'Excel : 2013

Message par BlackSheitan » 13 mai 2015, 14:59

En redémarrant mon PC aujourd'hui j'ai constaté que ma macro tourne désormais jusqu'à 50% avant de s'arrêter. Il doit donc bien s'agir d'un problème de capacité.
Ce que je ne comprends pas c'est que mon fichier fait actuellement 250Ko après 40 passages dans la boucle. En toute logique il devrait faire dans les 625Ko après 100 passages. Est-ce qu'Excel n'est pas capable de manipuler un fichier de ce "volume" ?

Btw, j'ai essayé de faire tourner ma macro sur votre fichier, elle s'arrête de la même façon... Le pb vient donc de mon côté
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 6'665
Appréciations reçues : 322
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 13 mai 2015, 15:58

Bonjour,

Pour la taille final, en effet chez moi hier il est monté vers les 600 ko, c'est pour cela que j'ai effacé les lignes de 10000 à 30000...
Excel gère des fichiers bien plus grand, au travail sur une de mes applications, le fichier était de 60 mo sous 2003. Ouf 2010 est passé par là et il à réduit des 2/3 !
Donc le problème ne vient pas de là.
Une application tourne-t-elle en tâche de fond sur votre PC ? car autant c'est Excel qui n'arrive pas a avoir assez de mémoire au niveau du PC...
Mais comment fonctionne le code ?
est-il nécessaire de faire tout ces "copier coller effacer" ?
Pourquoi une boucle si c'est pour avoir une liste en colonne A de la feuil1 ?
pourquoi passer par la feuil2 ?

@ bientôt

LouReeD
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
B
BlackSheitan
Nouveau venu
Nouveau venu
Messages : 5
Inscrit le : 12 mai 2015
Version d'Excel : 2013

Message par BlackSheitan » 13 mai 2015, 20:40

Oui, j'ai moi-même manipulé des fichiers bien plus volumineux que celui-ci avec ce même PC.
Après quelques recherches, il semble que la version 2013 (celle que j'utilise) a parfois du mal avec les macros un peu "longue". J'ai trouvé plusieurs exemples proches du mien mais aucune solution concluante...

En ce qui concerne le fonctionnement de ma macro.
Mon but est de d'obtenir une liste en page 1 d'un certain nombre de titres d'articles issus de Wikipédia. La macro lance donc en page 2 une requête web en passant en paramètre à l'URL le titre du dernier article (les 344 prochains titres + le titre utilisé pour la recherche sont donc récupérés). Le but de la page 2 est de récupérer une liste "propre" en supprimant toutes les informations inutiles récupérées lors de la requête. La liste des 344 titres est ensuite coupée et collée à la fin de la liste globale qui se trouve sur la 1ère feuille.

Quoi qu'il en soit, si chez vous la macro fonctionne parfaitement je penche pour un problème de configuration d'Excel de mon côté. Comme je l'ai dit, je ne constate rien de bien particulier niveau processeur, mémoire, etc. lorsque je lance ma macro...
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message