Copier/coller et supprimer lignes 2onglet en fonction d1 dénominateur comm1
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