XL 2016 VBA-Repeter une action plusieurs fois entre deux feuilles

Wendso

XLDnaute Nouveau
Bonjour!
J'ai besoin de votre aide urgemment; voilà:
J'ai des données disposée de la sorte:
upload_2017-9-29_12-40-44.png

J'aimerais copier chaque ligne horizontale dans une autre feuille sous une autre disposition verticale:
upload_2017-9-29_12-42-31.png

J'en ai une tonne et je voudrais créer un script VBA pour cela. Je ne m'y connais pas en programmation, j'ai besoin de votre aide.
Voici la macro que j'ai enregistré pour 2 lignes:
Sub Macro2()
'
' Macro2 Macro
'

'
Sheets("9439014").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
Sheets("Feuil2").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Selection.End(xlDown).Select
Range("B32").Select
Sheets("9439014").Select
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 5
ActiveWindow.ScrollColumn = 4
ActiveWindow.ScrollColumn = 3
ActiveWindow.ScrollColumn = 2
ActiveWindow.ScrollColumn = 1
Range("D5").Select
Range(Selection, Selection.End(xlToRight)).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Feuil2").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
End Sub

Pouvez-vous m'aider à répéter l'action de : copier une à une les plages de données horizontale de la feuille "9439014" et coller verticalement (la transposée) sur une colonne de la deuxième feuille, ainsi de suite jusqu'à la dernière ligne de la feuille de destination.
Merci d'avance!!!
 

vgendron

XLDnaute Barbatruc
Bonjour

déjà.. Urgemment.. ca va bloquer pas mal de monde.. ca fait un peu. je commande.. en oubliant qu'ici. ca reste au bon vouloir des gens
ensuite; les deux photos ne servent pas à grand chose.. on ne voit pas
il faut donc mieux poster un fichier exemple--> pas besoin de mettre 50 000 lignes.. juste quelques unes suffisent pour qu'on comprenne parfaitement la structure de ton fichier, et ce que tu souhaites obtenir

pour quelqu'un qui ne connait rien à VBA, je trouve que ta démarche d'utiliser l'enregistreur de macro est parfaite ! (ca arrive assez peu pour etre souligné :-D)

donc, dès que tu aura mis ton fichier (SANS données confidentielles bien sur), tu risques de te retrouver à devoir à faire un choix dans les propositions recues :-D
à te lire
 

Wendso

XLDnaute Nouveau
Bonjour

déjà.. Urgemment.. ca va bloquer pas mal de monde.. ca fait un peu. je commande.. en oubliant qu'ici. ca reste au bon vouloir des gens
ensuite; les deux photos ne servent pas à grand chose.. on ne voit pas
il faut donc mieux poster un fichier exemple--> pas besoin de mettre 50 000 lignes.. juste quelques unes suffisent pour qu'on comprenne parfaitement la structure de ton fichier, et ce que tu souhaites obtenir

pour quelqu'un qui ne connait rien à VBA, je trouve que ta démarche d'utiliser l'enregistreur de macro est parfaite ! (ca arrive assez peu pour etre souligné :-D)

donc, dès que tu aura mis ton fichier (SANS données confidentielles bien sur), tu risques de te retrouver à devoir à faire un choix dans les propositions recues :-D
à te lire

Euh...Loool oui tu as raison
Bon voilà je joins alors le fichier excel
Merci vgendron!!!
 

Pièces jointes

  • Exemple.xlsx
    191.8 KB · Affichages: 39

vgendron

XLDnaute Barbatruc
et voici le code à mettre dans un module standard

j'ai ajouté des commentaires pour expliquer
VB:
Option Base 1
Sub conversion()

Dim TabData As Variant
Dim TabFinal As Variant
Nbligne = Range("A" & Rows.Count).End(xlUp).Row 'récupère le nombre de lignes à traiter dans la feuille active
NbCol = 34 'nombre de colonnes: 31 jours + 3eme colonnes ABC

TabData = Range("A1").Resize(Nbligne, NbCol).Value 'on met tout dans un tableau
ReDim TabFinal(Nbligne * 31, 2) 'on créé un second tableau de 2 colonnes: la première contenant les NbLignes*31 dates, et la seconde contenant les valeurs
k = 1
For i = 2 To UBound(TabData, 1) 'pour chaque ligne
    For j = 4 To UBound(TabData, 2) 'pour chaque colonne
        TabFinal(k, 1) = DateSerial(TabData(i, 2), TabData(i, 3), TabData(1, j)) 'on met la date construite avec l'année en colonne B, le mois colonne C et jour de la ligne 1
        TabFinal(k, 2) = TabData(i, j) 'on met la valeur
        k = k + 1
    Next j
Next i

'on colle le résultat dans la feuille 2
With Sheets("Feuil2")
    .Range(.Cells(2, 1), .Cells(UBound(TabFinal, 1), UBound(TabFinal, 2))) = TabFinal
End With
End Sub
 

vgendron

XLDnaute Barbatruc
Autre proposition pour éviter de crééer des dates farfelues.. genre le 30 Février qui devient automatiquement un 02 mars..

VB:
Option Base 1
Sub conversion()

Dim TabData As Variant
Dim TabFinal As Variant
Nbligne = Range("A" & Rows.Count).End(xlUp).Row 'récupère le nombre de lignes à traiter dans la feuille active
NbCol = 34 'nombre de colonnes: 31 jours + 3eme colonnes ABC

TabData = Range("A1").Resize(Nbligne, NbCol).Value 'on met tout dans un tableau
ReDim TabFinal(Nbligne * 31, 2) 'on créé un second tableau de 2 colonnes: la première contenant les NbLignes*31 dates, et la seconde contenant les valeurs
k = 1
For i = 2 To UBound(TabData, 1) 'pour chaque ligne
    For j = 4 To UBound(TabData, 2) 'pour chaque colonne
        If Month(DateSerial(TabData(i, 2), TabData(i, 3), TabData(1, j))) <= CInt(TabData(i, 3)) Then
            TabFinal(k, 1) = DateSerial(TabData(i, 2), TabData(i, 3), TabData(1, j)) 'on met la date construite avec l'année en colonne B, le mois colonne C et jour de la ligne 1
            TabFinal(k, 2) = TabData(i, j) 'on met la valeur
            k = k + 1
        End If
    Next j
Next i

'on colle le résultat dans la feuille 2
With Sheets("Feuil2")
    .Range("A:B").ClearContents
    .Range(.Cells(2, 1), .Cells(UBound(TabFinal, 1), UBound(TabFinal, 2))) = TabFinal
End With
End Sub
 

Wendso

XLDnaute Nouveau
Merci beaucoup @vgendron!désolée, j'essaye de me connecter au forum depuis pour vous remercier mais connexion mauvaise! J'ai essayé d'exécuter en vain, ça me montrait des erreurs mais je crois que c'était lié à la feuille où le module était enregistré. Après avoir compris, ça a marché mais toujours des soucis avec les dates à cause des mois de février et des mois à 30 jours. Donc ce que j'ai fais c'est juste exécuter la macro et copier juste la colonne des valeurs après avoir supprimé les cellules vides! Et c'est vraiment rapide maintenant avec la macro! Merci beaucoup beaucoup, tu es un génie!
 

Discussions similaires

Réponses
2
Affichages
122
Réponses
5
Affichages
124

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 187
dernier inscrit
ebenhamel