Contrôler qu'une ligne est vide, à partir de la colonne C et jusqu'à la fin

re,

@Curulis57,

9.000 colonnes = problèmes de mémoire, donc un petit échantillon avec seulement 30.000 lignes et 1.000 colonnes

pousser le bouton "initialisation" et puis" plan_B" pour ma solution et puis "Inintialisation" et "Curulis57" pour votre solution.

Je suis surpris du résultat ...

PS. 20% des lignes sont supprimées, je ne sais pas si on modifie ce pourcentage, que cela change tout ?

inexplicable, avec 80% à supprimer, ma solution devient très lent, et Curulis

Salut BsAlv,

le chrono ne mentant pas, les autres étapes étant équivalentes, pas d'autre explication que le temps d'écriture et de calcul des formules!

re,

je sais, mais j'étais complètement convaincu que votre solution (ou du moins la partie "préparation") ne pouvait pas être plus rapide. C'est cela que je ne comprends pas. Bon, je me trompe, j'ai encore appris quelque chose.

Bonsoir à tous ,

J'ai fait un petit classeur qui permet de faire varier le nombre de lignes sources, le nombre de colonnes ainsi que le pourcentage de ligne à supprimer. La ligne de début des données (ligne 9) et la colonne de début (colonne C) ne sont pas modifiables.

Les résultats affichés à l'ouverture du fichier correspondent à 25 000 lignes sources, 9 000 colonnes et 20% de lignes à supprimer.

Il faut noter que c'est la fonction choisie qui va déterminer (en partie) les différences de durée d'exécution.

Les fonctions de BsAlv et curulis57 présentent un inconvénient selon moi. Elles considèrent que la constante chaine vide rend une cellule non vide. Les deux fonctions vont compter ces cellules comme étant non vides. Personnellement, je voulais éviter cela. J'ai donc trouvé un autre moyen qui considère les cellules avec cette valeur "vide" comme étant vides. Cette constante est souvent présente dans les tableaux excel, en particulier quand on copie une plage avec des formules SiErreur(xxxx ; "") et qu'on les colle en valeur. Les fonctions de comptage de Microsoft ont toujours du mal pour savoir comment traiter ces constantes chaine vides.

Dans la procédure Init du classeur, les trois cellules en jaune contiennent cette constante chaine vide.

re,

Les fonctions de BsAlv et curulis57 présente un inconvénient selon moi. 

là, vous avez raison, et aussi concernant "Les fonctions de comptage de Microsoft ont toujours du mal pour savoir comment traiter ces constantes chaine vides."

je sauvegarde ce sujet pour le future ...

Salut tout le monde,

très interpellant et intéressant, cette histoire de constante 'Chaîne vide'.
J'ignorais complètement . Merci pour l'info.

Bonne soirée!

re,

prochain episode du soap,

je modifie dans la macro de Curulis cette ligne pour compter les "chaines vides"

       If WorksheetFunction.CountIf(Range("C" & x).Resize(1, iCol - 2), "") = iCol - 2 Then tTab(x - 8, 1) = ""

et je suppose que je remplis désormais les conditions de mafraise. Il y a un point de discussion encore, cette macro vérifie toutes les cellules, même celles qui sont cachées. Avec ce "Find", on ignore les cellules cachées.

J'avais fait une regression sur les temps dans la plage O1:AA6 (ces valeurs de 9.000 colonnes sont celles de mafraise, parce que mon excel bloque avec ce nombre). Donc normallement, une augmentation du nombre de lignes et environ 20-25 fois plus important qu'une augmentation du nombre de colonnes. Donc je me demandais, si j'ajoutais ceci (vérifier par exemple 100 colonnes au lieu de +16.000) à la macro de mafraise, que cela aurait une (petite) influence, mais apparament non, ce que je ne comprends pas.

dercolval = 0: dercolval = .Rows(i).Resize(, derCol).Find(what:="*", SearchDirection:=xlPrevious).Column

Salut à tous,

@BsAlv, (pas sur de bien comprendre car je suis ça de loin) mais il y a des fonctions Excel qui ignorent automatiquement les cellules vides. Donc donner une plage avec ou sans cellules vides n'augmente pas le temps de calcul. Je sais que SUM par exemple en fait partie. Cf. VBA-Docs/excel/Concepts/Excel-Performance/excel-tips-for-optimizing-performance-obstructions.md at main · MicrosoftDocs/VBA-Docs · GitHub

J'imagine que mafraise utilise une d'entre elles.

@saboh12617,

merci pour ce lien intéressant. Je l'ai lu,, il y avaient quelques nouveautés, mais la plupart est connue.

Ici, mon approach est hors compétition, (dizaines de fois plus lent que mafraise et curulis, créer une formule dans une feuille et la copier 25.000 fois), mais entre eux, c'est la différence (en VBA) entre la fonction "Find" et la fonction "Worksheetfunction.CountA" ou worksheetfunction.CountIf". Cela cause une durée d'environ 5 sec avec une différence de 2 sec sur une plage de 25.000 lignes * 1.000 colonnes, donc peanuts, une discussion comparable à "qui vient en premier, la poule ou l'œuf".

Les 2 sont extrémement vite avec ces propres advantages/désadvantages

Bonjour BsAlv, saboh12617,

BsAlv à dit :

Avec ce "Find", on ignore les cellules cachées

C'est bizarre . Chez moi le FIND ne semble pas ignorer les colonne cachées mais je me trompe peut-être. Voir le fichier joint.

4test-find-v1.xlsm (22.49 Ko)

Re BsAlv ,

BsAlv a écrit :

"qui vient en premier, la poule ou l'œuf"

Moi je connais la réponse mais je le garde jalousement pour moi. Un petit dessin pour rire...

image

re,

j'ajoute ceci a la macro "Init"(la partie pour la plage O30:O50)

     Range("d9").Copy Range("d14")
     Range("d9").Copy Range("d19")
     Range("a9").Select

     With Range("O30:O50")                   'ajoute
          .Value = "X"
          .EntireColumn.Hidden = True
     End With

     MsgBox "Initalisation terminée !", vbInformation
End Sub

résultat, la macro "SupprLigne" ne peut pas supprimer les lignes 31, 36, 41 et 46 mais ...

macro "Curulis57" est correct sauf pour la ligne 46 (ce que je ne comprends pas)

Re BsAlv,

C'est de plus en plus étrange et difficilement compréhensible. Il va bientôt falloir passer un "master en bizarrerie" pour utiliser Excel.

Allez en début de macro on écrit Rows.Hidden=False et Columns.Hidden = False. Mais même avec ça, je ne suis pas certain que quelque chose d'inattendu ne puisse pas encore advenir. Je ne sais plus, je ne sais plus

Salut tout le monde,

@BsAlv : quand tu dis "Ligne 46", faut-il comprendre "46" en colonne [A] ?

Si c'est le cas, ici, elle disparaît !

A+

Rechercher des sujets similaires à "controler ligne vide partir colonne fin"