bug PC à cause d'une macro - VB/VBA/VBS - Programmation
Marsh Posté le 05-02-2013 à 13:59:42
Si la cellule ne commence pas par D, Alors on supprime la ligne, et on décrémente i pour reprendre correctement le parcours des lignes
Si 3 cellules consécutives sont vides (c'est-à-dire qu'on est à la fin du tableau) Alors on sort du For
Marsh Posté le 05-02-2013 à 13:59:56
For each et like doivent utiliser pas mal de mémoire je pense.
Tu devrais essayer avec une boucle type do ... loop et à la place du like "D*" faire un left(cells(i,1).value, 1) = "D".
Code :
|
Y a sûrement des erreurs dans mon code, je l'ai écrit directement dans le post.
Marsh Posté le 05-02-2013 à 14:02:16
je n'ai pas LigneMax, vu que le tableau ne sera pas toujours de la même taille...
Marsh Posté le 05-02-2013 à 14:08:41
Tu peux la trouver comme ça :
(la colonne est à adapter) :
Code :
|
1048576 à partir d'excel 2007, 65536 avant.
Ca revient à te positionner tout en bas de l'onglet et de faire ctrl + flèche du haut => ça t'emmène à la dernière cellule renseignée.
Marsh Posté le 05-02-2013 à 14:17:34
alors... j'ai fait :
Code :
|
et mon PC a redémarré...
Marsh Posté le 05-02-2013 à 14:33:06
et le problème vient de cette partie du code, vu que si je mets le do loop en commentaire, ça fonctionne... Là j'ai eu mon écran qui a "clignoté un peu", puis mon PC a redémarré...
Marsh Posté le 05-02-2013 à 14:52:29
erreur stupide j'ai fait
Marsh Posté le 05-02-2013 à 14:53:47
Tu as encore le problème ?
Marsh Posté le 05-02-2013 à 14:55:04
Tu ferais mieux de partir de la première colonne de la première ligne et scanner le contenu et voir s'il est non nul (ou prendre une autre colonne), passer à la suivante jusqu'à trouver la dernière ligne de ton tableau.. Ca devrait aller plus vite que de partir de la fin du nb de lignes max d'Excel
Marsh Posté le 05-02-2013 à 14:57:49
Il y a une grosse erreur de "logique" dans le dernier code ‼ Personnellement je préfères une boucle comme dans le premier …
Ensuite, c'est parfois risqué de travailler avec Selection sans contrôle au préalable.
De plus je note le même souci de logique avec un coup i = i - 1 puis plus bas i = i + 1 ...
Sans code plus exhaustif ni une explication claire des besoins, je ne pourrais aider …
Marsh Posté le 05-02-2013 à 15:00:15
Code :
|
A oovaveoo : ben je pense qu'il boucle à l'infini car MsbBox de ligneMax me renvoie 757 alors que ma dernière ligne 754
A rufo : c'est ce que j'avais fait au début avec
Code :
|
mais ça ne marchait pas...
en fait, j'ai des lignes vides dans mon tableau, donc je suis obligée de faire un test sur au moins deux cellules vides consécutivement
Marsh Posté le 05-02-2013 à 15:00:59
rufo a écrit : Tu ferais mieux de partir de la première colonne de la première ligne et scanner le contenu et voir s'il est non nul (ou prendre une autre colonne), passer à la suivante jusqu'à trouver la dernière ligne de ton tableau.. Ca devrait aller plus vite que de partir de la fin du nb de lignes max d'Excel |
C'est ce qu'on fait dans excel et normalement c'est immédiat.
Marc L a écrit : |
La boucle du premier avec For Each ?
Marsh Posté le 05-02-2013 à 15:02:02
Marc L a écrit : |
Bah sur mon code du début, je fais i-1 lorsque je supprime une ligne, car sinon je louperais des lignes, puis après j'incrémente... ce n'est pas une erreur de logique
Marsh Posté le 05-02-2013 à 15:03:14
si je supprime la ligne 3 par exemple, la ligne 4 va prendre la place de la ligne 3. Donc je dois décrémenter i quand je supprime, et l'incrémenter à la fin de ma boucle
Marsh Posté le 05-02-2013 à 15:06:15
Marc L a écrit : |
Les besoins, je les ai mis plus haut :
Citation : Si la cellule ne commence pas par D, Alors on supprime la ligne, et on décrémente i pour reprendre correctement le parcours des lignes |
je pense que c'est plutot clair non?
Marsh Posté le 05-02-2013 à 15:07:56
Comme ça sinon :
Code :
|
Marsh Posté le 05-02-2013 à 15:10:21
+1 avec oovaveoo, j'étais pratiquement en train de poster le même code !
Marsh Posté le 05-02-2013 à 15:10:58
Et pour les 3 lignes vides, tu ajoutes un compteur :
Code :
|
Marsh Posté le 05-02-2013 à 15:14:22
je vais essayer! si je mets du temps à répondre, c'est que mon PC a planté!
Marsh Posté le 05-02-2013 à 15:17:26
Au contraire vu que les bornes sont cette fois bien définies et non modifiées en cours de route !
Dans le cas de suppression de lignes, il faut remonter vers le haut pour ne pas avoir de souci …
A tous, mieux vaut éviter de mettre en dur le numéro de la dernière ligne car lorsque l'on change de version d'Excel …
… et qu'il est extrêmement simple de l'obtenir : Rows.Count !
Code :
|
Marsh Posté le 05-02-2013 à 15:22:18
bon... je viens de redémarrer...
Code :
|
il faut pas plutot mettre :=xldown?
parce que imaginons :
la macro supprime la dernière ligne du tableau (749) car la cellule est de type "----". Donc la ligne 750 qui est vide va prendre la place de la 749, et la macro boucle dessus... non?
Marsh Posté le 05-02-2013 à 15:28:58
Marc L a écrit :
|
C'est noté
minimoack a écrit : bon... je viens de redémarrer...
|
Ben non, essaye tu verras.
Marsh Posté le 05-02-2013 à 15:31:53
je ne sais pas vraiment pourquoi... mais avec xlUp il m'éteignait systématiquement l'ordi, et avec xlDown non... j'ai tout ce que je veux là... ben Merci pour votre aide
Marsh Posté le 05-02-2013 à 15:47:31
Un dernier petit truc :
je souhaite faire un for pour supprimer la récurrence des entêtes des colonnes dans mon tableau. Vaut-il mieux utiliser celui que vous m'avez montré, et l'alourdir, ou vaut-il mieux en créer un autre? quelle solution est la moins lourde?
Marsh Posté le 05-02-2013 à 15:52:15
Si tu dois tester toutes les lignes, il vaut mieux utiliser la même boucle, ça les parcourras qu'une seule fois.
Marsh Posté le 05-02-2013 à 16:24:30
Bon... en fait ça me shut down environs une fois sur deux...
Marsh Posté le 05-02-2013 à 16:48:06
Voici donc mon code actuel :
Code :
|
y-aurait-il un moyen de l'alléger? Il me shut down une fois sur deux, donc il marche, mais il est trop lourd je crois...
Marsh Posté le 05-02-2013 à 17:15:40
T'as beaucoup de lignes ?
Sinon, une autre solution serait de filtrer les lignes qui ne commencent pas par D et les supprimer.
Avec l'enregistreur de macro ça doit bien se faire.
Marsh Posté le 05-02-2013 à 19:20:24
Avant toute chose, où se situe le code : dans un module, dans une classe d'une feuille ou ThisWorkbook ?
La feuille traitée a l'air d'être la feuille active, fait-elle partie du classeur contenant le code ou d'un autre classeur ?
Si c'est un classeur de macros (.xla), il faut alors bien qualifier les objets, éviter donc les raccourcis …
J'éviterais le compteur (même si je pense qu'il ne pause pas de problème sauf peut-être la syntaxe employée),
je remplacerais les lignes 8 à 13 par celle-ci :
Code :
|
Edit : en fait il n'y a pas besoin de compteur car c'est une remontée et non pas une descente !
De plus, je suppose que la première ligne ne doit pas être supprimée (à cause du test avec la cellule A1),
donc la remontée devrait s'arrêter à ligne 2; la non imbrication des If pourrait poser problème
alors qu'à mon avis il faudrait les combiner comme ceci :
Code :
|
Astuce : la première ligne permet de suspendre la boucle via la touche ECHAP …
Marsh Posté le 06-02-2013 à 09:04:11
Alors :
le code est dans un module. Les fonctions qui y sont, sont appelées dans le ThisWorkbook.
Les données sont dans un autre classeur : je pars de Classeur1.xls qui contient la macro, et qui ouvre un fichier txt dans un excel.
je vais tester ça merci! et super l'astuce de la touche échap, j'étais bien embêtée
Marsh Posté le 06-02-2013 à 10:16:05
Comme dans un cas similaire en version 2003 j'ai été obligé de qualifier complètement les objets
(exemple : ActiveWorkbook.ActiveSheet.Cells(i, 1) au lieu de Cells(i, 1) tout court …),
je pense que dans ta version 2002 il faut aussi être rigoureux !
Mais cela demande une vue d'ensemble, insuffisante avec des bouts de code …
Marsh Posté le 06-02-2013 à 10:30:30
c'est ma principale fonction.
dans mon programme principal, j'ouvre un fichier, et j'appelle cette fonction, c'est tout
Marsh Posté le 06-02-2013 à 11:01:41
Soit une variable objet est créée juste après l'ouverture du fichier
Code :
|
puis cette référence est utilisée dans le code
Code :
|
(l'utilisation de variables objet est pratique pour "naviguer" entre 2 classeurs ou feuilles),
soit l'objet est qualifié ponctuellement dans une structure With
(dans ce cas ne pas oublier le point devant chaque propriété y faisant référence)
Code :
|
Marsh Posté le 05-02-2013 à 13:27:11
Euh... pourquoi Dans le If : si je mets Range(..) à la place de Cells(..) j'ai une erreur, et si je laisse Cells(..), ben j'ai mon ordinateur en mode écran noir, l'écran se met en veille, l'ordi toujours allumé mais impossible d'avoir une réponse, pas de ctrl alt suppr rien, donc obligé de shut down... ?
(i étant un compteur)