Boucles sur une ligne

Bonjour

Je suis désolé, je débute en VBA et j'ai du mal à faire des boucles . J'ai cherché sur le site, sans doute mal...J'aimerai comprendre le fonctionnement. J'ai un fichier avec des données en lignes dans un onglet et je souhaites que lorsqu'une donnée change, la boucle se déplace sur l'onglet qui est à coté. Mais déjà j'ai du mal sur une boucle avec des colonnes.

Je joint un fichier dans lequel j'explique le besoin dans une bulle dans l'onglet IL05, si vous pouviez m'expliquer.

8test-boucle.zip (25.31 Ko)

Je vous remercie par avance

Bonjour,

Tu ne peux pas faire de boucle car ta disposition n'est pas régulière :

Dans chaque feuille cible (1-5) et 6-10), il y a 3 lignes vides entre "Espace 1" et "Espace 2"

Ensuite il n'y a plus que 2 lignes vides entre chaque "Espace" !

J'ai donc supprimé la ligne 17 dans les 2 feuilles de manière à obtenir une distribution régulière toutes les 17 lignes.

La macro :

Sub Galopin()
Dim rng As Range, iRS&, iRC&, iC&
'Comprenez :
'iRS signifie iRowSource...  & signifie As Long
'iRC  signifie  iRowCible...  & signifie As Long
'iC signifie  Numéro d'index de la feuille cible
Set rng = Worksheets("IL05").[A1].CurrentRegion
With rng
    Set rng = .Offset(1).Resize(.Rows.Count - 1)
End With
'rng est maintenant la source des données : Dans cet exemple A2:E11
'Si on fait référence à : rng.Cells(1, 1) on parle en fait de la cellule A2
With rng
'Vous allez bientot comprendre pourquoi...
   For iRS = 1 To .Rows.Count 'Pour ligne source = 1 to Nombre de ligne de la source
      'initialisation de iRC si changement de feuille cible
      iRC = IIf(iC = .Cells(iRS, 1).Value, iRC, -14)
      iC = .Cells(iRS, 1).Value
      iRC = iRC + 17       'La première LigneCible est donc la -15+3 = 3, ensuite ce sera la 21...
      'La feuille cible est désignée par son index :
      'Au début, Worksheets(.Cells(iRS, 1).Value) = Worksheets(1)
      Worksheets(iC).Cells(iRC, 4) = .Cells(iRS, 1)
      Worksheets(iC).Cells(iRC + 5, 4) = .Cells(iRS, 2)
      Worksheets(iC).Cells(iRC + 6, 4) = .Cells(iRS, 3)
      Worksheets(iC).Cells(iRC + 8, 4) = .Cells(iRS, 4)
      Worksheets(iC).Cells(iRC + 9, 4) = .Cells(iRS, 5)
      'Ensuite à chaque tour de boucle iRS s'incrémente de 1 et iRC s'incrémentera de 18
   Next
End With
End Sub

A+

Bonjour Galopin01

Désolé de n'avoir pas pu répondre avant, je n'étais pas disponible.

Alors déjà merci d'avoir pris de ton temps pour me répondre, je trouve ça très altruiste surtout qu'il y a de la pédagogie.

Je vais pas dire que j'ai tout compris, je rebalaye en F8 et je regarde....

En tout cas je suis assez soufflé, j''étais persuadé qu'il fallait des conditions partout.

L'initialisation du tableau alors ça c'est plutôt magique.

Une , sans doute 2 :

iRC = IIf(iC = .Cells(iRS, 1).Value, iRC, -14) :' ici on a bien une condition IIf ? je n'avais jamais vu , je vais faire des recherches.

Sinon une autre question :

Car j'ai encore du mal à voir comment la macro fait la différence entre 0001 et 0002, donc ma question : si j'avais voulu faire la même chose mais au lieu de changer d'onglet à chaque changement dans la colonne A de IL05, je change carrement de classeur ?

Est ce que tu peux m'aiguiller ? est ce qu'il faut ouvrir la feuille avant ?

Merci encore et bon week-end

La feuille cible est désignée par son index :

C'est à dire par le N° dans la première colonne le format 0001 ne change rien : c'est évalué comme 1 donc c'est feuille 1

002 c'est Feuille 2...

iC = .Cells(iRS, 1).Value

S'il y a d'autres feuilles intercalées entre 6-10 et iL05 la macro y logera toutes les lignes de iL05 qui commencent par 003, 004...

Bien sur il doit y avoir autant de feuille avant IL05 quede références différentes dans cette première colonne.

Par contre si la cible ce sont des classeurs différents, c'est un tout autre problème : Une macro est une pièce d'horlogerie<. tous les détails comptent :

Le nom des classeurs.

Le nom des feuilles, ou éventuellement leur position dans chaque classeur

Les emplacements dans chaque feuille doivent être rigoureusement régulier et identiques...

Savoir si les classeurs sont ouverts ou fermés. S'il faut les refermer après...

Il faut que tout les classeurs soient das le même dossier que le classeur sources...

Provisoirement tu pourrais peut-être faire tes transferts sur le même classeur (source) dans autant de feuilles que nécessaire et puis transférer le tout dans les classeurs cible par copier coller...

Sinon TAPUKA me préparer tout le barnum pour que je modifie la macro...

A+

Bonjour Galopin01

Merci encore une fois pour les explications car....j'ai compris, c'est sympa.

Tu es prof ?

Pour mon autre projet, ce sont les mêmes onglets avec les mêmes tableaux (il y aura juste un onglet en plus au début), par contre 0001 se met sur plusieurs onglets (ici 1-5 et 6-10) et dés qu'il trouve 0002 il le met sur un autre classeur strictement identique. Les classeurs sont fermés et sont dans le même dossier, ils ont des noms différents (ex : 0001-residence X, 0002-résidence Y, etc...)

Figure-toi que j'avais pensé à la copie....mais....il va y avoir environ 887 classeurs tous identiques. Donc j'imagine avec une macro qui va tourner quelques heures.

Je ne vois pas comment aller d'un classeur (surtout fermé) à un autre et ainsi de suite. De toute façon j'ai toujours quelques soucis avec les boucles

Si tu pouvais me faire un petit exemple avec ce que tu as déjà (0001 se renseigne sur les 2 onglets...en vrai il y en aura 5 ou 6), puis 0002 se renseigne sur un autre classeur identique.

Alors je pense pouvoir dire que l'avantage c'est que les classeurs sont tous identiques (quoi que... ils ont des noms différents), seule la table IL05 aura 88 000 lignes...

Au départ je pensais que ce serais simple, mais ça, c'est quand je me l'imaginais...

merci encore...

Re bonjour

En gros les fichiers serait comme ci-joint, tous pareils sauf pour leur nom. Ils seraient dans le même dossier.

J'ai mis 3 fichiers (0001,0002,0003) en fait c'est des n° de résidence, une référence quoi. Les n° ne vont pas se suivre car des fois ça passera de la 0003 à la 0007. Il y en a 887 mais ça va jusqu'au 2700 et des poussières.

Si tu peux me donner une piste merci...

Bonne soirée

je n'ai pas mis assez de ligne en source (0001,0002, 0003) mais en fait les onglets doivent être renseignés en totalité avec 0001 dans 1 classeur et sur tous les onglets. Le 2ème classeur renseigné sur tous les onglets avec 0002, etc...

je viens de m'apercevoir de cela, désolé

Ce qui se conçoit bien s'exprime clairement... Mais là ton explication est un peu insuffisante pour me convaincre...

et tes classeurs trop minimalistes, imprécis voire... timoré :

Tu me mets trois classeurs avec chacun une IL05

Moi je crois comprendre que en fait tu as un seul classeur avec une feuille IL05 dont tu dois répartir les 88000 lignes dans 887 autres classeurs avec suffisamment de feuilles cibles pour y loger TOUSSA

Et dans ces classeurs cibles il y aura une seule feuille supplémentaire qui sera toujours la première.

Là ou je ne te suis plus trop, c'est qu'on va mettre la même chose dans toutes les feuilles (sauf la première) ?

S'il y a 10 feuilles dans un des classeurs cible les 9 dernières devront comporter toutes les mêmes données ?

Bon ça devrait pas être trop difficile à condition que tous les classeurs cibles existent et qu'ils aient tous les 4 digits de la colonne 1 de IL05 au début de leur nom de fichier.

La macro de transfert ça je sais faire, c'est pas bien compliqué et ça doit même plus rapide que tu ne penses...

Cependant il y a un mais... : Je ne suis pas très spécialisé dans la gestion des appels à de multiples classeurs.

Si je te fais ça avec une rafale de Workbook.Open dans une boucle de Dir, ça risque effectivement de faire un peu brouette.

Je suppose que quelques internautes spécialisés dans le Système de fichiers utiliseraient un système plus efficace.

Peut-être faire un Dir Dans ton classeur Source (sur une feuille supplémentaire) pour lister sur une colonne tous les classeurs cible existants. A partir de là on pourrait associer rapidement le classeur cible à la référence existante de IL05

Ainsi ça permettrait d'ouvrir directement le classeur cible avec son nom complet.

Ce qui m'inquiète le plus c'est le :

En gros les fichiers seraient comme ci-joint

YAPA de gros qui tiennent, ils doivent être semblable sinon c'est pas la peine que je perde mon temps...

S'il y a une ligne de plus dans une feuille ça sera tout décalé et ça sera tant pis : Je ne peux pas m'amuser à faire une gestion d'erreur sur toutes les c... imprévisibles des fichiers cibles.

C'est pareil pour les noms des fichiers cibles ils doivent tous exister avec les 4 digits de la colonne 1 de IL05.

Bon tu me confirmes que j'ai bien compris TOUSSA et tu me donnes un autre IL05 avec les 88000 lignes (j'ai juste besoin de la première colonne puisque les autres n'interviennent pas dans le processus.

Et sur la deuxième feuille du classeur, tu me fais un Dir du dossier qui contient tous les classeurs Cible.

Je veux cette liste complète j'en ai besoin de ça pour vérifier que je peux boucler aisément de IL05 vers le nom du classeur cible, vérifier qu'il n'y a pas de manquant... de pseudo doublons ou d'anomalies qui vont venir perturber le traitement.

Je suppose que tu sauras faire un boucle sur un répertoire ?

TORAKA utiliser cette macro :

Sub ListFile()
Dim i%
Dim fName As String
fName = Dir("D:\SOS\", vbNormal)
Do While fName <> ""
i = i + 1
Cells(i, 7) = fName
fName = Dir()
Loop
End Sub

Pfff... Chaud devant hein !

A+

Tu me fait rire sérieux...mais t sympa.

Oui en gros(non non j'ai rien dit) c'est ça. Il y a une base IL05 qui est un classeur seul de 88 000 environ et il y aura 887 classeurs créés par une macro strictement identiques à l'intérieur comme des gouttes DO ! La base IL05 sera la source et les 887 les cibles...pppffiou !!!

oui, je te donne ça demain...heu plutot après demain car je n'ai pas la base sur ma clé ...mais je ne pense pas qu'un fichier de 88 000 lignes passe par le site et de memoire la matrice (avec les onglets) doit faire dans les 16 mo...il faudra je pense le passer autrement.C'est pour ça que j'avais tout réduit...

Comme ça je te mettrai exactement la base, la macro qui va créer les fichiers (normalement elle fonctionne bien) c'est sur le reste que j'ai bloqué.

Tu parles d'autres internautes...oui il y a toujours meilleur que soit mais tu as un sacré niveau déjà...

Tu me fais encore plus rire quand tu me demande si je sais boucler sur un répertoire, moi qui ai des difficultés avec les boucles, quoi que ton code me semble clair !

Merci de m'aider Galopin, passe un bon dimanche...

Si tu ne gardes que la première colonne, tu supprimes tout lien externe et sans format particulier, une fois zippé, ça ne devrait pas dépasser 1 Mo, au pire tu le mets en csv ça fera à peine quelques ko...

Bon dimanche.

Bonjour Galopin

Oui j'ai enregistré la trame en xlsb, j'ai retiré tout ce qui était à droite car ça ne nous intéresse pas. Par contre j'ai laisser le vrai nombre d'onglet et leurs noms car cela représente le nombre de logements. (800 c'est pour prendre large, la plus grosse doit faire 500 et quelques)

Je dis le gars car tu as le droit de savoir : c'est un presta contacté par ma direction pour faire ce truc, mais on lui a donné des infos un peu biaisées, ce qui n'est pas de sa faute. Pour lui il a fait sa commande basta....donc bien sûr comme je suis le seul qui me "débrouille" en VBA, la direction est venu me voir car les gars qui doivent remplir les tableaux rouspètent bien comme il faut. J'avais fait une modif avec des formule, decaler, rchv, conditions etc....mais comme le gars a construit une synthèse et tout une architecture sur ses dossiers et fichiers, la direction ne veut rien changer.

Tu verras il y a 3 macros simples dans un fichier excel "Génération V2"(qui sert à générer dossiers, sous dossiers et ce fameux fichier) et qui contient la base qui donne les noms aux dossiers , sous dossiers et fichiers. Par contre modifie là si tu veux tester car à chaque fois j'oublie et je pars pour 886 fichiers, donc 1 to 10 devrait suffire, même moins.

Générations V2 créé 886 ou sous dossiers et fichiers, pour cela tout est déjà fait, il faut juste que les fichiers soient dans c:\temp.

Par contre il n'a pas fait de bouton pour les macros, moi ca ne me gene pas. On retrouve ces fameux 0001, 0002, 2500, etc...en colonne B et C de ce fichier, mais associé avec le nom de dossier et de fichier.

Demain je t'envoi la base IL05 qui est au boulot.

J'ai retourné ça dans tous les sens, mais renseigner un fichier à des endroits précis avec un code (ID) précis et faire la même chose sur un autre fichier pour un autre code....là vraiment je sèche à fond. Je ne vois pas comment je peux lier tout cela. Je suis sûr que tu saura, car c'est juste ce qu'il manque.

Je te donne la "petite" base demain.

Je t'envoi juste ceux_là que j'avais pour que tu vois comment c’est fait, rien de sorcier en l'état.

Merci de m'aider, je veux pas te lancer de fleurs mais bien souvent l'internaute te laisse sur le chemin, ce que je peux comprendre aussi

bonne soirée

Bonjour,

Le programme exprime clairement qu'il y aura 6 sous dossiers dans lesquels viendront se répartir 886 soussousDossiers ou viendront se loger les 88000 classeurs.

N'ayant jamais eu vraiment besoin de m'en servir, ne suis pas du tout un adepte du FSO. J'imagine que pour la création de l'arborescence c'est plus rapide...

Compte tenu du système de création de cette arborescence je pense que je ne vais même pas vérifier la présence de "problèmes".

Je mettrai juste une gestion d'erreur et basta...

Mais le problème c'est que je vais devoir reprendre toute cette arborescence pour y loger mes boucles. Ça risque effectivement d'être un peu chronophage...

J'ai 1 problème que je ne sais pas résoudre : Comme je ne sais pas me servir du FSO et que je n'ai pas envie de me lancer dans une boucle supplémentaire pour trouver le dossier, une simple liste des 88000 fichiers ne me servira à rien : Il me faut donc la base de fichier et son arborescence. (Pour que je puisse reconstituer le chemin de fichier)

Donc "en gros" ! une base comme celle de celle de Génération V2 avec juste les 3 premières colonnes pour que je NAIPUKA rajouter les "\" pour constituer un string sur mesure pour ouvrir le classeur.

Moyennant quoi ça devrait le faire... Enfin j'espère !

Bonne journée !

Bonjour Galopin

Je ne suis pas non plus adepte du FSO.

Je n'ai pas envie que tu passes tes journées la dessus. Si tu as d'autres solutions je suis preneur. Bon je sais qu'il faudra boucler dans la macro "création de fichier", mais comme je te disais la manière de le faire sur plusieurs fichiers fermés à la base et pour y mettre des donnée différentes (du moins l'ID) je ne vois pas.

Sinon tu as vu que j'avais mis le fichier en xlsb pour l'alléger. Soit on le remet en xlsx, soit on modifie la macro...a voir.

Au fait c'est 88000 lignes , pas 88000 classeurs...parce que là j'arrête sinon

Tu crois qu'il faut boucler sur chaque arborescence ? si c'est le cas c'est pire que je ne le pensais…

J'avoue que je n'ai pas compris tout ce que tu as dit en fin de message

Je prépare cette base de 88000 lignes et je te l'envoi, je mettrai des bulles pour que ce soit plus clair…

merci bonne journée (chaude..et de plus en plus chaudes à venir !

Bonjour Galopin

Le fichier ne passe pas, je m'en doutais un peu, je l'ai mis en xlsb et zippé, il fait 1266. Comment je pourrais le passer ?

Merci

Oh purée...j'ai retiré quelques éléments (des sous sol) et du coup ça passe, ça me rassure.

Je t'ai mis des bulles explicatives, j'espère que tu auras compris.

merci, bonne journée

4il05-au-19-07-2019.zip (22.00 Octets)

22 ko... Ton zip est vide !

En fait si ta base est rigoureusement conforme à celle de GénérationV2, j'ai besoin de rien d'autre j'ai juste à rajouter la racine et les "\" pas besoin de toutes les lignes pour préparer une boucle...

A+

Oups, en commençant à préparer la prog, j'ai un immense moment de solitude... !

Je me rend compte qu'il me faut surtout un IL05 complet ET d'une base complète sinon je ne peux pas rapprocher le ILO5 de son chemin...

Donc pas de compromis : Tu me mets l'intégrale et tu passes par cjoint pour uploader ton zip. (et tu me donnes le lien) au besoin en MP...

Donc pour l'instant je ne fais rien : J'attend d'avoir la totale, c'est pas la peine que je recommence 10 fois avec chaque fois une petite variante...

A+

D'accord, je te met tout comme cela doit être . L'IL05 est complet par contre, ce que j'ai enlevé nous n'en avions vraiment pas besoin. Ce qui va changer ca va être des libellés de la trame que je suis en train de modifier, mais pas grand chose. Le temps de faire les modifs e de rajouter quelques résidences qui manquaient (ils viennent de s'en rendre compte).

Merci en tout cas. Je me sens un peu gêné. c'est chronophage c'est sûr et je te remercie de prendre du temps, j'ai encore fais des recherches ce matin, mais rien qui traite de ce genre de sujet.

Je t'envoie ça, je pense en fin d'après-midi

a+

En fait je patauge sans doute un peu... Peut-être que je n'ai pas besoin de toussa, mais peut-être bien que si...

En fait je n'arrive pas à conceptualiser comment je fais le lien entre iL05 intégral et le classeur destination. Dans le problème de base il n'y avait pas cette notion c'était tout dans le même classeur : bon peut être que quand je verrai les 80000 lignes de toutes tes données ça sera plus évident mais pour l'instant...

T'es prié de me donner des fichiers non protégés hein !

D'ailleurs peut-être bien que si tu me donnais (en MP ou par mail) ton N° de téléphone aussi on gagnerait du temps...

Je comprends, ça m'arrive souvent de patauger en VBA et puis parfois "la petite ampoule" et je me dis : "mais merde c'est évident"...

Oui après c'est très évident, mais avant.

Oui dans le problème de base, cela devait être dans le même classeur. Tu sais si c'est compliqué, on fera une macro en ouvrant chaque site et on se partagera ça boulot à 4 ou 5 et on lancera la macro...

Je t'ai envoyé en MP le lien des fichiers et mes emails...heu je crois que je n'ai pas mis mon tel ??

Tu me diras si tu le veux.

merci...

Rechercher des sujets similaires à "boucles ligne"