Excel VBA Macro qui fait freeze Excel

Résolu/Fermé
PC74cook32 Messages postés 332 Date d'inscription jeudi 12 février 2009 Statut Membre Dernière intervention 25 avril 2019 - 27 août 2018 à 20:13
PC74cook32 Messages postés 332 Date d'inscription jeudi 12 février 2009 Statut Membre Dernière intervention 25 avril 2019 - 29 août 2018 à 18:41
Bonjour à tous/toutes,

J'ai un fichier Excel avec plusieurs macro. J'utilise l'une d'entres elles pour copier des résultats depuis une page internet, les mettre dans un tableau, et recommencer. Suivant des détails techniques, elle reconnait automatiquement si le texte est une adresse, le range dans la case adresse, et fait de même pour l'adresse.
Il fait ça page par page, donc 10 entrées à la fois.
J'ai créé une autre macro qui boucle cela, mais je me suis rendu compte que je ne peux pas copier automatiquement plus de 5 pages par tour de boucle.
Si je mets 6, Excel va copier normalement la 5ème et au moment d'attaquer la 6ème, il se bloque et ne répond plus. Obligé de devoir le fermer. J'ai optimisé ma macro au possible et impossible de dépasser ce seuil de 5 pages par boucle.

Ma question est : ce freeze automatique à 5 pages est il dû à une limitation logicielle (Excel qui prendrait trop de processeur et/ou de RAM?) ou du logiciel en lui même et donc à un paramètre dans le tableur ?

Si quelqu'un connaît la réponse à ma question et/ou une solution, je suis preneur.

Merci d'avance, bonne soirée.

1 réponse

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 330
27 août 2018 à 21:31
Sans plus de détail, dur de répondre, peux-tu montrer ton code ?
0
PC74cook32 Messages postés 332 Date d'inscription jeudi 12 février 2009 Statut Membre Dernière intervention 25 avril 2019 35
Modifié le 28 août 2018 à 18:09
Sub COMPLETauto()

Application.ScreenUpdating = False
'======================================

'MACRO PG SUIV

Call ImportListePgSuiv

'======================================

'MACRO NOM

'Déclaration d'une variable entière pour stocker le nombre de ligne de ton tableau
Dim NombreLigneNom As Integer

'Sélection de la feuille sur laquelle se trouve les données à traiter
Sheets(Sheets.Count).Select

'Enregistrement du nombre de ligne de ton tableau
NombreLigneNom = 160

'Boucle qui va de 1 au nombre total de ligne
For I = 1 To NombreLigneNom

    'Si la cellule de la ligne i et de la 1ere colonne (A) est égale à A (nom), alors
    If Cells(I, 1) = "A" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 1) = "B" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 1) = "C" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 1) = "D" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 1) = "E" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 1) = "F" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 1) = "G" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 1) = "H" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 1) = "I" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 1) = "J" Then
        Cells(I, 1).Select
        ActiveCell.Offset(1, 0).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
'Fin de la boucle For
Next

Sheets("Liste").Select

'POSITIONNEMENT AUTO VERS DROITE
ActiveCell.Offset(-10, 1).Select
'ActiveCell.Offset(0, 1).Select
'POSITIONNEMENT AUTO VERS HAUT
'ActiveCell.Offset(-10, 0).Select

'======================================

'MACRO ADRESSE


'Déclaration d'une variable entière pour stocker le nombre de ligne de ton tableau
Dim NombreLigneAdr As Integer

'Sélection de la feuille sur laquelle se trouve les données à traiter
Sheets(Sheets.Count).Select

'Enregistrement du nombre de ligne de ton tableau
NombreLigneAdr = 160

'Boucle qui va de 1 au nombre total de ligne
For I = 1 To NombreLigneAdr

    'Si la cellule de la ligne i et de la 10eme colonne (J) est égale à 10 (adr), alors
    If Cells(I, 17) = "4" Then
        Cells(I, 1).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 17) = "5" Then
        Cells(I, 1).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 17) = "6" Then
        Cells(I, 1).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 17) = "7" Then
        Cells(I, 1).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 17) = "8" Then
        Cells(I, 1).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
    If Cells(I, 17) = "9" Then
        Cells(I, 1).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
'Fin de la boucle For
Next

Sheets("Liste").Select

'POSITIONNEMENT AUTO VERS DROITE
ActiveCell.Offset(-10, 2).Select
'ActiveCell.Offset(0, 2).Select
'POSITIONNEMENT AUTO VERS HAUT
'ActiveCell.Offset(-10, 0).Select

'======================================

'MACRO TEL


'Déclaration d'une variable entière pour stocker le nombre de ligne de ton tableau
Dim NombreLigne As Integer
Dim i2 As Integer

'Sélection de la feuille sur laquelle se trouve les données à traiter
Sheets(Sheets.Count).Select

'Enregistrement du nombre de ligne de ton tableau
NombreLigne = 160

'Boucle qui va de 1 au nombre total de ligne
For i2 = 1 To NombreLigne

    'Si la cellule de la ligne i et de la 10eme colonne (J) est égale à 10 (tel), alors
    If Cells(i2, 17) = "10" Then
        Cells(i2, 1).Select
        Selection.Copy
        Sheets("Liste").Select
        ActiveSheet.Paste
        ActiveCell.Offset(1, 0).Select
        Sheets(Sheets.Count).Select
    End If
    
'Fin de la boucle For
Next

'======================================

'MACRO SUPPR PAGE

Sheets("Nombres").Select
Call SuprrDernFeuille
Sheets("Liste").Select
ActiveCell.Offset(0, -3).Select

Application.ScreenUpdating = True

End Sub


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
0
PC74cook32 Messages postés 332 Date d'inscription jeudi 12 février 2009 Statut Membre Dernière intervention 25 avril 2019 35
27 août 2018 à 22:01
Voici la macro qui copie les noms, adresses et numéros de tel.
Je peux faire boucler cette macro 5 fois au maximum. Si elle boucle une 6ème fois, Excel freeze.
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
28 août 2018 à 09:33
Bonjour,

'Si la cellule de la ligne i et de la 10eme colonne (J) est égale à 10 (adr), alors
If Cells(I, 17) = "4" Then

Sauf erreur de commentaire 17=Q pas J

Beaucoup trop de select. Vous pouvez mettre un fichier model pour voir le comportement de votre code et si possible vous "l'ameliorer" ?
0
PC74cook32 Messages postés 332 Date d'inscription jeudi 12 février 2009 Statut Membre Dernière intervention 25 avril 2019 35
28 août 2018 à 12:25
Bonjour,

Oui, simple erreur de commentaire

Que voulez vous dire par "fichier model"?
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
28 août 2018 à 19:09
Re,

Fichier model: une feuille avec les donnees (non confidentielles) a tester et copier et une feuille liste pour avoir le format

Mantenant, avez vous essayez de copier plus de 5 fois la meme feuille de donnees?????
0