Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2072 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Erreur Mémoire insuffisante. Comment optimiser

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur Mémoire insuffisante. Comment optimiser

n°2183883
kamembert
Posté le 03-04-2013 à 19:19:42  profilanswer
 

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

mood
Publicité
Posté le 03-04-2013 à 19:19:42  profilanswer
 

n°2183985
Marc L
Posté le 04-04-2013 à 10:58:27  profilanswer
 

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

n°2184038
Xxxaaavvv
Posté le 04-04-2013 à 12:50:16  profilanswer
 

Pourquoi mettre la liste dans une seule cellule ?

n°2184041
Marc L
Posté le 04-04-2013 à 12:58:55  profilanswer
 

 
            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 ‼
 

n°2184106
kamembert
Posté le 04-04-2013 à 15:09:18  profilanswer
 

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
n°2184125
Xxxaaavvv
Posté le 04-04-2013 à 15:52:56  profilanswer
 

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
n°2184128
Xxxaaavvv
Posté le 04-04-2013 à 16:02:09  profilanswer
 

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
n°2184138
Marc L
Posté le 04-04-2013 à 16:26:00  profilanswer
 

 
           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 …
 

n°2184153
rufo
Pas me confondre avec Lycos!
Posté le 04-04-2013 à 16:44:58  profilanswer
 

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
n°2184157
Xxxaaavvv
Posté le 04-04-2013 à 16:48:21  profilanswer
 

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.

mood
Publicité
Posté le 04-04-2013 à 16:48:21  profilanswer
 

n°2184158
Marc L
Posté le 04-04-2013 à 16:49:13  profilanswer
 

 
           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 ?‼
 
       

n°2184216
kamembert
Posté le 04-04-2013 à 19:32:29  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Erreur Mémoire insuffisante. Comment optimiser

 

Sujets relatifs
Eclipse - message "erreur" EGITIntégrations de js avec Joomla - Erreur de MIME
Erreur d execution 432 nom du fichier ou de la classe introuvable lorsprobleme d' erreur synthaxique sur Python
Erreur 500[DELPHI] Idhttp : bad getaway erreur 502...
Erreur de compilation : expected expression before ‘%’ tokenErreur impossible à gérer
Corriger erreur php: modification de base donnéesErreur sur un script PHP affichant plusieurs
Plus de sujets relatifs à : Erreur Mémoire insuffisante. Comment optimiser


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR