Méthodologie pour ecriture macro

12exemple-excel.xlsx (11.29 Ko)

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

à tester ^^

18test.xlsm (21.45 Ko)

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 Sub

Bonjour,

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 Sub

Bonsoir à 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 Sub

klin89

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 !

Rechercher des sujets similaires à "methodologie ecriture macro"