Copier/coller et supprimer lignes 2onglet en fonction d1 dénominateur comm1

Bonjour,

J'ai besoin d'aide sur un code VBA pour lequel je n'ai pas trouvé de solutions. J'ai deux onglets qui seront utilisés.

Onglet Source: le fichier est extrait de SAP que je colle dans cet onglet (il se met en forme automatiquement avec des lignes colorés, à voir si cela change la macro). le fichier prend ou perd des lignes en fonction des paiements fait aux fournisseurs.

Onglet Data: récap de la situation à l'instant T. contiendra des lignes en plus ou des lignes en moins en fonction de l'update que j'aurais collé dans l'onglet source

L'outil doit comparer l'info qui se trouvera en colonne AE de l'onglet Source (qui sera le dénominateur commun)

La macro doit comparer l'info dans l'onglet Data Vs l'onglet Source

a. Si la ligne existe à la fois dans l'onglet data et dans l'onglet Source (via dénominateur commun colonne AE) alors pas d'action
b. Si la ligne existe dans l'onglet source mais pas encore dans l'onglet Data (donc une ou des nouvelles lignes à ajouter) alors la macro devra prendre toutes les lignes ayant ce même dénominateur et les coller à la fin du tableau de l'onglet data
c. Si la ligne n'existe plus dans le fichier source, alors la macro devra supprimer les lignes de l'onglet Data.

voici le code qui ne semble pas fonctionner, en vous remerciant par avance pour vos observations.

Sub Compair()

Dim Dat, Sc As Worksheet
Dim LastRw, Lastrow, counter As Long
Dim Startcell, StartcellDat As Range

Set Dat = Worksheets("Data")
Set Sc = Worksheets("Source")
Set Startcell = Sc.Range("AE1")
Set StartcellDat = Dat.Range("AE1")

LastRw = Worksheets("Data").Cells(Worksheets("Data").Rows.Count, StartcellDat.Column).End(xlUp).Row

Worksheets("Data").Range("DA2").Formula = "=IF(COUNTIF(Source!AE:AE,Data!AE2)>0,True,False)"
If LastRw > 2 Then
Worksheets("Data").Range("DA2").AutoFill Destination:=Dat.Range("DA2", Dat.Cells(LastRw, 105))
End If
Lastrow = Sc.Cells(Sc.Rows.Count, Startcell.Column).End(xlUp).Row

Sc.Range("DA2").Formula = "=IF(COUNTIF(Data!AE:AE,Source!AE2)>0,True,False)"
If Lastrow > 2 Then
Sc.Range("DA2").AutoFill Destination:=Sc.Range("DA2", Sc.Cells(Lastrow, 105))
End If

' delete lines from Data tab


For counter = 2 To LastRw
If Dat.Range("DA" & counter) = "False" Then
Dat.Range("A" & counter & ":CQ" & counter).Delete

LastRw = Worksheets("Data").Cells(Worksheets("Data").Rows.Count, StartcellDat.Column).End(xlUp).Row
Worksheets("Data").Range("DA2").AutoFill Destination:=Dat.Range("DA2", Dat.Cells(LastRw, 105))

End If

Next counter

' copy from source tab to data Tab


For counter = 2 To Lastrow
LastRw = Worksheets("Data").Cells(Worksheets("Data").Rows.Count, StartcellDat.Column).End(xlUp).Row

If Sc.Range("DA" & counter) = "False" Then
Dat.Range("A" & LastRw + 1 & ":CQ" & LastRw + 1).Value = Sc.Range("A" & counter & ":CQ" & counter).Value
End If
Next counter

Dat.Range("DA1:DA999999").ClearContents
Sc.Range("DA1:DA999999").ClearContents

MsgBox "Complete"
End Sub

Bonjour,

  • Sans fichier, sans garantie du fonctionnement.
  • Pour supprimer une ligne, il faut partir de la fin.
  • Soyez explicite dans le nom de vos variables, vous gagnerez du temps dans la maintenance de votre code.
  • Vos variables doivent être typées une par une et non par ligne sinon elles sont déclarées Variant.
Option Explicit

Sub Compair()

Dim LastRwData As Long, LastrowSource As Long, Counter As Long
Dim ShData As Worksheet, ShSource As Worksheet
Dim HeureDebut, HeureFin, TempsTotal

    On Error GoTo Fin

    HeureDebut = Timer
    Application.ScreenUpdating = False

    Set ShData = Worksheets("Data")
    Set ShSource = Worksheets("Source")

    With ShData
         LastRwData = .Cells(.Rows.Count, "AE").End(xlUp).Row
         .Range("DA2").Formula = "=IF(COUNTIF(Source!AE:AE,Data!AE2)>0,True,False)"
         If LastRwData > 2 Then
            .Range("DA2").AutoFill Destination:=.Range(.Cells(2, "DA"), .Cells(LastRwData, "DA"))
        End If
   End With

   With ShSource
        LastrowSource = .Cells(.Rows.Count, "AE").End(xlUp).Row
        .Range("DA2").Formula = "=IF(COUNTIF(Data!AE:AE,Source!AE2)>0,True,False)"
        If LastrowSource > 2 Then
           .Range("DA2").AutoFill Destination:=.Range(.Cells(2, "DA"), .Cells(LastrowSource, "DA"))
        End If
   End With

   ' delete lines from Data tab
   With ShData
        For Counter = LastRwData To 2 Step -1
            If .Range("DA" & Counter) = False Then .Range("DA" & Counter).EntireRow.Delete
        Next Counter
   End With

   ' copy from source tab to data Tab
   For Counter = 2 To LastrowSource
       With ShData
            LastRwData = .Cells(.Rows.Count, "AE").End(xlUp).Row
       End With

       With ShSource
            If .Range("DA" & Counter) = False Then
               .Range("A" & Counter & ":CQ" & Counter).Copy Destination:=ShData.Range("A" & LastRwData + 1)
            End If
       End With
   Next Counter

   ShData.Range("DA1").EntireColumn.ClearContents
   ShSource.Range("DA1").EntireColumn.ClearContents

   Application.ScreenUpdating = True

   HeureFin = Timer
   TempsTotal = HeureFin - HeureDebut

   MsgBox "Complete : " & Round(TempsTotal, 0) & " seconds"

   GoTo Fin

Fin:

   Application.ScreenUpdating = True

   Set ShData = Nothing: Set ShSource = Nothing

End Sub

Bonjour Eric,

Je ne sais pas quoi dire à part merci. Un grande merci pour votre temps.

Le code est top, il fonctionne, je me rends compte que le dénominateur commun en colonne AE n'est finalement pas le meilleur moyen de comparer les données dans les deux onglets.

La colonne A contient un code unique, il ne peut y avoir q'une seule ligne ayant ce même code contrairement à la colonne AE où la référence peut être présentes dans plusieurs lignes

Colonne AE peut contenir plusieurs lignes d'articles (ex:3 articles) avec le même code : Michel01/1234

Colonne A contiendra: Michel01/1234/10 et Michel01/1234/20 et Michel/1234/30

La colonne A sera plus simple à comparer.

Je suis vraiment novice en VBA: quel serait le nouveau code si on doit comparer une info unique présente en colonne A?

merci d'avance,

Seb

Eric,

J'ai remplacé à chaque fois que j'ai vu l'élément "AE" dans le code par "A".

A quoi correspond "DA2" ou "DA"

merci d'avance,

Seb

Fallait pas.

C'est la colonne DA. Dans le tableau source, la formule dans DA cela permet de vérifier la présence ou non de l'enregistrement dans l'onglet DATA.

Merci Eric, c'est parfait je trouve. Je n'ai pas touché au code contenant l'information "DA". J'ai juste remplacé par le code contenant "AE" par "A". La formule fonctionne très bien, à voir si j'ai loupé une étape.

MERCI pour ton aide.

Seb

Rechercher des sujets similaires à "copier coller supprimer lignes 2onglet fonction denominateur comm1"