Macro trop "lourde" ?

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

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

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).

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

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...

@ bientôt

LouReeD

29classeur1.xlsm (254.29 Ko)

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...

il n'y a rien de plus sur votre fichier qui "prendrait" de la place ?

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é

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

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...

Bon courage alors ...

@ bientôt

LouReeD

Rechercher des sujets similaires à "macro trop lourde"