Méthodologie pour ecriture macro
Bonjour à tous,
J'ai un nouvel exemple à vous soumettre suite au dernier qui avait fait choux blanc.
j'ai un fichier de 36748 lignes avec 62 colonnes.
12 de ces colonnes représentent une date qui est ou non remplie (date ou bien "0")
chaque fois qu'une de ces colonnes a une date de remplie je souhaiterais recréer une ligne reprenant toutes les informations des 12 premières colonnes et dans la 13ème, la dite date pour pouvoir ensuite faire des tcd à partir de ces infos mises en forme.
soit je le fais à la mimine (36748*12=438756 lignes à la (très) grosse louche) soit je fais une macro...
par contre, étant débutant, j'ai beaucoup de mal à envisager la méthodologie à suivre pour la macro.
j'ai dans l'idée :
- si dans mes colonnes de N à AJ (en fait, une colonne sur deux car entre chaque colonne date il y a une colonne numéro de semaine qui ne m'intéresse pas) il y a une information différente de 0
- alors je viens inscrire dans un nouveau tableau les colonnes A à L ainsi que dans la colonne suivante mon information de date
pour moi il va me falloir :
- une boucle pour lire chaque cellule
- une fonction if ou select case (??)
partant de là, franchement je suis perdu, comment procéderiez vous ?
je joins un exemple du tableau avec quelques lignes parce qu'à mon avis le tableau total ne va pas passer
Merci pour vos avis.
Cyril
Bonjour,
On a le tableau de départ. La condition de traitement tu nous l'a précisé. Mais on n'a pas le tableau de résultat attendu. Essaye de nous le joindre avec.
Bonjour,
si j'ai bien compris
Pour que la macro fonctionne, il faut créer une feuille nommée "feuil2" qui contiendra le résultat
Sub aargh()
Dim v
Dim c()
With Sheets("feuil1")
dl = .Cells(Rows.Count, 1).End(xlUp).Row
v = .Range("A1:AJ" & dl)
End With
ctr = ctr + 1
ReDim Preserve c(1 To 13, 1 To ctr)
For k = 1 To 12
c(k, ctr) = v(1, k)
Next k
c(13, ctr) = "Date"
For i = LBound(v, 1) + 1 To UBound(v, 1)
For j = 14 To 36 Step 2
If Val(v(i, j)) = 0 Then Exit For
ctr = ctr + 1
ReDim Preserve c(1 To 13, 1 To ctr)
For k = 1 To 12
c(k, ctr) = v(i, k)
Next k
If v(i, j) <> 0 Then c(13, ctr) = v(i, j)
Next j
Next i
With Sheets("feuil2")
.Cells.ClearContents
.Range("A1").Resize(ctr, 13) = Application.Transpose(c)
End With
End SubBonjour,
h2so4, je crains que tu ne sois frappé par la limite à 65536 lignes de Application.Transpose(c)
Il faudrait écrire par blocs.
eric
eriiic a écrit :Bonjour,
h2so4, je crains que tu ne sois frappé par la limite à 65536 lignes de Application.Transpose(c)
Il faudrait écrire par blocs.
eric
c'est exact
re bonjour,
voici un code corrigé qui gère plus de 65535 lignes résultantes
Sub aargh()
Dim v
Dim c()
With Sheets("feuil1")
dl = .Cells(Rows.Count, 1).End(xlUp).Row
v = .Range("A1:AJ" & dl)
End With
Sheets("feuil2").Cells.ClearContents
ctr = ctr + 1
fr = 1
ReDim Preserve c(1 To 13, 1 To ctr)
For k = 1 To 12
c(k, ctr) = v(1, k)
Next k
c(13, ctr) = "Date"
For i = LBound(v, 1) + 1 To UBound(v, 1)
For j = 14 To 36 Step 2
If Val(v(i, j)) = 0 Then Exit For
ctr = ctr + 1
ReDim Preserve c(1 To 13, 1 To ctr)
For k = 1 To 12
c(k, ctr) = v(i, k)
Next k
If v(i, j) <> 0 Then c(13, ctr) = v(i, j)
If ctr = 65535 Then
Sheets(2).Range("A" & fr).Resize(ctr, 13) = Application.Transpose(c)
fr = fr + ctr
ctr = 0
ReDim c(1 To 13, 1 To 1)
End If
Next j
Next i
On Error Resume Next
Sheets(2).Range("A" & fr).Resize(ctr, 13) = Application.Transpose(c)
End SubBonsoir à tous,
Un poil différent en évitant ReDim Preserve
Option Explicit
Sub test()
Dim a, b(), i As Long, n As Long, j As Byte, k As Byte
With Sheets("Feuil1").Range("A1").CurrentRegion
a = Application.Index(.Value, Evaluate("row(1:" & _
.Rows.Count & ")"), Array(1, 2, 3, 4, 5, 6, 7, 8, 9, _
10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, _
34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60))
End With
ReDim b(1 To UBound(a, 1) * 24, 1 To 13)
n = 1
For i = 1 To 12
b(n, i) = a(1, i)
Next
b(n, 13) = "Date"
For i = 2 To UBound(a, 1)
For j = 13 To UBound(a, 2)
If a(i, j) <> "" Then
n = n + 1
For k = 1 To 12
b(n, k) = a(i, k)
Next
b(n, 13) = a(i, j)
End If
Next
Next
'Restitution en Feuil2
Application.ScreenUpdating = False
With Sheets("Feuil2")
.Cells.Clear
With .Cells(1).Resize(n, UBound(b, 2))
.FormulaLocal = b
With .Rows(1)
.BorderAround Weight:=xlThin
.Interior.ColorIndex = 44
End With
.Font.Name = "calibri"
.Font.Size = 10
.BorderAround Weight:=xlThin
.Borders(xlInsideVertical).Weight = xlThin
.VerticalAlignment = xlCenter
.Columns.AutoFit
End With
End With
Application.ScreenUpdating = True
End Subklin89
cc3087d a écrit :chaque fois qu'une de ces colonnes a une date de remplie je souhaiterais recréer une ligne reprenant toutes les informations des 12 premières colonnes et dans la 13ème, la dite date pour pouvoir ensuite faire des tcd à partir de ces infos mises en forme.
Pourquoi ne pas faire un TCD directement sur le tableau ?
Bonjour à tous,
merci pour votre coup de main, c'est vraiment sympa.
Alors, dans l'ordre :
steelson a écrit :Pourquoi ne pas faire un TCD directement sur le tableau ?
Eeeuh je ne suis pas sur que ça passe, l'idée c'est d'avoir une ligne par date pour pouvoir ensuite savoir combien j'ai de lignes par mois, etc.
Concernant les exemples de Klin89 et h2so4, merci beaucoup mais ça dépasse mon niveau en macro... je vais prendre le temps de regarder dans le détail comment vous avez magouillé le truc, ce sera autant de choses d'apprises
Raja a écrit :On a le tableau de départ. La condition de traitement tu nous l'a précisé. Mais on n'a pas le tableau de résultat attendu. Essaye de nous le joindre avec.
Effectivement, ce sera plus parlant. J'y penserai la prochaine fois.
Guitouille a écrit :à tester ^^
Ca fonctionne au poil, en plus je comprends presque le code :p
Merci beaucoup pour le coup de main !