Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 [RESOLU] VBA boucle, insertion plusieurs lignes, exécution formules, suppression sur si

JVOS

XLDnaute Junior
Bonjour
Sur la feuille "export_cb" j'ai des données sur 8 colonnes et une macro qui fait plusieurs choses.
1 - Trier les données sur la colonne A : c'est Ok
2 - Récupérer donnée en J1, coller en B2 et incrémenter jusqu'à la dernière ligne : c'est OK
Ca fonctionne beaucoup moins bien à partir de la boucle :
Pour chaque ligne renseignée à partir de la ligne2 (i=2)
3 - Copier/insérer la ligne (i), sur (i+1) supprimer les données dans les colonnes C D H, effectuer des formules en C D G
4 - si G de la nouvelle ligne (i+1) = H de la ligne (i) recommencer la boucle avec la prochaine ligne
5 - si G de la nouvelle ligne (i+1) <> H de la ligne (i) alors : Copier/insérer la ligne (i), sur (i+2) supprimer les données dans les colonnes C D H, effectuer des formules en C G
recommencer la boucle avec la prochaine ligne
La boucle est fini.
Mon problème :
la macro fais une boucle sur l'action "3" et non pas comme voulu sur les actions "3-4-5"
Merci pour votre temps
Cordialement
 

Pièces jointes

  • export-cb.xlsm
    84 KB · Affichages: 8
Solution

Gégé-45550

XLDnaute Accro
Bonsoir,
à tester :
VB:
Sub export_cb2()
'
' export_cb2 Macro
'

    Dim DL, i As Long
    Dim ValeurDepart As Long
    Dim FeuilleSource As Worksheet
    Dim FeuilleCible As Worksheet
    'Dim DerniereLigne As Long
   

    ' Désactiver la mise à jour de l'écran
    Application.ScreenUpdating = True

    ' Définir les feuilles
    Set FeuilleSource = Worksheets("export_cb")  ' Feuille à trier
    Set FeuilleCible = FeuilleSource ' Feuille de destination (peut être modifiée)

    ' ---- Tri chronologique colonne A ----
    ' Déterminer la dernière ligne avec des données dans la colonne A
    DL = FeuilleSource.Cells(Rows.Count, "A").End(xlUp).Row

    ' Trier les données de la colonne A par ordre croissant
    With FeuilleSource.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("A2:A" & DL), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Range("A1:H" & DL)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
   
   ' Déterminer la dernière ligne avec des données dans la colonne A
    With FeuilleSource
'        DerniereLigne = .Cells(.Rows.Count, "A").End(xlUp).Row

        ' Copier la valeur de J1 dans B2
        .Range("B2:B" & DL).Value = .Range("J1").Value

        ' Incrémenter les valeurs dans la colonne B jusqu'à la dernière ligne
'        ValeurDepart = .Range("B2").Value
'        For i = 3 To DerniereLigne
'            .Cells(i, "B").Value = ValeurDepart
'            ValeurDepart = ValeurDepart + 1
'        Next i
    End With


    ' ---- Incrémenter et insérer des lignes ----
 
    ' Boucle pour parcourir les lignes de la feuille triée
    For i = DL To 2 Step -1
   
        ' Copier les valeurs de la ligne courante
        FeuilleSource.Rows(i).Copy
        ' Coller les valeurs dans les lignes insérées
        FeuilleSource.Rows(i + 1).Insert
        ' Effacer le contenu des cellules C1 et D1 de la ligne insérée
        FeuilleSource.Range("C" & i + 1 & ":D" & i + 1).ClearContents

        ' Effacer le contenu des cellules H1 de la ligne insérée
        FeuilleSource.Range("H" & i + 1).ClearContents
       
        ' ---- Formules et calculs ----

            ' Formule VLOOKUP dans C (ligne i+1)
            FeuilleSource.Cells(i + 1, 3).FormulaR1C1 = "=VLOOKUP(RC[2],'LIB CB'!C1:C5,2,FALSE)"

            ' Formule VLOOKUP dans D (ligne i+1)
            FeuilleSource.Cells(i + 1, 4).FormulaR1C1 = "=VLOOKUP(RC[1],'LIB CB'!C1:C5,3,FALSE)"

            ' Formule de calcul dans G (ligne i+1)
            FeuilleSource.Cells(i + 1, 7).FormulaR1C1 = "=IF(VLOOKUP(RC[-2],'LIB CB'!C1:C5,5,FALSE)=0,round(R[-1]C[1],2),ROUND(R[-1]C[1]/1.2,2))"

       
        ' Vérifier si (G i+1)<>(H i)
       If FeuilleSource.Range("G" & i + 1) <> FeuilleSource.Range("H" & i) Then
        ' Copier les valeurs de la ligne courante
            FeuilleSource.Rows(i).Copy
        ' Coller les valeurs dans les lignes insérées
            FeuilleSource.Rows(i + 2).Insert
        ' Effacer le contenu des cellules C1 et D2 des lignes insérées
            FeuilleSource.Range("C" & i + 2 & ":D" & i + 2).ClearContents
        ' Effacer le contenu des cellules H1  des lignes insérées
            FeuilleSource.Range("H" & i + 2 & ":H" & i + 2).ClearContents
           
        ' Formule VLOOKUP dans C (ligne i+2)
            FeuilleSource.Cells(i + 2, 3).FormulaR1C1 = "=VLOOKUP(RC[2],'LIB CB'!C1:C5,5,FALSE)"
        ' Formule de calcul dans H (ligne i+2)
            FeuilleSource.Cells(i + 2, 7).FormulaR1C1 = "=IF(VLOOKUP(RC[-2],'LIB CB'!C1:C5,5,FALSE)=0,0,ROUND(R[-2]C[1]/1.2*0.2,2))"
             
        End If
         
     
    Next i
   
    Application.ScreenUpdating = True

End Sub

Cordialement,
 

JVOS

XLDnaute Junior
Bonjour
Merci d'avoir passer du temps, avec quelques modifications et tes corrections, ma macro fonctionne comme je le souhaite.
Merci beaucoup
 

Discussions similaires

Réponses
9
Affichages
257
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…