XL 2016 Macro, recopie selon critère sur plusieurs lignes

Marjo2

XLDnaute Occasionnel
Bonjour Forum,

Je cherche à recopier le chiffre qui se situe sur la ligne "Stock fin", colonne G dans la colonne Q correspondant à cet article (colonne M)
Dans la colonne Q, le même chiffre sur toutes les lignes de l'article concerné.

Si qté = 0 alors je peux supprimer les lignes


Merci beaucoup
 

Pièces jointes

  • TEST.xlsm
    71.4 KB · Affichages: 14

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Marjo, bonjour le forum,

Peut-être comme ça :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim I As Integer 'déclare la variable I(Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TSF() As Variant 'déclare la variable TSF (Tableau des Stock Fin)

Set O = Worksheets("EXPORT") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
K = 1 'initialise la variable K
For I = 2 To NL 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    If TV(I, 5) = "Stock fin" Then 'condition : si la donnée ligne I colonne 5 de TV (=> colonne E) vaut "Stock fin"
        ReDim Preserve TSF(1 To 2, 1 To K) 'redimensionne le tableau TSF (2 lignes, K colonnes)
        TSF(1, K) = TV(I, 7) 'récupère la valeur en colonne 7 (=> colonne G) dans la ligne 1
        TSF(2, K) = CStr(TV(I, 13)) 'récupère la référence en colonne 13 (=> colonne 13) dans la ligne 2
        K = K + 1 'initialise la variable K
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle

For J = 1 To UBound(TSF, 2) 'boucle 1 : sur toutes les colonnes J du tableau TSF
    For I = NL To 2 Step -1 'boucle 2 : inversée sur toutes les lignes I du tableau des valeurs TV (de la dernière à la seconde)
        If TV(I, 13) = TSF(2, J) Then 'condition 1 : si la donnée en colonne M (référence) est égale à la ligne 2 du tableau TSF
            If TSF(1, J) = 0 Then 'condition 2 : si la valeur ligne 1 du tableau TSF est égale à zéro
                O.Rows(I).Delete 'supprime la ligne de boucle 2
            Else 'sinon (condition 2)
                O.Cells(I, "Q") = TSF(1, J) 'revnvoie la valeur ligne 1 du tableau TSF dans la cellule ligne I colonne Q
            End If 'fin de la condition 2
        End If 'fin de la condition 1
    Next I 'prochaine ligne de la boucle 2
Next J 'prochaine colonne de la boucle 1
O.Columns(17).NumberFormat = "0.000" 'formate la colonne Q
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Pas étonnant !... Va faire un tour au café de la Gare. Donne le bonjour à Jojo de ma part, reviens et là... Peut-être...
Plus sérieusement, je vais essayer d'optimiser le code mais pas aujourd'hui... Pose toi la question de savoir combien de temps tu aurais mis en faisant ça à la main...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Sur mon PC moins de 2 secondes sut ton fichier TEST2. Essaie ce nouveau code :

VB:
Sub AvecStock()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim NL As Long 'déclare la variable NL (Nombre de Lignes)
Dim I As Long 'déclare la variable I(Incrément)
Dim LD As Long
Dim LF As Long

Set O = Worksheets("EXPORT (2)") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
K = 1 'initialise la variable K
For I = NL To 2 Step -1 'boucle inversée sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    If TV(I, 5) = "Stock fin" Then LF = I
    If TV(I, 5) = "Stock début" Then
        V = CDbl(TV(I, 7))
        LD = I
        If V = 0 Then
            O.Rows(LD & ":" & LF).Delete
        Else
            O.Range(O.Cells(LD, "Q"), O.Cells(LF, "Q")).Value = V
        End If
    End If
Next I 'prochaine ligne de la boucle
O.Columns(17).NumberFormat = "0.000" 'formate la colonne Q
End Sub
 

Marjo2

XLDnaute Occasionnel
Beaucoup plus rapide, merci.
L'export a changé (le format change car j'ai pris 2 années au lieu de 1 comme l'exemple précédent)
Vu que la macro du dessus, tu lui dis de recopier le chiffre en colonne G suivant les lignes compris entre Stock début et stock fin.
Est-il possible d'ajouter un bout de code qui déplace la ligne stock début de l'article colonne M pour placer cette ligne en premier et donc faire fonctionner le code plus haut ?
 

Pièces jointes

  • Test4.xlsm
    84.5 KB · Affichages: 8

Marjo2

XLDnaute Occasionnel
Désolé. Le format de mon export à changer. Maintenant il met des dates AA/MM/AAAA puis stock début pour finir stock fin.
Au commencement de la macro, l'export était stock début puis des dates AA/MM/AAAA pour finir stock fin.
Ma question est de déplacer la ligne stock début pour la placer au commencement de chacun des articles (colonne M)
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Ton fichier TEST4 ne reflète pas la réalité, il me semble. La référence est la même partout !?... Pourrais-tu renvoyer un fichier valable un peu plus conséquent, qui permette de tester convenablement Je vais voir si je trouve moyen de coder différemment...
 

Marjo2

XLDnaute Occasionnel
Ce qui fait un article c'est la référence (colonne A) + les sous références (colonne C et D) d'où que j'ai mis une formule concaténer.

Encore merci de ton aide. Et la macro du dessus est loin d'être inutile car je vais pouvoir l'adapter à un autre fichier grâce à tes explications.
 

Pièces jointes

  • TEST5.xlsm
    642.9 KB · Affichages: 7

Discussions similaires