Mémoire insuffisante - code très simple

Bonjour à tous,

J’ai voulu créer une petite macro qui me semblait très simple au premier abord, je dois explorer toutes les cellules une colonne sur deux d’un tableau de 120 x 90 et enlever le signe « < » s’il y est, et marquer « LD » sur la colonne à côté.

Je débute en vba mais ayant déjà fait des macros un peu plus compliquées et surtout beaucoup plus lourdes sur le même pc je ne pensais pas être confronté à un problème de mémoire.

image

Il n’y a que ce tableau sur le fichier, aucune autre feuille, pas de formule, pas de forme, 6 caractères max par cellule, aucune cellule fusionnée sur la plage, rien d’autre ouvert sur le pc … certes des lignes inutiles au milieu mais ca ne devrait pas poser de problème. J’ai testé sur 2 pc c’est le même résultat. J'ai testé avec une variable Variant, pas mieux.

C’est systématiquement les lignes « cells.value = » qui plantent, dès le premier passage. Ca ne modifie même pas la première cellule. Quand je mets ces 2 lignes en commentaire le code parcourt bien tout le tableau.

Je trouve quand même incroyable de ne pas réussir à changer la valeur d’une cellule, même en codant avec les pieds… Quelqu’un aurait-il une idée pour solutionner ce problème ? Les propositions trouvées sur d’autres topics ne semblent pas correspondre.

Sub test()

Dim i, j As Integer
Dim contenu As String

 For i = 7 To 95
 j = 5
     For j = 5 To 67
     contenu = Cells(i, j).Value
         If Left(contenu, 1) = "<" Then
            contenu = Replace(contenu, "<", "")
            Cells(i, j).Select
            Cells.Value = contenu
            ActiveCell.Offset(0, 1).Select
            Cells.Value = "LD"
            ActiveCell.Offset(0, -1).Select
        End If
    j = j + 2
    Next
    i = i + 1
Next

End Sub

Merci à vous

Bonjour,

Cela vient je pense de cette ligne : Cells.Value = contenu

Cells représente la collection de l'ensemble des cellules d'une feuille Excel, soit pour vous en version 2019 environ 32000 colonnes par 1 000 000 de lignes !
en effet il n'y a pas assez de mémoire !

@ bientôt

LouReeD

Bonjour,

sinon pour votre code :

Sub test()
    Dim i, j As Integer
    For i = 7 To 95 Step 2
        For j = 5 To 67 Step 3
            If Left(Cells(i, j).Value, 1) = "<" Then
                Cells(i, j).Value = Replace(Cells(i, j).Value, "<", "")
                Cells(i, j).Value.Offset(0, 1).Value = "LD"
            End If
        Next j
    Next i
End Sub

A savoir, avec le STEP on peut faire des boucles avec le "pas" que l'on veut en positif ou en négatif, ceci évite d'ajouter un "i = i +1" dans le code.

Comme j'ai vu un "j = j + 2", j'en ai déduit qu'il y avait un pas de 3 pour les colonnes.
Sur une ligne DIM, le type ne s'applique pas à toutes les variables de la ligne, donc ici vous avez le J en Integer et le i en Variant, est-ce votre but ?
Sinon il faut faire : Dim i As Integer, j As Integer
Mais comme i est pour les lignes il est plus "sécurisé" de le mettre en long car il peut y avoir plus de 32000 lignes utilisées ! Donc : Dim i As Long, j As Integer

@ bientôt

LouReeD

Bonjour à tous!

Thorfin, LouReeD,

Comme ceci peut-être

Sub test()
Dim i, j As Integer
Application.ScreenUpdating = False
lig = 7
 For i = 7 To 95
      For j = 5 To 67
            If Left(Cells(lig, j), 1) = "<" Then
            Cells(lig, j).Offset(0, 1) = "LD"
         End If
      Next j
    lig = lig + 1
Next i
Range("E7:CH140").Replace What:="<", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=False
Application.ScreenUpdating = True
End Sub

j = 5

For j = 5 To 67

je ne comprends pas ??? et ensuite vous faites j = j + 2 à la fin

vous voulez sauter 2 colonnes ?

For j = 5 To 67 step 2

Bonne journée !

Désolé LouReeD, je viens de voir ton code après avoir posté

Merci à vous 2 !

Effectivement en précisant cells(i, j).value il n'y a plus de problème de mémoire.

Je peux maintenant identifier d'autres problèmes :)

Je veux faire une colonne sur deux, si j=5 au début, je passe a j=7 ensuite etc ... je ne connaissais pas l'astuce STEP

Merci encore pour la pédagogie ! bonne continuation

Et oui moi j'ai parlai d'un pas de trois car si j=5, à la fin on a j = j+2 donc j=7, mais il y a le next j qui incrémente par défaut de 1, donc le j suivant = 8, on a bien le step + 3...

@ bientôt

LouReeD

Rechercher des sujets similaires à "memoire insuffisante code tres simple"