stephsteph
XLDnaute Occasionnel
Bonjour
J’ai un fichier (attaché) appelé test.xlsm et un autre fichier à construire appelé test2.csv (ou test1.xlsx dans un premier temps) (je met le fichier de résultat attendu en feuille 2 de test.xlsm pour mieux visualiser et faciliter les explications).
Je voudrais créer une macro qui copie les valeurs de tout le contenu de certaines colonnes de test.xlsm dans test1 à partir de la 2ème ligne (il y a des titres en 1ère ligne) et faire une double boucle avec une formule pour une colonne particulière.
Je n’ai pas eu de difficulté pour la macro automatique (inutile de la copier, mais c’est banal, elle est de toute façon dans le fichier xlsm).
Dans le détail :
* 1-Au lieu de copier la colonne 1, je voudrais remplacer à chaque ligne le contenu de la colonne de test.xlsm par un nombre incrémenté à chaque ligne à partir de 1 dans la ligne 2 de testmysql (ligne 2=1, ligne3=2, ligne4=3, etc)
(ensuite je copie-valeurs la totalité des colonnes 2,3,4 sans modif de test.xls en colonnes 2,3,4 à partir de ligne 2 dans test1.xlsx et idem pour les colonnes 6,7,8,9,10,11 vers les colonnes 5,6,7,8,9,10 (je saute une colonne), OK pas de souci
* 2- Au lieu de copier les contenus des colonnes comme avant, je commence une double boucle (c’est dur) depuis la colonne 12 tant que dans la ligne les cellules après la colonne 12 dans test.xlsm sont remplies et je crée la formule ="|"&L(i)C&="|"&L(i)C(1) &="|"&L(i)C(2) &="|"&L(i)C(3) &="|"&L(i)C(4), etc., ce qui donne la séquence «|indexaligne(i)|indexbligne(i)|indexcligne(i)|indexdligne(i)|indexeligne(i)|», etc. avec le contenu de la colonne 11 de test1.xlsx donc rempli avec la séquence « |indexaligne1|indexbligne1| », etc., puis je descend d’une ligne et je recommence jusqu’à ce qu’il n’y ait plus de ligne remplie
* 3- Quand c’est terminé j’enregistre le fichier directement au format csv avec séparateur « ; »
Mon souci c’est la double boucle du point 2 (dans la macro automatique, j’ai seulement copié le contenu d’une seule colonne).
Une autre contrainte (ce qui fait que je n’ai pas copié ma macro automatique, c'est seulement pour mémoire, car elle est trop longue à s’exécuter) c’est que le traitement total doit être rapide (car dans la vie réelle, le fichier fait près de10000 lignes et beaucoup de colonnes !).
J’ai essayé de bricoler la double boucle avec les 2 bouts suivants (trouvés sur Internet) :
Pour la formule (ci-dessus, pas codée):
Pour la double boucle (f pour la formule):
Mais je me suis pas mal emmêlée les baskets, et à la fin, je me suis dit que je partais mal car même si j’arrivais à ajouter le bon code à ma macro automatique, son exécution prendrait longtemps pour couvrir les milliers de lignes et les centaines de colonnes variablement remplis après la colonne 12.
Donc je m’en remet à votre pilotage.
J’espère que j’ai été bien claire (difficile de communiquer mais avec le fichier attaché cela devrait être limpide).
Merci de votre aide
Steph
J’ai un fichier (attaché) appelé test.xlsm et un autre fichier à construire appelé test2.csv (ou test1.xlsx dans un premier temps) (je met le fichier de résultat attendu en feuille 2 de test.xlsm pour mieux visualiser et faciliter les explications).
Je voudrais créer une macro qui copie les valeurs de tout le contenu de certaines colonnes de test.xlsm dans test1 à partir de la 2ème ligne (il y a des titres en 1ère ligne) et faire une double boucle avec une formule pour une colonne particulière.
Je n’ai pas eu de difficulté pour la macro automatique (inutile de la copier, mais c’est banal, elle est de toute façon dans le fichier xlsm).
Dans le détail :
* 1-Au lieu de copier la colonne 1, je voudrais remplacer à chaque ligne le contenu de la colonne de test.xlsm par un nombre incrémenté à chaque ligne à partir de 1 dans la ligne 2 de testmysql (ligne 2=1, ligne3=2, ligne4=3, etc)
(ensuite je copie-valeurs la totalité des colonnes 2,3,4 sans modif de test.xls en colonnes 2,3,4 à partir de ligne 2 dans test1.xlsx et idem pour les colonnes 6,7,8,9,10,11 vers les colonnes 5,6,7,8,9,10 (je saute une colonne), OK pas de souci
* 2- Au lieu de copier les contenus des colonnes comme avant, je commence une double boucle (c’est dur) depuis la colonne 12 tant que dans la ligne les cellules après la colonne 12 dans test.xlsm sont remplies et je crée la formule ="|"&L(i)C&="|"&L(i)C(1) &="|"&L(i)C(2) &="|"&L(i)C(3) &="|"&L(i)C(4), etc., ce qui donne la séquence «|indexaligne(i)|indexbligne(i)|indexcligne(i)|indexdligne(i)|indexeligne(i)|», etc. avec le contenu de la colonne 11 de test1.xlsx donc rempli avec la séquence « |indexaligne1|indexbligne1| », etc., puis je descend d’une ligne et je recommence jusqu’à ce qu’il n’y ait plus de ligne remplie
* 3- Quand c’est terminé j’enregistre le fichier directement au format csv avec séparateur « ; »
Mon souci c’est la double boucle du point 2 (dans la macro automatique, j’ai seulement copié le contenu d’une seule colonne).
Une autre contrainte (ce qui fait que je n’ai pas copié ma macro automatique, c'est seulement pour mémoire, car elle est trop longue à s’exécuter) c’est que le traitement total doit être rapide (car dans la vie réelle, le fichier fait près de10000 lignes et beaucoup de colonnes !).
J’ai essayé de bricoler la double boucle avec les 2 bouts suivants (trouvés sur Internet) :
Pour la formule (ci-dessus, pas codée):
Code:
range("A1:A" & [A65536].end(xlup).row)
Code:
ligne = 1
For n = 1 To Sheets("Feuil1").Range("A65536").End(xlUp).Row
dercol = Sheets("Feuil1").Cells(n, 256).End(xlToLeft).Column
Sheets("Feuil2").Range("A" & ligne) = Sheets("Feuil1").Range("A" & f)
ligne = ligne + 1
For m = 12 To dercol
Sheets("Feuil2").Range("A" & ligne) = Sheets("Feuil1").Range("A" & f)
ligne = ligne + 1
Next m
Next n
Donc je m’en remet à votre pilotage.
J’espère que j’ai été bien claire (difficile de communiquer mais avec le fichier attaché cela devrait être limpide).
Merci de votre aide
Steph
Pièces jointes
Dernière édition: