Effacer cellules vides dans les colonnes

Bonjour,

J'ai une feuille qui contient beaucoup de données et je doit effacer les cellules vides et déplacer les colonnes entre des lignes précises vers la gauche.

J'utilise le code suivant mais c'est très lent.

        Set rng = Feuil1.Range(Feuil1.Cells(Feuil1.Range("A4").Row, Feuil1.Range("A4" ).Column), Feuil1.Cells(9800, 21))
       rng.SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft

Comment remplacer le

SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft

Y-a-t-il une façon de faire plus rapide.

Merci,

Oiseau bleu

Bonsoir,

le soucis de la suppression vers la gauche, c'est qu'il y a déplacement des cellules "entières" avec mise en forme etc.
Si une cellule sur la gauche d'une ligne est vide, est-ce les cellules qu'il faut déplacer ou bien les données ?

Si ce n'est que les données alors par VBA et quelques boucle cela devrait être plus rapide.

On récupère les données de D4:U9800 dans un tableau VBA.
On boucle chaque ligne de ce tableau et on rempli un tableau Résultat qui par ligne ne comporte pas de cellule vide "à gauche".
On efface les données de D4:U9800.
On "injecte" le tableau résultat sur la feuille à partir de D4.

Tout ceci se déroulera en mémoire vive sans accès feuille du coup c'est beaucoup plus rapide !

Et pour que cela soit encore plus rapide, un petit fichier exemple serait le bien venu.

Maintenant s'il faut garder les mise en forme des cellules...

@ bientôt

LouReeD

Bonjour,

J'ai crée un petit exemple de fichier pour représenter ce que je veux.

Vous avez un onglet Résultat attendu pour représenter le résultat que j'attends après la conversion de l'onglet À convertir.

L'onglet À convertir représente des données qui ont été copiées et où il y a des colonnes qui doivent être supprimées.

Faire attention à partir de la ligne 247 les données de la colonne L sont rendus en colonne M.

J'utilise le code VBA suivant pour faire le travaille mais c'est très long.

        Set rng = Feuil1.Range(.Cells(.Range("A2").Row, .Range("A2" ).Column), .Cells(328, 16))
       rng. SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft

Merci pour la réponse reçue; mais je ne sais pas vraiment travailler avec une table.

Alors comment convertir tout ça en un code qui est rapide d'exécution???

Merci,

Oiseau bleu

2colonnes.xlsx (180.33 Ko)

Voici le résultat, c'est quasi instantané, mais ceci supprime les mise en forme, chaque donnée est une donnée en dur.

Le fichier :

3colonnes-lrd.xlsm (39.85 Ko)

un bouton sur votre feuille source, un résultat sur la feuille LRD. Ouverture du fichier sur LRD pour montrer qu'elle est vide.

Avec ce système peu importe si les colonnes de données changent, puisque l'on supprime les cellules vides.
Le code est commenté a minima, si vous avez des question n'hésitez pas.

@ bientôt

LouReeD

Merci pour votre réponse.

J'ai un erreur 6 dépassement des capacités avec le code

TableauSource = ActiveSheet.UsedRange

Que faire?

Merci à vous

Bonsoir,

Avez vous fait le pas à pas pour connaitre la ligne qui provoque l'erreur ?

Sinon, au lieu de jouer avec un tableau à deux dimensions, où apparemment dans votre cas VBA ne sait pas gérer la taille à cause du grand nombre de cellule, on pourrait faire un tableau avec autant de tableau que de lignes de votre feuille source et ensuite on rempli un tableau résultat contenant autant de tableaux que de lignes.

Cette erreur peut également venir par un manque de mémoire disponible, donc opération à faire sans rien d'autre à tourner sur l'ordinateur...

J'attends de connaitre si l'erreur vient de UsedRange ou bien d'ailleurs... Vous pouvez par sécurité définir le I et le J en "As Long"

@ bientôt

LouReeD

Oui, j'ai fait le pas à pas avec F8 et dès que j'ai atteint cette ligne le message s'est affiché.

C'était le seul fichier que j'avais en mémoire.

Merci.

Essayez ce code :

Sub Contract2()
    Dim TabS(), TabR(), I As Long, J As Long, NbLigne As Long, NbColonne As Long
    Dim Cr As Long

    NbLigne = ActiveSheet.Range("F" & Rows.Count).End(xlUp).Row
    NbColonne = ActiveSheet.UsedRange.Columns.Count

    ReDim TabR(1 To NbLigne, 1 To NbColonne)
    Lr = 1
    For I = 1 To NbLigne
        TabS = Range(Cells(I, 1), Cells(I, NbColonne))
        Cr = 1
        For J = 1 To NbColonne
            If TabS(1, J) <> "" Then
                ' on inscrit la donnée dans le tableau résultat
                TabR(Lr, Cr) = TabS(1, J)
                Cr = Cr + 1 'on prépare l'écriture de la prochaine donnée même ligne colonne suivante
                ' on a inscrit au moins une donnée sur la ligne Lr du tableau résultat
                Inscrit = True
            End If
        Next J
        ' si on a incrit une donnée, alors on passe à la ligne suivante du tableai résultat
        If Inscrit Then Lr = Lr + 1
    Next I
    Sheets("LRD").Range("A1").Resize(UBound(TabR), NbColonne) = TabR

End Sub

En fait il découpe la feuille source en ligne, et chaque ligne résultat est un tableau, ensuite il copie colle le tableau résultat.
Comme cela on a pas à mettre la totalité des cellules de votre plage.

Merci de votre retour. Si vous avez besoin de précisions...

@ bientôt

LouReeD

Bonjour,

TabS = Range(Cells(I, 1), Cells(I, dercol2))

Quand I a la valeur de 5150 , donc à la 5150ième ligne, j'ai une erreur 6 dépassement de capacité

Exécution pas à pas avec aucun fichier en mémoire.

Mon fichier a 14000 lignes et 21 colonnes.

Merci.

Essayez ceci :

remplacez :

        ' si on a incrit une donnée, alors on passe à la ligne suivante du tableai résultat
        If Inscrit Then Lr = Lr + 1
    Next I

par :

        ' si on a incrit une donnée, alors on passe à la ligne suivante du tableai résultat
        If Inscrit Then Lr = Lr + 1
        Inscrit = False
        Erase TabS
    Next I

Je viens de me faire un fichier de plus de 17700 lignes en copiant collant les données de votre fichier exemple et sur 24 colonnes et cela fonctionne avec ou sans le Erase. Le Inscrit = False permet de supprimer les lignes vides sur la feuille résultat.

Le fichier :

3colonnes-lrd.zip (1.27 Mo)

@ bientôt

LouReeD

Un grand merci à vous pour votre persévérance à trouver une solution.

Cela fonctionne très bien avec votre dernière réponse.

Je me suis rendu compte que la colonne B était définie en format Date et qu'à la ligne 5150 avec le nombre qui était mis dans cette cellule cela donnait des ################## dans la cellule et donnait une erreur de dépassement de capacité encore.

Mais avec votre correction et la modification du format de la colonne B en format standard cela fonctionne parfaitement et rapidement.

De nouveau un grand merci à vous, votre aide m'a été très précieuse et je vous félicite.

Oiseau bleu

Bonsoir,

merci pour votre retour et remerciement !
Bon courage pour la suite de votre projet.

@ bientôt

LouReeD

Rechercher des sujets similaires à "effacer vides colonnes"