Inserer lignes en fonction de plusieurs cellules excel 2007

grotsblues

XLDnaute Occasionnel
Bonjour le forum

Après multiple recherche j ai pas trouvé un code qui aurait pu m aider mais pas moyen de le faire corresponde à mon problème
J ai un fichier excel de plusieurs lignes, je souhaiterez qu'il recopie une partie de la ligne sur la feuille 2 en fonction de plusieurs cellules et qu'il me divise par 100 les montants, le fichier est utilisé tous les mois le format est toujours le même sauf le nombre de lignes qui varies je mets à dispo un exemple pour plus de compréhension

le code que j ai trouve
Sub insererlignes()

[A18].Select: Selection.Clear: L& = 19

With [A1].CurrentRegion
For R& = 2 To .Rows.Count
For C& = 12 To .Columns.Count
L = L + 1
.Cells(R, C).Copy Cells(L, 5)
.Cells(R, 8).Copy Cells(L, 3)
.Cells(R, 9).Copy Cells(L, 4)
.Cells(R, 7).Copy Cells(L, 1)
.Cells(R, 15).Copy Cells(L, 6)

Next C
Next R
End With

End Sub

Je vous remercie par avance de votre aide
 

Pièces jointes

  • teste forum.xlsm
    51.7 KB · Affichages: 43

vgendron

XLDnaute Barbatruc
Hello
un exemple avec ce code
VB:
Sub CopiePartieTablo()
Dim TabloInit() As Variant
Dim TabloFinal() As Variant

With Sheets("SAL")
    TabloInit = .UsedRange.Value
End With

For i = LBound(TabloInit, 1) + 1 To UBound(TabloInit, 1)
    For j = 12 To 17
        If TabloInit(i, j) <> "" Then TailleFinal = TailleFinal + 1
    Next j
Next i
ReDim TabloFinal(1 To TailleFinal, 1 To 11)
k = 1
For i = LBound(TabloInit, 1) + 1 To UBound(TabloInit, 1)
    For j = 12 To 17
        If TabloInit(i, j) <> "" Then
            TabloFinal(k, 1) = TabloInit(i, 7)
            TabloFinal(k, 2) = TabloInit(i, 4)
            TabloFinal(k, 3) = TabloInit(i, 5)
            TabloFinal(k, 4) = TabloInit(i, 6)
            TabloFinal(k, 5) = TabloInit(i, 8)
            TabloFinal(k, 6) = TabloInit(i, 9)
            TabloFinal(k, 7) = TabloInit(i, j)
            TabloFinal(k, 8) = TabloInit(i, j + 6) / 100
            TabloFinal(k, 9) = TabloInit(i, 24) / 100
            TabloFinal(k, 10) = TabloInit(i, 25) / 100
            TabloFinal(k, 11) = TabloInit(i, 26) / 100
            k = k + 1
        End If
    Next j
Next i
           
With Sheets("SAL AU FORMAT")
    .UsedRange.Offset(1, 0).Clear
    .Range("A2").Resize(UBound(TabloFinal, 1), UBound(TabloFinal, 2)) = TabloFinal
End With

End Sub
 

grotsblues

XLDnaute Occasionnel
Bonsoir et merci beaucoup
Cela fonctionne parfaitement mais j ai une question certainement idiote mais j ai voulu faire fonctionner le code en pas à pas detaillé afin de le comprendre mais il ne se passe rien pourquoi ?

merci pour votre réponse
 

job75

XLDnaute Barbatruc
Bonsoir grotsblues, vgendron,
j ai voulu faire fonctionner le code en pas à pas detaillé afin de le comprendre mais il ne se passe rien pourquoi ?
Vous découvrez les tableaux VBA qui sont des matrices.

Pendant que la macro les étudie il ne se passe rien dans la feuille de calcul, c'est pour ça que c'est très rapide.

Une fois le tableau TabloFinal complètement rempli il est restitué en bloc dans la feuille de calcul.

A+
 

job75

XLDnaute Barbatruc
Bonjour grotsblues, vgendron, le forum,

Juste une petite variante de la macro de vgendron :
Code:
Sub CopiePartieTablo_bis()
Dim TabloInit, TabloFinal, i&, j%, k&

With Sheets("SAL").UsedRange
  TabloInit = .Resize(, 26)
  ReDim TabloFinal(1 To Application.CountA(.Columns("L:Q")) + 1, 1 To 11)
End With

For i = 2 To UBound(TabloInit)
    For j = 12 To 17
        If TabloInit(i, j) <> "" Then
            k = k + 1
            TabloFinal(k, 1) = TabloInit(i, 7)
            TabloFinal(k, 2) = TabloInit(i, 4)
            TabloFinal(k, 3) = TabloInit(i, 5)
            TabloFinal(k, 4) = TabloInit(i, 6)
            TabloFinal(k, 5) = TabloInit(i, 8)
            TabloFinal(k, 6) = TabloInit(i, 9)
            TabloFinal(k, 7) = TabloInit(i, j)
            TabloFinal(k, 8) = TabloInit(i, j + 6) / 100
            TabloFinal(k, 9) = TabloInit(i, 24) / 100
            TabloFinal(k, 10) = TabloInit(i, 25) / 100
            TabloFinal(k, 11) = TabloInit(i, 26) / 100
        End If
Next j, i
          
With Sheets("SAL AU FORMAT")
    If k Then .Range("A2").Resize(k, 11) = TabloFinal
    .Range("A" & k + 2 & ":K" & .Rows.Count).ClearContents 'RAZ sous le tableau
End With
End Sub
Elle évite le bug si la feuille "SAL" est vide.

Et surtout elle évite un saut d'écran à la restitution quand on l'exécute via une Worksheet_Activate.

Pour tester j'ai recopié le tableau source sur 70 000 lignes : l'exécution se fait en 2,7 secondes chez moi.

Bonne journée.
 

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin