Macro sur 1 million de lignes: "excel ne répond pas"

Fermé
TOT127 Messages postés 898 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 7 août 2018 - Modifié par TOT127 le 10/08/2016 à 12:30
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 - 10 août 2016 à 23:33
Bonjour,
Je suis entrain de faire tourner cette macro sur excel:

Sub Uppercase()
' Loop to cycle through each cell in the specified range.
For Each x In Range("A1:O836307")
' Change the text in the range to uppercase letters.
x.Value = UCase(x.value)
Next
End Sub


Autant dire que ça ne se fait pas en 2minutes. Mac dit qu'excel ne répond pas.
A noter que sur les O colonnes, j'en ai au moins 10 avec du texte assez long.
Pendant que j'écrivais ce message j'ai eu l'erreur 6: "dépassement des capacités".



Qu'en pensez vous ?

Merci beaucoup (j'aurai souvent ce problème).


Aya
A voir également:

2 réponses

Ant049 Messages postés 154 Date d'inscription jeudi 4 août 2016 Statut Membre Dernière intervention 9 septembre 2016 22
10 août 2016 à 12:15
Bonjour,

Sous quelle version d'Excel est enregistrée ton fichier ?
1
TOT127 Messages postés 898 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 7 août 2018 95
10 août 2016 à 12:22
BOnjour,
j'ia excel 2011 pour mac
0
TOT127 Messages postés 898 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 7 août 2018 95
10 août 2016 à 12:23
(la macro a bien marché sur un test qui comptait 40 lignes d'un autre fichier, et dans mon gros fichier a fait quelques centaines de lignes puis s'est stoppée)
0
Ant049 Messages postés 154 Date d'inscription jeudi 4 août 2016 Statut Membre Dernière intervention 9 septembre 2016 22
10 août 2016 à 12:59
0
TOT127 Messages postés 898 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 7 août 2018 95
Modifié par TOT127 le 10/08/2016 à 14:35
merci je vais lire ce lien

où dois je insérer qc du type "MonResultat = CLong(MaVar) * MaVar1" dans la macro?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
10 août 2016 à 13:17
Bonjour,

15 colonnes = 15 millions de cellules !!! Déraisonnable
Il faut limiter au strict nécessaire : les seules cellules qui contienne un texte non issu de formules :
    Dim pl As Range, c As Range
    On Error Resume Next
    Set pl = [A:O].SpecialCells(xlCellTypeConstants, xlTextValues)
    On Error GoTo 0
    If Not pl Is Nothing Then
        For Each c In pl
            Debug.Print c.Address ' ton traitement
        Next c
    End If
End Sub

et comme tu travailles sur feuille tu peux ajouter au début :
Application.Screenupdating=False
eric
1
TOT127 Messages postés 898 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 7 août 2018 95
10 août 2016 à 14:34
Je sais que c'est absurde tu as bien raison. :( Le problème c'est qu'on m'a envoyé ces données en excel. Après retraitement, je les mettrai sur stata (un logiciel de statistiques, notamment utile en épidémiologie etc) et ça devient des mini fichiers tout légers et rapides...mais entre temps, je dois faire ça.

Je viens d'essayer d'appliquer la macro, j'attends de voirr si ça marche. Elle est donc comme ça:

Sub macromaj()
Application.Screenupdating=False
Dim pl As Range, c As Range
On Error Resume Next
Set pl = [A:O].SpecialCells(xlCellTypeConstants, xlTextValues)
On Error GoTo 0
If Not pl Is Nothing Then
For Each c In pl
Debug.Print c.Address ' ton traitement
Next c
End If
End Sub



Le fait que je sois sur mac ne posera pas de problème ?



merci beaucoup!
0
TOT127 Messages postés 898 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 7 août 2018 95
10 août 2016 à 15:00
NB: en fait dans mon fichier, il n'y a des minuscules qu'en colonne B D et M. Et dans l'autre que en M.

Comment modifier la macro pour qu'il bosse que sur ça ?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
Modifié par eriiic le 10/08/2016 à 17:05
Pour 3 colonnes :
Sub macromaj()
    Dim pl As Range, c As Range
    Application.ScreenUpdating = False
    On Error Resume Next
    Set pl = Range("B:B,D:D,M:M").SpecialCells(xlCellTypeConstants, xlTextValues)
    On Error GoTo 0
    If Not pl Is Nothing Then
        For Each c In pl
            Debug.Print c.Address    ' ton traitement
        Next c
    End If
End Sub


PS : et si les cellules de tes 3 colonnes contiennent presque toutes des modif à faire il faudrait faire autrement pour qur ce soit presque instantané.
Est-ce le cas ?
Si oui est-ce uniquement des saisies ou y'a-t'il des formules dans les plages considérées ?

PS2 : si tu rentres dans ces critères :
Sub macromaj()
    Dim cols, col As Long, lig As Long, nblig As Long, datas
    
    cols = Array(2, 4, 15) ' mettre les colonnes concernées
    For col = 0 To UBound(cols)
        nblig = Cells(Rows.Count, cols(col)).End(xlUp).Row - 1
        datas = Cells(2, cols(col)).Resize(nblig).Value
        For lig = 1 To nblig
            If Not IsNumeric(datas(lig, 1)) Then datas(lig, 1) = UCase(datas(lig, 1))
        Next lig
        Cells(2, cols(col)).Resize(nblig, 1) = datas
    Next col
End Sub

pas sur à 100% pour Mac (?)
0
TOT127 Messages postés 898 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 7 août 2018 95
Modifié par TOT127 le 10/08/2016 à 17:54
Bonjour,
Aucune des celules de ma base n'a de formules, par contre, dans les colonnes concernées, l'intégralité de la colonne est à mettre en majuscule en effet.
JE vais essayer!

Juste une question: une macro comme ça va durer combien de temps ? Et comment savoir quand elle a fini ?

merci
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
Modifié par eriiic le 10/08/2016 à 18:15
Quand tu n'as plus le sablier c'est fini.
La 2nde possibilité sera très rapide, peut-être moins d'1 s.
0