Posez votre question Signaler

Longueur de la variable String [VBA] [Résolu]

JPKOF - Dernière réponse le 14 oct. 2010 à 15:31
Bonjour à tous,
Je vous expose mon problème :
Dans une feuille de calcul que je reçois chaque semaine, il y a certaines lignes pour lesquelles la valeur de la case (i , 1) est nulle (ou vide).
Je voudrai supprimer toutes ces lignes.
J'ai bien trouvé une solution avec un :
nblig = Range("a65535").End(xlUp).Row 
For i = 2 To nblig 
    If Cells(i, 1) = 0 Or Cells(i, 1) = "" Then 
    Cells(i, 1).Delete Shift:=xlUp 
    End If 
Next i

Oui ça marche mais c'est trés trés long. Mon fichier faisant entre 60 000 et 65 000 lignes j'ai donc cherché une autre solution un peu plus compliquée (mais qui ne marche pas ... encore :p ) et surtout plus rapide dans l'éxécution :
Dim zonasup as string 
nblig = Range("a65535").End(xlUp).Row 
zonasup = "" 
For i = 2 To nblig 
    If Cells(i, 1) = 0 Or Cells(i, 1) = "" Then 
         If zonasup ="" then 
                zonasup = i & ":" & i 
         else: zonasup = zonasup & "," & i &":" & i 
         end if 
    End If 
Next i 
range(zonasup).Delete Shift:=xlUp 

L'idée est donc de stocker tous les numéros de lignes à supprimer pour pouvoir tout supprimer en une seule étape à la fin.
Cependant, lorsque je fais tourner la macro, ça plante justement à la ligne
range(zonasup).Delete Shift:=xlUp

Et lorsque je regarde le contenu de ma variable zonasup à ce moment la (via un espion) je tombe sur
"86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,327:327,328:328,329:329,330:330,331:331,332:332,333:333,334:334,336:336,337:337,33

Le point positif c'est que le contenu de la variable est écrit de la façon que je voulais, le point négatif c'est que cette variable ne semble stocker que 250 caractères (j'ai testé de copier coller dans une cellule excel et j'ai fait un NBCAR(...))
Le problème vient-il de la taille maximale de la variable string ?
J'espère avoir été suffisamment clair, peut être un peu trop pour quelque chose qui ne reste peut être, au fond, qu'un petit problème de string :)
Lire la suite 

Longueur de la variable String [VBA] »

19 réponses
Réponse
+1
moins plus
Bonjour,

Tu peux rester sur ta 1ère solution et ajouter devant :
Application.ScreenUpdating = False
à rétablir à = True après

Et si tes cellules sont vraiment vides (pas de formule) tu peux le faire sans boucle avec :
Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

eric
eriiic- 13 oct. 2010 à 14:23
au passage un truc bizarre :
For cptr = deplig To derlig
ça ne serait pas plutôt
For cptr = 2 To derlig ?

et en enlevant la ligne test = Cells(cptr, col + 1) tu gagnes encore 2 s (quand même, comme quoi les lectures sur feuille...)

eric
michel_m- 13 oct. 2010 à 14:29
re,

ne sachant pas au départ sur quelle ligne on commençait, j'avais mis deplig en constante (c'est plus visible pour le "client") mais on pourrait très bien la supprimer et mettre for cptr=2... tu as raison

et pour la ligne test = Cells(cptr, col + 1) tu as aussi tout à fait raison: c'était une variable temporaire pour essai que j'ai oublié d'enlever; ca m'apprendra à négliger option explicit
eriiic- 13 oct. 2010 à 15:04
Pour tester j'avais mis la constante tout en haut et je l'ai oubliée ensuite...
Je retire donc cette signalisation ;-)
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Sur 65000 lignes je ne garantis pas mais essaies:

range("A1:A65536").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

t'enlève les celules vides (pas celles avec des 0)

je regarde pour un autre truc et te dis...

Combien as tu de colonnes dans ton tableau ?

d'ores et déjà yu gagnerais un temps important avec cette ligne en début de macro:
application.screenupdating=false

JPKOF - 13 oct. 2010 à 11:21
Tout d'abord merci pour ton aide.
Ta fonction marche bien sur 65000 lignes et est autrement plus rapide que ma boucle.
Je cherche actuellement un moyen de l'adapter pour les cellules de valeur égale à 0.
Mon tableau a 9 colonnes (et la ligne 1 est réservée pour les entêtes de colonnes :) )
michel_m- 13 oct. 2010 à 12:13
re et bonjour Eriic

merci pour les 9 colonnes, ca va permettre de feinter!

je te propose un truc dès que possible
Ajouter un commentaire
Réponse
+0
moins plus
Bilan : ça marche trés bien,

Cependant, quitte à apprendre quelque chose aujourd'hui j'aurai quelques questions :

Quelle est la différence entre
derlig = Cells(Cells.Rows.Count, 1).End(xlUp).Row

et
derlig = Range("f65535").End(xlUp).Row


Que comprends VBA lorsqu'on appelle les varaibles
DIM tablo, valeur


Pourquoi stocker les valeurs dans la variable tablo en inversant les lignes et les colonnes ?

Par ailleurs, la macro marche mais des lignes vides apparaissent dorénavant en première position. Est ce normal ?
michel_m- 13 oct. 2010 à 17:49
1/ les 2 formules sont valables. mais comme XL2007 a plus d'un million de lignes, la 1° formule marche sur les versions 2007 et inférieure (comme tu travailles sur 65000 lignes on aurait pu écrire
Range("A65536")..).

2/ Dim tablo, valeur ==> variant
je connaissais pas le type des données en colonne A: toi,si, donc tu peux complèter.
pour le tablo je laisse toujours en variant car le type des données est variable;dans le 1° paramêtre(8,0) 1° rang peut -être en string, le 2° en single le 3° en date...

3/ je ne sais pas combien de lignes va avoir le tableau puisqu'à chaque condition remplie j'augmente 1 ligne au nombre de lignes par redim preserve tablo (8,cpr_t)...... cpr_t=cpr_t+1
Or on peut faire cela que sur le dernier paramêtre, d'où l'inversion lignes colonnes, d'où ensuite l'utilisation de la fonction Excel "transpose"

4/ lignes vides: sur ma maquette le n'ai pas ce problème. attention si tu as fait des adaptations à la réalité de ton classeur, des oublis ou maladresses (on sait tous faire) font des trucs tout drôles ou il ya le résultat d'une formule qui renverrait "" et peut-être que...


Les variables- tableaux sont indispensables lorsque tu as des tableaux géants comme les tiens car on quitte les feuilles XL (va et vient ecran, mémoire, processeur, mémoire, ecran) pour travaille en mémoire ram et peut ^tre en L2

Si ca t'intéresse, tu as un tuto très pédagogique écrit pas mon vieux copain Silkyroad sur Developpez.Com
http://silkyroad.developpez.com/vba/tableaux/

enfin, tu ne peux peut-être pas faire autrement mais Microsoft déconseille les databases XL de plus de 15000 lignes
http://office.microsoft.com/...
mais bof!

Voilà, je vais quand m^me regarder pour les lignes et je te fais signe si il y a un bug... sinon, bonne soirée et content pour toi si t'es débarrassé de ce problème
Cordialement
JPKOF - 14 oct. 2010 à 15:31
Merci beaucoup pour toutes ces informations.
J'ai vraiment cherché comment apparaissaient ces lignes vides.
A défaut de pouvoir prévenir, j'ai réussi a guérir en utilisant la formule que vous m'aviez donné en début de post, à savoir :
Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete 


DU coup le résultat obtenu est celui attendu dans un temps record (en ajoutant votre code à la suite du mien j'obtiens une macro qui tourne en moins de 30 sec).

Merci à tout les deux pour votre aide et à la prochaine
Ajouter un commentaire
Ce document intitulé « Longueur de la variable String [VBA] » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?