Erreur Mémoire insuffisante. Comment optimiser

Erreur Mémoire insuffisante. Comment optimiser - VB/VBA/VBS - Programmation

Marsh Posté le 03-04-2013 à 19:19:42    

Bonjour à tous.
 
Je viens d'écrire une macro toute bête pour manipuler une liste de numéros de téléphones que  je veut remettre en forme, mais lorsque j'en manipule trop à la fois j'ai une erreur "mémoire insuffisante".
Je pense que mon code doit pouvoir être optimisé (je ne suis pas vraiment un spécialiste du VBA. C'est la première fois que j'y retouche depuis 2 ans)
 
En gros j'ai une liste de numéros de téléphones ou il y a un numéro par ligne, au format international (donc avec l'indicatif du pays en +33 pour la France par exemple)
Je veut obtenir une liste de tous ces numéros collés les uns à la suite des autres, séparés par un point-virgule. (+33num1;+22num2;+21num3;33num4 etc...)
 
Voila ma Macro :
 

Citation :

Sub extraction_num_tel()
'
' extraction_num_tel Macro
' Macro enregistrée le 03/04/2013 par doazanjf
'
 
'
    Dim ligne As Integer
    Dim nb_ligne As Integer
    Dim fin As Integer
    Dim debut As Integer
    Dim destination As String
     
    ligne = InputBox("Veuillez entrer le numéro de la première ligne", "Ligne de départ" )
    nb_ligne = InputBox("Veuillez saisir le nombre de lignes à traiter", "Nombre de lignes" )
    destination = InputBox("Veuillez entrer la cellule dans laquelle inscrire la liste. Par exemple A3 ou bien E6" )
    fin = ligne + nb_ligne
    debut = ligne
    While ligne <= fin
        Range(destination).Value = Range(destination) + (Cells(ligne, 8) + ";" )
        ligne = ligne + 1
    Wend
    MsgBox ("Les numéros de téléphone de la ligne " & debut & " a la ligne " & fin & " ont été recopiés en cellule " & destination)
 
End Sub


 
Si je la lance sur 10 lignes, ça marche parfaitement
En revanche si je la lance sur 100 lignes j'ai l'erreur "Mémoire insuffisante"
 
Dans le débogage il me dit que ça plante la :
 

Citation :

Range(destination).Value = Range(destination) + (Cells(ligne, 8) + ";" )


 
Donc j'en déduit qu'à partir du moment ou il y a trop d'infos dans la cellule "destination" il plante.
Y'a-t-il un moyen d'optimiser ce code pour qu'il fonctionne même en traitant un grand nombre de lignes
Un minimum de 500 lignes serait l'idéal
 
 
 
Merci d'avance pour votre aide

Reply

Marsh Posté le 03-04-2013 à 19:19:42   

Reply

Marsh Posté le 04-04-2013 à 10:58:27    

 
           Bonjour,   il faudrait changer de cellule avant d'atteindre la limite du nombre maximal de caractères dans une cellule …
 

Reply

Marsh Posté le 04-04-2013 à 12:50:16    

Pourquoi mettre la liste dans une seule cellule ?

Reply

Marsh Posté le 04-04-2013 à 12:58:55    

 
            Parce que …   il n'a pas tout dit !
 
            Je trouve idiot de coller des milliers de caractères dans une cellule car c'est illisible et inexploitable !
            Donc ce n'est qu'une étape intermédiaire, cela sent le bricolage pour une moulinette …
 
            Et si la finalité est bien de créer un fichier délimité, cette étape est inutile, autant directement créer le fichier ‼
 

Reply

Marsh Posté le 04-04-2013 à 15:09:18    

Oui, Marc a bien compris.
 
Je dois récupérer ces numéros pour les rentrer ensuite dans une autre application qui permet l'envoi de SMS à une liste.
Seulement pour ce faire, le logiciel en question n'accepte les numéros que sous cette forme. A savoir une liste avec tous les numéros les uns à la suite des autres, séparés par un point virgule.
 
J'ai donc modifié mon code pour qu'il écrive directement dans un fichier .txt et ça fonctionne.
Voila le nouveau code :
 

Citation :

Sub extraction_num_tel()
'
' extraction_num_tel Macro
' Macro enregistrée le 03/04/2013 par doazanjf
 
' Cette macro permet d'extraire le numéro de téléphone sur chacune des lignes pour ensuite les concaténer dans un fichier texte en les séparant par
' un point virgule.
 
'
    Dim ligne As Integer
    Dim nb_ligne As Integer
    Dim fin As Integer
    Dim debut As Integer
    Dim destination As String
    Open "D:\donnees\uti\prive\Documents\doazanjf\liste_numeros.txt" For Output As #1
     
    ligne = InputBox("Veuillez entrer le numéro de la première ligne", "Ligne de départ" )           ' Ouvre une boite de dialogue demandant le numéro de la première ligne à traiter
    nb_ligne = InputBox("Veuillez saisir le nombre de lignes à traiter", "Nombre de lignes" )        ' Demande le nombre de ligne à traiter
    ' destination = InputBox("Veuillez entrer la cellule dans laquelle inscrire la liste. Par exemple A3 ou bien E6" ) ' Demande la case dans laquelle écire le résultat
    fin = ligne + nb_ligne                                                                          ' Calcule le numéro de la dernière ligne à traiter
    debut = ligne                                                                                   ' Enregistre le numéro de la première ligne traitée
    While ligne <= fin                                                                              ' Tant que la valeur de la ligne en cours de traitement est inférieure à la dernière ligne, on reste dans la boucle
       ' Range(destination).Value = Range(destination) + (Cells(ligne, 8) + ";" )                     ' On ajoute dans la cellule de destination la valeur de la case en cours de traitement
        Print #1, Cells(ligne, 8) & ";"
        ligne = ligne + 1                                                                           ' On incrémente le compteur pour traiter la ligne suivante
    Wend
    Close #1
    MsgBox ("Les numéros de téléphone de la ligne " & debut & " a la ligne " & fin & " ont été recopiés dans le fichier texte" ) ' On informe du bon déroulement, du n° de la première et dernière ligne traitée et de la case ou les résultats sont écrits
 
End Sub


 
Mon seul souci c'est qu'après chaque numéro il fait un retour chariot.
Je cherche donc à faire la même chose sur une seule ligne.
 
Des suggestions ?


Message édité par kamembert le 04-04-2013 à 15:09:41
Reply

Marsh Posté le 04-04-2013 à 15:52:56    

Donc si je résume,
tu fais une interface de saisie dans excel pour pondre une liste dans un fichier txt avec séparateur virgule ?
 
-> Cumule ta liste dans une variable String.
-> et ensuite, et uniquement à la fin tu écris ta variable dans le fichier.
 
pourquoi faire simple :o²
 
une variable string est limité en taille... mais c'est largement suffisant normalement pour ce que tu dois faire.


Message édité par Xxxaaavvv le 04-04-2013 à 15:53:08
Reply

Marsh Posté le 04-04-2013 à 16:02:09    

Un tite fonction rapide :

Citation :


Function fConcatenation(strRange As String) As String
 
   Dim objCell As Range
   Dim strListe As String
 
   strListe = ""
   
   For Each objCell In ThisWorkbook.ActiveSheet.Range(strRange)
      If Trim(strListe) = "" Then
         strListe = objCell.Value
      Else
         strListe = strListe & ";" & objCell.Value
      End If
   Next objCell
   
   fConcatenation = strListe
 
End Function


 
Si tu veux la concaténation de la cellule A1 jusqu'à la cellule A40
il suffit d'appeller fConcatenation("A1:A40" )  
 
donc ton fichier tu peux l'obtenir avec un :
 
Print #1, fConcatenation("A1:A40" )


Message édité par Xxxaaavvv le 04-04-2013 à 16:07:12
Reply

Marsh Posté le 04-04-2013 à 16:26:00    

 
           Suggestion :  dire au "Print #" de ne pas passer à la ligne, peut-être par l'ajout d'un point-virgule à la fin :

     Print #1, Cells(ligne, 8) & ";" ;


           Sinon une solution globale plus rapide :

Code :
  1. Sub ExtractNumTel()
  2.     Const LF = vbLf & vbLf & vbLf
  3.     DEB = Val(InputBox(LF & " Numéro de la première ligne :", "   Ligne de départ" ))
  4.     If DEB = 0 Then Exit Sub
  5.     FIN = DEB - 1 + Val(InputBox(LF & " Nombre de lignes à traiter :", "   Nombre de lignes" ))
  6.     If FIN <= DEB Then Exit Sub
  7.  
  8.     ReDim TN(DEB To FIN)
  9.     For R = DEB To FIN:  TN(R) = Cells(R, 8):  Next
  10.  
  11.     R = FreeFile
  12.     Open "D:\donnees\uti\prive\Documents\doazanjf\liste_numeros.txt" For Output As #R
  13.     Print #R, Join(TN, ";" )
  14.     Close #R
  15.  
  16.     MsgBox "Les numéros de téléphone de la ligne " & DEB & _
  17.            " à la ligne " & FIN & " ont été recopiés dans le fichier texte."
  18. End Sub


           Maintenant si c'est pour exporter l'intégralité des numéros, le premier numéro étant toujours situé dans la même cellule,
           il n'est pas difficile avec la proprété  End  de détecter la cellule du dernier numéro afin d'effectuer l'export sans rien demander …
 

Reply

Marsh Posté le 04-04-2013 à 16:44:58    

Pour info, des données sur des lignes, les colonnes séparées par des ;, ça s'appelle du CSV. Suffit d'enregistrer ton fichier Excel au format CSV (disponible dans Excel depuis la v1) et puis c'est tout :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-04-2013 à 16:48:21    

rufo a écrit :

Pour info, des données sur des lignes, les colonnes séparées par des ;, ça s'appelle du CSV. Suffit d'enregistrer ton fichier Excel au format CSV (disponible dans Excel depuis la v1) et puis c'est tout :/


Le CSV n'étant pas un standard, j'ai eu droit à des surprises concernant l'enregistrement de fichier excel en pseudo "format" CSV (sauce microsoft).
Dans son cas, ça ne devrait pas poser problème normalement.

Reply

Marsh Posté le 04-04-2013 à 16:48:21   

Reply

Marsh Posté le 04-04-2013 à 16:49:13    

 
           Sur le principe rufo, tu as raison, mais pour y avoir aussi pensé, qui te dit qu'il n'y a pas d'autres données dans la feuille
           vu qu'il s'agit uniquement d'une exportation de numéros de téléphone ?‼
 
       

Reply

Marsh Posté le 04-04-2013 à 19:32:29    

Merci à tous pour vos réponses.
 
J'ai utilisé la fonction que Marc_L m'a fournie et ça fonctionne parfaitement.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed