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

TOT127 Messages postés 1045 Statut Membre -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
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

2 réponses

  1. Ant049 Messages postés 157 Statut Membre 22
     
    Bonjour,

    Sous quelle version d'Excel est enregistrée ton fichier ?
    1
    1. TOT127 Messages postés 1045 Statut Membre 96
       
      BOnjour,
      j'ia excel 2011 pour mac
      0
    2. TOT127 Messages postés 1045 Statut Membre 96
       
      (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
    3. TOT127 Messages postés 1045 Statut Membre 96
       
      merci je vais lire ce lien

      où dois je insérer qc du type "MonResultat = CLong(MaVar) * MaVar1" dans la macro?
      0
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. TOT127 Messages postés 1045 Statut Membre 96
       
      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
    2. TOT127 Messages postés 1045 Statut Membre 96
       
      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
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    4. TOT127 Messages postés 1045 Statut Membre 96
       
      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
    5. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Quand tu n'as plus le sablier c'est fini.
      La 2nde possibilité sera très rapide, peut-être moins d'1 s.
      0