Erreur Mémoire insuffisante. Comment optimiser - VB/VBA/VBS - Programmation
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 …
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 ‼
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() |
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 ?
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 ²
une variable string est limité en taille... mais c'est largement suffisant normalement pour ce que tu dois faire.
Marsh Posté le 04-04-2013 à 16:02:09
Un tite fonction rapide :
Citation : |
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" )
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 :
|
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 …
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
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.
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 ?‼
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.
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 :
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 :
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