Longueur de la variable String [VBA]
Résolu/Fermé
A voir également:
- Longueur de la variable String [VBA]
- Vba concatenate string and integer ✓ - Forum VB / VBA
- Impossible de créer le fichier de travail. vérifiez la variable d'environnement temp ✓ - Forum Word
- Cannot access offset of type string on string - Forum PHP
- L'indice n'appartient pas à la sélection vba ✓ - Forum Programmation
3 réponses
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 256
13 oct. 2010 à 11:13
13 oct. 2010 à 11:13
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
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
michel_m
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
Modifié par michel_m le 13/10/2010 à 11:14
Modifié par michel_m le 13/10/2010 à 11:14
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
Michel
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
Michel
michel_m
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
13 oct. 2010 à 12:13
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
merci pour les 9 colonnes, ca va permettre de feinter!
je te propose un truc dès que possible
Bilan : ça marche trés bien,
Cependant, quitte à apprendre quelque chose aujourd'hui j'aurai quelques questions :
Quelle est la différence entre
et
Que comprends VBA lorsqu'on appelle les varaibles
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 ?
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
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
Modifié par michel_m le 13/10/2010 à 17:50
Modifié par michel_m le 13/10/2010 à 17:50
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
https://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/fr-ch/excel-help/utilisation-d-access-ou-d-excel-pour-gerer-vos-donnees-HA001042918.aspx
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
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
https://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/fr-ch/excel-help/utilisation-d-access-ou-d-excel-pour-gerer-vos-donnees-HA001042918.aspx
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
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 :
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
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
13 oct. 2010 à 11:19
Concernant les cellules "vraiment vides" : elles le sont vraiment et la fonction que tu me proposes marche donc bien.
Cependant la cellule avec formule pour lesquelles la veleur de la formule est nulle affichent "0"
je test une formule équivalent avec xlCellTypeNull mais ça ne marche pas :)
Merci pour ton aide
Modifié par eriiic le 13/10/2010 à 12:31
Je n'avais pas rafraichi, salut michel, on est bien phase... :-)
xlCellTypeNull c'était bien tenté... ;-)
Après avoir supprimé les vides avec xlCellTypeBlanks je te propose d'utiliser le filtre automatique pour accelerer le traitement :
Cells.AutoFilter Field:=1, Criteria1:="0"
Rows("2:65536").Delete Shift:=xlUp
Selection.AutoFilter Field:=1
Je te laisse tester le gain sur un grand fichier, à toi de dire...
eric
13 oct. 2010 à 12:42
Donc, en guise d'apéro
temps pour 7500 lignes DonT 4100 vides ou 0: environ 0,9 secondes (512 mo de ram)
principe; je récolte les lignes non vides ou 0 dans un tableau-array et je restitue en supprimeant auparavant les données originelles
Eric ta solution est astucieuse mais est ce que ca masque sans détruire les lignes vides (suis faché betement avec les filtres) ?
Modifié par eriiic le 13/10/2010 à 13:09
Ca affiche les 0 et supprime ces lignes, les vides sont traités auparavant avec xlCellTypeBlanks .
J'ai testé sur 59400 lignes, tu es plus rapide (11s au lieu de 23s) mais il reste les 0 chez toi (???).
Il doit manquer qcq chose...
eric
Modifié par eriiic le 13/10/2010 à 13:36