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
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...

Gégé-45550

XLDnaute Accro
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
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
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,
Bonjour
Merci d'avoir passer du temps, avec quelques modifications et tes corrections, ma macro fonctionne comme je le souhaite.
Merci beaucoup
 

Phil69970

XLDnaute Barbatruc
@JVOS

Quand j'ai lancé la macro, ça bug au
Ws1.Range("G" & i + 1).FormulaLocal = LaFormule

Pourtant chez moi mon fichier du post # 3 fonctionne sans erreur

20241011_105353.gif
 

Discussions similaires

Réponses
9
Affichages
257

Statistiques des forums

Discussions
314 188
Messages
2 106 976
Membres
109 731
dernier inscrit
Benjamin91450