[Résolu] Petite macro simple avec une double boucle sur ligne pour très gros fichier

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):
Code:
range("A1:A" & [A65536].end(xlup).row)
Pour la double boucle (f pour la formule):
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
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
 

Pièces jointes

  • Test.xlsm
    21 KB · Affichages: 53
  • Test1.xlsx
    8.5 KB · Affichages: 32
  • Test.xlsm
    21 KB · Affichages: 57
  • Test1.xlsx
    8.5 KB · Affichages: 31
  • Test.xlsm
    21 KB · Affichages: 47
  • Test1.xlsx
    8.5 KB · Affichages: 39
Dernière édition:

Gurgeh

XLDnaute Occasionnel
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

Salut stephsteph

Quelques questions sur ta Feuil2, qui est censée être le résultat que tu veux.
* pourquoi la cellule A10 contient 10 et la cellule A11 contient 9 ? Si dans la première colonne de ta feuille de destination tu incrémentes un compteur, A10 devrait contenir 9 et A11 devrait contenir 10
* pourquoi la cellule K15 ne contient pas |indexa14|indexb14| ?

Gurgeh
 
Dernière édition:

Gurgeh

XLDnaute Occasionnel
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

Bon, au cas où j'aurais compris, voici une macro qui je pense fait ce que tu veux :

Sub MacroSimple()
'Pour gagner du temps d'exécution, on désactive le rafraichissement d'écran
Application.ScreenUpdating = False

'On va utiliser deux variables pour désigner la feuille d'où proviennent les données et celle où on va les écrire
Dim FeuilleSource, FeuilleDestination As Worksheet

Set FeuilleSource = Sheets("Feuil1")
Set FeuilleDestination = Sheets("Feuil2")

'Initialisation des variables qui vont donner la ligne en cours de chaque feuille
LigneFeuilleSource = 1
LigneFeuilleDestination = 2

'On boucle jusqu'à tomber sur une cellule vide dans la première colonne
While FeuilleSource.Cells(LigneFeuilleSource, 1).Value <> ""
'On incrémente une valeur dans la première colonne de la feuille destination
FeuilleDestination.Cells(LigneFeuilleDestination, 1).Value = LigneFeuilleSource

'ensuite on va recopier les colonnes 2 à 4, puis les colonnes 6 à 11 en décalant de 1 pour sauter la colonne 5
For colonne = 2 To 11
If colonne < 5 Then FeuilleDestination.Cells(LigneFeuilleDestination, colonne).Value = FeuilleSource.Cells(LigneFeuilleSource, colonne).Value
If colonne > 5 Then FeuilleDestination.Cells(LigneFeuilleDestination, colonne).Value = FeuilleSource.Cells(LigneFeuilleSource, colonne + 1).Value
Next colonne

'On utilise la variable TexteIndex pour créer petit à petit ce que l'on va mettre en colonne 11 de la feuille destination
ColonneIndex = 12
TexteIndex = ""
'On fait une boucle en prenant les colonnes les unes après les autres jusqu'à tomber sur une colonne vide
While FeuilleSource.Cells(LigneFeuilleSource, ColonneIndex).Value <> ""
'A chaque fois, on ajoute à TexteIndex le contenu de la cellule en cours
TexteIndex = TexteIndex & "|" & FeuilleSource.Cells(LigneFeuilleSource, ColonneIndex).Value
ColonneIndex = ColonneIndex + 1
Wend
'On finit en ajoutant le | final
'Note : pas de test pour vérifier qu'il y a au moins une valeur dans la colonne 12 de la feuille de départ. Ca peut être amélioré

TexteIndex = TexteIndex & "|"
FeuilleDestination.Cells(LigneFeuilleDestination, 11).Value = TexteIndex

'Une fois que tout ça est fait on peut passer à la ligne d'après...
LigneFeuilleSource = LigneFeuilleSource + 1
LigneFeuilleDestination = LigneFeuilleDestination + 1
Wend

'On réactive la mise à jour de l'affichage
Application.ScreenUpdating = True

End Sub



A ta dispo si question là dessus.

J'ai testé sur 20000 lignes, ça prend quelques secondes.

Le fichier est en pj.

Gurgeh
 

Pièces jointes

  • Test.xlsm
    23.7 KB · Affichages: 47
  • Test.xlsm
    23.7 KB · Affichages: 49
  • Test.xlsm
    23.7 KB · Affichages: 46

Bebere

XLDnaute Barbatruc
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

bonjour Stef,le forum
à tester

Code:
Sub Macro1()
    Dim tbl, derl As Long, l As Long, c As Byte, i As Byte
   Application.ScreenUpdating = False
   Application.Calculation = xlCalculationManual
    With Feuil1
        derl = .Range("A65536").End(xlUp).Row
        tbl = .Range("A1:R" & derl)   
    End With

    For l = 1 To UBound(tbl, 1)
        tbl(l, 1) = l
        For c = 6 To 12    'UBound(tbl, 2)
            Select Case c
            Case Is <= 12
                tbl(l, c - 1) = tbl(l, c): tbl(l, c) = ""
            End Select
        Next c
        
                      For i = 13 To UBound(tbl, 2)
                    If tbl(l, i) <> "" Then
                    tbl(l, 11) = tbl(l, 11) & "-" & tbl(l, i)
                    tbl(l, i) = ""
                    End If
                Next i
  
    Next l
    
    With Feuil2
        .Range("A2").Resize(UBound(tbl, 1), UBound(tbl, 2)) = tbl
    End With
    
   Application.ScreenUpdating = True
   Application.Calculation = xlCalculationAutomatic
'    Range("A1").Select
'    Windows("Test1.xlsx").Activate
'    Range("A1").Select
'    ActiveCell.Offset(1, 0).Range("A1").Select
'    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
'    Selection.ClearContents
'    Range("A1").Select
'    ActiveWorkbook.Save
'    Range("A1").Select
'    Windows("Test.xlsm").Activate
'    Range(Selection, Selection.End(xlDown)).Select
'    Selection.Copy
'    Windows("Test1.xlsx").Activate
'    ActiveCell.Offset(1, 0).Range("A1").Select
'    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
'                                                                  :=False, Transpose:=False
'    ActiveCell.Offset(1, 0).Range("A1").Select
'    Application.CutCopyMode = False
'    ActiveCell.FormulaR1C1 = "=R[-1]C+1"
'    Selection.Copy
'    Range(Selection, Selection.End(xlDown)).Select
'    ActiveSheet.Paste
'    Application.CutCopyMode = False
'    Selection.Copy
'    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
'                                                                  :=False, Transpose:=False
'    ActiveCell.Offset(-1, 0).Range("A1").Select
'    Windows("Test.xlsm").Activate
'    ActiveCell.Offset(0, 1).Range("A1").Select
'    Range(Selection, Selection.End(xlDown)).Select
'    ActiveCell.Range("A1:C21").Select
'    Application.CutCopyMode = False
'    Selection.Copy
'    Windows("Test1.xlsx").Activate
'    ActiveCell.Offset(0, 1).Range("A1").Select
'    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
'                                                                  :=False, Transpose:=False
'    Range("A1").Select
'    Windows("Test.xlsm").Activate
'    ActiveCell.Offset(0, 4).Range("A1").Select
'    Range(Selection, Selection.End(xlDown)).Select
'    ActiveCell.Range("A1:F21").Select
'    Application.CutCopyMode = False
'    Selection.Copy
'    Windows("Test1.xlsx").Activate
'    ActiveCell.Offset(1, 4).Range("A1").Select
'    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
'                                                                  :=False, Transpose:=False
'    Range("A1").Select
'    Windows("Test.xlsm").Activate
'    ActiveCell.Offset(0, 6).Range("A1").Select
'    Range(Selection, Selection.End(xlDown)).Select
'    Application.CutCopyMode = False
'    Selection.Copy
'    Windows("Test1.xlsx").Activate
'    ActiveCell.Offset(1, 10).Range("A1").Select
'    ActiveSheet.Paste
'    Range("A1").Select
'    Application.CutCopyMode = False
'    Range("A1").Select
'    ActiveWorkbook.Save
'    ActiveWorkbook.SaveAs Filename:="D:\_Data\TransfertsTemp\Test2.csv", _
'                          FileFormat:=xlCSV, CreateBackup:=False
'    Windows("Test.xlsm").Activate
'    Range("A1").Select
'    ActiveWorkbook.Save
End Sub
 

Staple1600

XLDnaute Barbatruc
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

Bonsoir à tous


Gurgeh
Je me permets cette petite précision/correction
'On va utiliser deux variables pour désigner la feuille d'où proviennent les données et celle où on va les écrire
Dim FeuilleSource, FeuilleDestination As Worksheet

Set FeuilleSource = Sheets("Feuil1")
Set FeuilleDestination = Sheets("Feuil2")


Déclarée de cette façon, FeuilleSource est en Variant et non As Worksheet
Il faudrait donc écrire
Dim FeuilleSource As Worksheet, FeuilleDestination As Worksheet
ou alors
Dim FeuilleSource As Worksheet
Dim FeuilleDestination As Worksheet


PS: C'est pas moi qui le dit, c'est tonton Microsoft ;)
(cf. Remarque dans le chapitre Déclarez une variable dans une macro)

(Il le dit aussi dans l'aide VBA (touche F1))
 
Dernière édition:

stephsteph

XLDnaute Occasionnel
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

Bonjour Gurgeh, Bebere et Staple1600,

merci de vos contributions, je teste et je reviens vers vous,
pour gurgeh et le feuille2 c'est vrai c'est bizarre pour la 1ère colonne (j'ai dû faire une erreur de copier coller) et pour la colonne à produire (je l'ai fait manuellement pour exemple et j'ai dû m'emmêler les baskets).
il faut dire que ces boucles ça me stresse grave.
Steph
 

stephsteph

XLDnaute Occasionnel
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

Bonjour à tous les 3

Voici les résultats des tests.
Merci les 2 macros marchent bien... avec quelques petits soucis de détails.
Juste une vérif,si des cellules sont vides dans les colonnes autre que la 1 et la 12, cela marche encore (pas testé, mais je crois que oui)

*Bebere (merci, très synthétique)
Code:
tbl = .Range("A1:GR" & derl)
(pour aller jusqu’à colonne 200, je suppose).
Code:
tbl(l, 11) = tbl(l, 11) & "|" & tbl(l, i)
(à la place du tiret), mais il y a un souci, car le 1er et le dernier "|" sont absents (j’ai essayé de bricoler la formule mais rien ne marche
La colonne 7 affiche un nombre et le point a disparu (alors que je voudrais du texte pour tout, avec le point, car parfois c’est par ex. 1832b.).

*Gurgeh (merci, très didactique)
La colonne 7 affiche un nombre et le point a disparu (alors que je voudrais du texte pour tout, avec le point, car parfois c’est par ex. 1832b.)
« Note : pas de test pour vérifier qu'il y a au moins une valeur dans la colonne 12 de la feuille de départ. Ca peut être amélioré ». Pas nécessaire, par construction il y a forcément quelque chose (c’est dans les colonnes précédentes qu’il peut y avoir des cellules vides)… mais on peut quand même avoir un avertissement ? (l’erreur est humaine)
En plus, il y a 1 truc que je voudrais vérifier :
Si je veux partir de la ligne 13, je dois changer le code par ?
Code:
LigneFeuilleSource = 13

A tous les 2, j’ai un souci de destination car ce n’est pas la feuille 2 mais un autre fichier appelé text1.xlsx ou mieux test2.csv comme :
Code:
ActiveWorkbook.SaveAs Filename:="Test2.csv", _
        FileFormat:=xlCSV, CreateBackup:=False
Je ne connais pas le code pour désigner un fichier et pas seulement une feuille (c’est la feuille 1 qui est concernée dans le fichier source et le fichier destination, et si je nomme la feuille 1 du fichier source que dois-je changer ?).
Dans la macro automatique j’avais activé :
Code:
Windows("Test1.xlsx").Activate
Code:
Windows("Test.xlsm").Activate
D’ailleurs après la question du formatage en texte partout j’en profite pour m’assurer que les formules qui existent dans la feuille source seront bien transformées en texte ???
J’ai aussi une question plus prospective… si je change ou j’ajoute dans le futur des colonnes.
Par exemple pour Gurgeh avec une copie différente des colonnes 2 et 3 seulement, puis 5 et 6, puis 9 à 11 (avant la 12), j’aurais (pour vérifier) ?
Code:
For colonne = 2 To 11
            If colonne [ 4 Then FeuilleDestination.Cells(LigneFeuilleDestination, colonne).Value = FeuilleSource.Cells(LigneFeuilleSource, colonne).Value
            If colonne ] 4 et [ 7 Then FeuilleDestination.Cells(LigneFeuilleDestination, colonne).Value = FeuilleSource.Cells(LigneFeuilleSource, colonne + 1).Value
            If colonne ] 8 Then FeuilleDestination.Cells(LigneFeuilleDestination, colonne).Value = FeuilleSource.Cells(LigneFeuilleSource, colonne + 1).Value

        Next colonne
Pour la macro de Bebere, là je suis perdue, mais j’aimerais comprendre.

Enfin, quand j’aurai résolu tous ces micro soucis, je serai bien sûr très contente… mais je vais tout vous dire :
J’ai plusieurs macros très similaires à faire et avec ce qui est déjà fait je n’aurai aucun mal à faire du copier coller adapté, mais je pense aussi aux autres et ma démarche initiale est issue d’un post sur un autre forum sans rapport avec Excel et donc pour les forumistes de ce post, je me demande si vous seriez tenté(s) de généraliser votre macro pour des cas semblables pour d’autres projets (et alors je copierai votre macro sur le post concerné ou bien je mettrai un lien vers ce post).

Cela reviendrai à créer plusieurs (ce que j’appellerai) variables en tête de macro :
Une première variable pour la ligne de départ du fichier source, donc à remplir
Une deuxième variable avec la liste des colonnes du fichier source dans cet ordre, par copie directe (sans modif)
Une troisième variable qui désignera les colonnes du fichier source avec un traitement
Une quatrième variable dans laquelle sera transcrite la formule comme (ici)
Code:
TexteIndex = TexteIndex & "|" & FeuilleSource.Cells(LigneFeuilleSource, ColonneIndex).Value
Et ainsi de suite, il serait possible d’ajouter des variables (manuellement) pour continuer d’autres processus du même type (par exemple autres copies directes ou autres traitements.
Sachant que par nature pour ces projets, le fichier destinataire commence toujours à la ligne 2 et l’ordre de copies des colonnes et des traitements est le même.
Voilà pour vos méninges, si cela vous tente…

Merci encore à tous les 3.

A+, Steph
 

stephsteph

XLDnaute Occasionnel
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

Bonjour à tous les 3,

Tout d’abord mes excuses, je ne pensais pas vous réduire au silence en vous proposant de généraliser ma démarche pour l’intérêt des autres.
Enfin tant pis, oublions la généralisation.
Je reviens vers Gurgeh (je ne peux pas avancer sur la macro de Bebere, par manque de compétence) car je me suis aperçue d’un bug dans ta macro.
Pour une raison que j’ignorais la colonne 5 n’étais pas copiée… mais en modifiant (au hasard) ta macro légèrement avec :
Code:
 If colonne <= 5 Then FeuilleDestination.Cells(LigneFeuilleDestination, colonne).Value = FeuilleSource.Cells(LigneFeuilleSource, colonne).Value
Au lieu de
Code:
 If colonne < 5 Then FeuilleDestination.Cells(LigneFeuilleDestination, colonne).Value = FeuilleSource.Cells(LigneFeuilleSource, colonne).Value
Cela marche OK.
Pour mes autres questions :
* j’ai résolu celle de la colonne 7 qui affiche un nombre (alors que je voulais du texte pour tout, avec le point, car parfois c’est par ex. 1832b.) en formattant toutes les cellules de la feuille 2 au format texte au préalable
* si je veux partir de la ligne 13, je ne peux changer le code par 13
Code:
LigneFeuilleSource = 13
Car alors le résultat c’est que c’est la 1ère ligne commence par le numéro 13 et ce n’est pas surprenant car tu lui demandes le numèro de la ligne de départ. Peut-on contourner ? En lui demandant d’écrire le numéro, moins 1, de la ligne de destination ?
* le souci du fishier de destination (ce n’est pas une mince affaire car en utilisant la feuille 2 mon fichier augmente de taille de 50% et j’atteint plus de 20 Mo, ce qui me pose déjà des soucis) : il faudrait que ce ne soit pas la feuille 2 mais un autre fichier appelé text1.xlsx ou mieux test2.csv comme :
Code:
ActiveWorkbook.SaveAs Filename:="Test2.csv", _
        FileFormat:=xlCSV, CreateBackup:=False
Je ne connais pas le code pour désigner un fichier et pas seulement une feuille (c’est la feuille 1 qui est concernée à la fois dans le fichier source et le fichier destination, et la feuille 1 du fichier source est nommée, ce que je n’avais pas fait dans le fichier test, désolée).
*enfin, je ne comprend pas le fonctionnement de ta formule
Code:
TexteIndex = TexteIndex & "|" & FeuilleSource.Cells(LigneFeuilleSource, ColonneIndex).Value
Car si (en pensant obtenir la même chose que Bebere) je change la formule par
Code:
TexteIndex = "|" & TexteIndex & FeuilleSource.Cells(LigneFeuilleSource, ColonneIndex).Value
…cela me fait n’importe quoi, et j’aimerais mieux comprendre ce que cette formule fait pour avoir plus de flexibilité à l’avenir.
Merci.
En espérant que vous ne me tiendrez pas rigueur d’avoir proposé une généralisation…
A+
Steph
 

Bebere

XLDnaute Barbatruc
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

bonjour Steph
c'est simplement un manque de temps
rien de compliqué dans ce code

Code:
Sub Macro1() 'bebere
    Dim tbl, derl As Long, derc As Long, l As Long, c As Byte, i As Byte
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    With Feuil1
        derl = .Cells.Find("*", [A1], , , 1, 2).Row
        dercol = .Cells.Find("*", [A1], , , 2, 2).Column
        tbl = .Range("A1:" & Cells(derl, dercol).Address)
        'ou si rien d'autre dans la feuille
'        tbl = .UsedRange
    End With

    For l = 1 To UBound(tbl, 1)
        tbl(l, 1) = l
        For c = 6 To 12    'colonnes 6 à 12
            Select Case c
            Case Is <= 12
                tbl(l, c - 1) = tbl(l, c): tbl(l, c) = "" 'met 6 en 5,7 en 6,8 en 7,etc
            End Select
        Next c

        For i = 13 To UBound(tbl, 2)
            If tbl(l, i) <> "" Then
                tbl(l, 11) = tbl(l, 11) & "|" & tbl(l, i) 'concatène
                tbl(l, i) = ""
            End If
        Next i

    Next l
'enlève colonnes vides
ReDim Preserve tbl(1 To UBound(tbl, 1), 1 To UBound(tbl, 2) - (dercol - 11))

    With Feuil2
        .Range("A2").Resize(UBound(tbl, 1), UBound(tbl, 2)) = tbl
    End With
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

End Sub
 

stephsteph

XLDnaute Occasionnel
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

Bonjour Bebere,

Merci Bebere de cette nouvelle mouture de ton code avec explications et aussi quelques modifs bienvenues (en effet, le code précédent marchait sur le fichier test mais pas sur le gros fichier… j’avais une erreur 424 sur derl = .Range("A65536").End(xlUp).Row, maintenant c’est OK et donc je te remercie beaucoup et on peut stopper ce fil là si tu ne veux pas prendre encore 15 secondes et demies (!) sur les petites questions subsidiaires ci-après.
Merci aussi d’avoir apaisé mon angoisse (c’est vrai que quand je regarde le forum, tu ne t’arrêtes pas d’aider !).
Voici les questions pour régler les problèmes de mon 2ème (et dernier) type de fichier (tu peux te servir de test3.xlsm attaché, c’est similaire au précédent, sauf que le fichier initial part de la ligne 13 pour les données utiles et qu’il n’y a pas de concatenage à faire, et sauf que je ne peux pas utiliser de feuille 2 –je dois ouvrir un fichier destinataire et enregister dedans).
J’ai essayé de modifier ton code à la ligne suivante en remplaçant 1 par 13:
Code:
derl = .Cells.Find("*", [A13], , , 1, 2).Row
mais cela ne marche pas.
Donc, voici les problèmes spécifique de cette 2ème macro très proche de la précédente et même plus simple.
Le fichier source part de la ligne 13 (pas de la ligne 1), les lignes précédentes sont remplies de données sans intérêt mais je ne peux les effacer
Le fichier source a sa feuille 1 (de travail) appelée « Muscat »
Le fichier destination n’est pas la feuille 1 du fichier source mais un autre fichier appelé machin.xlsx
Dans le fichier destination, le processus est :
le même pour la 1ère colonne, mais le nombre 1 à partir de la ligne 13 du fichier source
on copie la valeur en format texte des cellules de colonnes non contigues du fichier source
par exemple on copie simplement les colonnes 3, 5, 7, 9, 10, 4, 12, 13, 14, 18 du fichier source dans le fichier destinataire dans le même ordre (donc en colonnes 2 à 11, à partir de la ligne 2.
Si tu préfères je peux poster un nouveau fil et repartir à zéro (mais je préfère rester avec toi pour améliorer mes connaissances sur une façon la tienne, d'écrire le code).
Pour faire plus simple, j’attache le fichier précédent renommé test3.xlsm (ne pas tenir compte de la feuille 2) et le fichier destinataire vide machin.xlsx.
Excuse-moi, il vaut mieux que je précise : il n’y a pas de boucle et je peux faire cela en macro automatique sauf que cela prend longtemps car je « produit » à la queue-leu-leu 7 fichiers machin.xlsx (machin1, machin2, etc) avec chaque fois la même construction pour la 1ère colonne et les suivantes aux contenus différents avec des colonnes sélectionnées une par une différentes, au nombre variable (pas toujours 11) et dans un ordre différent !!!
J’ai travaillé (tâtonné) sur ta macro avec les explications que tu as ajoutées, mais je n’y arrive pas car je n’ai pas le niveau minimum. Désolée. Donc si tu peux aider ce serait parfait, sinon, je me rabattrai sur la macro automatique avec une surcharge de travail à chaque fois car comme mes colonnes ne sont pas toutes totalement remplies, il faudra que je change la ligne finale à chaque fois que je ferai tourner la macro (toi tu utilises la variable derl et tu copie de ligne à ligne).

Merci

A+, Steph
 

Pièces jointes

  • Test3.xlsm
    18.4 KB · Affichages: 51
  • machin.xlsx
    8.4 KB · Affichages: 27
  • Test3.xlsm
    18.4 KB · Affichages: 61
  • Test3.xlsm
    18.4 KB · Affichages: 52

Bebere

XLDnaute Barbatruc
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

bonjour Steph
pour les colonnes variables,plusieurs choix
une inputbox
les écrire dans une feuille
un petit userform pour les choisir
une question,les colonnes sont elles variables pour l'ensemble des fichiers à traiter
 

stephsteph

XLDnaute Occasionnel
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

Oups, bebere, je me suis mal exprimée.
1000 excuses.
Elles ne sont pas variables.
Ce que je voulais dire, c'est que pour machin1.xlsx, c'est les colonnes 3, 5, 7, 9, 10, 4, 12, 13, 14, 18 (et cela ne bougera pas) qui seont copiées avec une ligne de décalage.
Et pour la macro suivante, celle qui remplit machin2.xslx, ce sera une autre série de colonnes par exemple, 2, 6, 7, 8, 13, 15, 17, 19, 20, 21, 47, 65, 70, 81, 83, 84, et donc ici on a 17 colonnes (avec la colonne 1 au nombre incréménté)
Et pour la macro suivante ce sera encore une autre série de colonnes (c'est la définition, le nombre, et la séquence des colonnes qui varient, pas des variables, c'était un mauvais mot).
Suis-je plus claire?
En pratique cela va revenir à éclater le contenu d'un fichier qui fait actuellement 257 colonnes en plusieurs fichiers qui chacun ne devrait pas dépasser 20-30 colonnes.
C'est pour cela que la petite macro pour machin.xlsx est simple (pour toi) et que je n'aurai pas de mal à la copier pour faire d'autres macros en changeant les numéros et ordre des colonnes (et même je pourrai mettre toutes ces petites macros dans une grande que j'exécuterait d'un coup en enregistrant machin1, 2 , 3, etc. à la fin de chaque petite macro).
Re-re-merci de ton aide !
Steph
 

stephsteph

XLDnaute Occasionnel
Re : Petite macro simple avec une double boucle sur ligne pour très gros fichier

Bebere, pour être sûre, je viens de faire manuellement le début du 1er fichier machin (machinTEST) que je te joins.
A+ Steph
 

Pièces jointes

  • machinTEST.xlsx
    10.8 KB · Affichages: 38

Discussions similaires

Statistiques des forums

Discussions
312 080
Messages
2 085 152
Membres
102 794
dernier inscrit
espinata