Diverses questions VBA - VB/VBA/VBS - Programmation
Marsh Posté le 24-02-2016 à 11:51:43
C'est la toute dernière étape de ma macro, donc ça m'emmerde de rester coincé là. Je ne vous copie pas le code entier, il doit être tellement lourd que ça risquerait de passer en hors forfait chez vous
Marsh Posté le 24-02-2016 à 13:57:08
Bonjour,
Qu'est ce qui ne fonctionne pas exactement : le renommage de la feuille ? la copie de la ville ? Avec/Sans message d'erreur ?
Déjà je vois plusieurs etrangetés dans ton code :
Lignes 1 et 2 => A quoi sert le même Select dans une boucle ?
Ligne 3 => Ce ne serait pas plutôt l'inverse pour alimenter NumeroCaisse ?
Ligne 5 => La feuille active est-elle bien celle à renommer ?
D'une manière générale, éviter les .Select et les ActiveQuelquechose, c'est assez casse-gueule et très consommateur en temps.
Rien ne vaut de nommer directement les objets Sheets("Maquette" ).Cells(i, 2) par exemple.
Marsh Posté le 24-02-2016 à 14:06:15
J'ai récupéré des bouts de code d'une boucle de plusieurs centaines de lignes, qui n'est pas forcément optimisée elle non plus (mais qui fonctionne) donc il est possible que les deux boucles soient le résultat de cette quantité de lignes Donc je sais que ce que j'ai posté n'est pas bon du tout, mais c'était histoire de partir sur une base de réflexion.
Pour la ligne 1 & 2, effectivement, pas bien utile...
Pour la ligne 3 tu as tout à fait raison, c'est d'ailleurs comme ça dans le code source, mais je ne sais pas trop ce que j'ai foutu pour que ça arrive dans cet ordre là ici
Pour les .activate, je pensais que c'était pour éviter les .select
J'essaie de prendre de bonnes habitudes, je vais essayer de nettoyer le code comme tu me l'indiques
Et pour répondre à la première question, il me dit que la feuille existe déjà et s'arrête au lieu d'alimenter la dernière ligne non vide.
Donc voilà, je suis un peu paumé, je sais faire des boucles simples, mais pour l'export ça a toujours été la merde.
Idéalement j'aimerai éviter d'importer la liste de mes caisses dans mon fichier, histoire d'impliquer moins de classeurs, même si ça simplifierait les choses (je crois )
Marsh Posté le 24-02-2016 à 16:24:47
Bon en fait c'était une boucle toute conne qu'il me fallait
Code :
|
Bon par contre j'ai pas le droit de coller visiblement...
Je me demande bien pourquoi d'ailleurs
Après oui le code est dégueulasse
Je sais pas comment scanner comme sur SAS pour qu'il me prenne les lignes 1 par 1 alors je met en place le filtre, mais y'a sûrement mieux à faier
Marsh Posté le 24-02-2016 à 20:17:18
'soir !
Voir aussi du côté du filtre avancé pouvant copier directement les données dans la même instruction !
Marsh Posté le 25-02-2016 à 08:25:16
Effectivement Marc L.
raph0ux, c'est le ActiveSheet.Paste qui ne lui plait pas, comme je te l'ai dis, évite les ActiveToto, c'est source de galère.
Pour copier une feuille, tu vérifies avant qu'elle n'existe pas et un simple .Copy suffit (dans l'exemple ci-dessous, on duplique la dernière feuille avec Sheets(Sheets.Count).Copy) :
Code :
|
Marsh Posté le 25-02-2016 à 10:25:25
Ouais je comprends bien que ça soit source de problèmes, mais pour l'instant je ne touche pas assez en VBA pour pouvoir m'en passer, mais j'essaie de nettoyer le code le plus possible au fur et à mesure
Après ici pas besoin de vérifier que la feuille existe ou non puisqu'en début de macro je crée un nouveau classeur, mais ça sera utile pour plus tard !
Merci pour vos commentaires
Bon du coup c'est bon, mais ça met presque 10 minutes pour créer un classeur de 40 feuilles et 50 000 lignes
Sinon, je dois faire un formulaire qui doit me renvoyer au bon nom de ville, même s'il est mal écrit, mais avec la fonction like j'ai l'impression que je dois rajouter 50 lignes par ville pour que ça soit sûr
Marsh Posté le 25-02-2016 à 12:19:07
raph0ux a écrit : mais ça met presque 10 minutes pour créer un classeur de 40 feuilles et 50 000 lignes |
A lire …
Marsh Posté le 08-03-2016 à 13:59:18
Super intéressant comme post, et ceux vers lesquels ils renvoient
Marsh Posté le 08-03-2016 à 14:18:51
Par contre, je suis bien obligé d'utiliser .activate avant quand j'écris ça :
Code :
|
Non ? Si la feuille Source n'est pas activée j'ai une erreur 1004.
Pourtant, elle est ouverte et bien définie il me semble
Là dans ce code, ça recopie un million de ligne dont 99% de #NA, donc il faut que je trouve comment lui dire de s'arrêter quand il n'y a plus rien
Marsh Posté le 08-03-2016 à 16:42:03
Une idée pour un équivalent de .end(xldown) quand il s'agit de la zone d'arrivée ? Je voudrais coller exactement le contenu des 5 colonnes de la première feuille, mais le nombre de lignes est variable
J'ai essayé pas mal de trucs mais je n'arrive pas à trouver...
Marsh Posté le 08-03-2016 à 18:38:28
raph0ux a écrit : Par contre, je suis bien obligé d'utiliser .activate avant quand j'écris ça :
|
En fait tu as oublié de référencer la feuille de [E7] ‼ Donc sans feuille, c'est par défaut la feuille active …
Aucun besoin d'activer en respectant bien le modèle objet d'Excel :
Code :
|
Edit : variante du code du post suivant …
Marsh Posté le 08-03-2016 à 18:43:50
raph0ux a écrit : Une idée pour un équivalent de .end(xldown) quand il s'agit de la zone d'arrivée ? Je voudrais coller exactement le contenu des 5 colonnes de la première feuille, mais le nombre de lignes est variable |
Code :
|
Marsh Posté le 09-03-2016 à 09:47:23
C'est le Ubound visiblement que je ne maîtrise pas du tout, j'ai vu le post à ce sujet, il va falloir que je me documente
Par contre, elle est bien référencée la feuille de [E7] non ? ("Source" )
Marsh Posté le 09-03-2016 à 11:00:45
Pour la fonction UBound comme pour le reste, placer dans le code le curseur texte dessus puis appuyer sur la touche et lire …
Dans ton code, [E7] n'ayant pas de feuille de calculs précisée, il fait donc référence à la feuille active ‼
La bonne syntaxe est
Code :
|
D'où la simplification via l'instruction With dans mes deux exemples précédents …
Marsh Posté le 09-03-2016 à 15:39:20
Ok, merci pour la précision
Et la touche F1 sur Office 2010 ça fait un moment qu'elle ne sert plus à rien
Ceci dit je me suis renseigné sur la fonction entre temps
Marsh Posté le 09-03-2016 à 17:02:33
Pour l'aide VBA interne, soit tu es bien configuré dessus (sans passer par le Web) mais Excel a été mal installé
soit tu es configuré pour aller sur le Web (peut se modifier via l'icône en bas de la fenêtre) mais il y a un souci de droit d'accès,
bref, voir avec le service informatique …
Marsh Posté le 09-03-2016 à 17:25:44
Mon contrat sera terminé d'ici à ce qu'ils me répondent
Marsh Posté le 10-03-2016 à 17:21:36
Bon effectivement c'est un milliard de fois plus rapide et tout con en fait d'utiliser ubound
Marsh Posté le 15-03-2016 à 16:40:25
J'ai un truc qui me rend fou depuis tout à l'heure :
Code :
|
On passera sur les .Activate et .select, mais j'ai un problème sur la ligne en rouge
Pour une raison que j'ignore, il me semble que ce matin ça fonctionnait (j'ai modifié des choses ailleurs entre temps mais qui ne sont pas du tout liées à ce passage de ma macro) mais maintenant, impossible de ne pas avoir l'erreur d'exécution 9 : l'indice n'appartient pas à la sélection...
Quand je remplace Worksheets(dfg).Activate par la valeur de dfg, ça fonctionne....
La copie et le collage du graphique ne fonctionne pas non plus du coup, ce que je comprends encore moins dans la mesure où pareil, ça fonctionnait ce matin.
Si quelqu'un a une idée...
Marsh Posté le 15-03-2016 à 17:06:08
Bordel de merde
Suffisait d'un Dim dfg$
Y'a 10 minutes je me disais que j'étais gogol de jamais définir mes variables mais que c'était pas grave parce que ça avait jamais planté
Marsh Posté le 24-02-2016 à 11:50:05
Je débute sur VBA et j'ai besoin de ranger mes données, pour faire simple je donne un exemple :
J'ai toutes les villes de France dans une seule feuille avec une colonne qui correspond au numéro de département
Je veux que chaque ville soit copiée dans une feuille qui correspond à son département.
Sauf que bien évidemment, dans mon fichier c'est pas des départements (qui se suivent, et donc où il est facile de faire une boucle) mais des caisses avec des numéros qui n'ont rien à voir entre eux.
Le code
Enfin c'est pas exactement ce que j'ai mis mais vu que ça ne fonctionne pas...
Je crois que c'est simple, j'ai déjà fait la même chose mais avec des classeurs au lieu des feuilles, mais j'ai paumé le fichier
Ci-mer d'avance
Message édité par raph0ux le 14-03-2016 à 11:54:03