Mise a jour d'un tableau par macro

DRILL

XLDnaute Occasionnel
Bonjour a tous,

Dans le fichier test ci-joint; J'ai un tableau dans la feuille "Report" ou l'on entre manuellement les valeurs des deux dernieres colonnes AT et AU.
Dans la feuille "IMP" se trouve une mise a jour du tableau importee (sauf colonnes AT et AU)

Le bute est de metre a jour le tableau de la feuille "Report" tout en laissant les colonnes AT et AU intactes.

Info: Les seules valeurs qui ne changent pas d'un tableau a l'autre sont celles des colonnes A, B et C, toutes les autres valeurs sont succeptibles de changer.

J'ai bien fait un essaie avec une macro de remplissage du style LookIn:=xlValues, Lookat:=xlWhole, mais ne ciblant que la colonne B... c'est la cata.

Merci pour votre aide.
Salutations
DRILL
 

Pièces jointes

  • Test.xls
    47 KB · Affichages: 44
  • Test.xls
    47 KB · Affichages: 49
  • Test.xls
    47 KB · Affichages: 47

Dranreb

XLDnaute Barbatruc
Re : Mise a jour d'un tableau par macro

Bonsoir.
Ne pourriez vous copier l'IMP derrière le Report et classer le tout sur les 3 1ères colonnes ?
Il ne resterait alors qu'a l'explorer à partir de la fin: chaque fois que les valeurs de 3 1ères colonnes coïncident avec celles de la ligne d'au dessus, vous y copier les cellule de D à AS, puis la supprimez.
Cordialement.
 

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Bonsoir,

C'est une idee. Le probleme c'est que ce tableau en version original fait plus de dix milles lignes.
Certaines lignes peuvent ne plus exister dans la mise a jour (IMP) mais doivent etre conserver dans celui de la feuille "Report"

Faire ca a la mano va etre fastidieux ...

Salutations
DRILL
 

Dranreb

XLDnaute Barbatruc
Re : Mise a jour d'un tableau par macro

Ça ne devrait pas poser de problème parce qu'alors elle n'existeraient qu'en leurs uniques anciens exemplaires, n'auraient donc pas leurs 3 1ères colonnes égales à celles de la ligne juste au dessus, et vous n'y toucheriez donc pas davantage qu'aux nouvellement apparues.

P.S
Faire ca a la mano va etre fastidieux
Quand je dis "vous" je veux dire … votre code bien évidemment !
À +
 
Dernière édition:

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Dranred,

Ci-dessous le code de la macro de remplissage que j'utilise souvent...

-------------------------------
Sub Bulk()

Dim I As Long
Dim ShL As Worksheet
Dim Cel As Range
Dim Cl As Integer
Dim Depart As String

Set ShL = Sheets("IMP")

With Sheets("Report")
For I = 2 To .Range("A65536").End(xlUp).Row
Set Cel = ShL.Columns("B:B").Find(.Range("B" & I), LookIn:=xlValues, Lookat:=xlWhole)
If Not Cel Is Nothing Then
.Range("K" & I) = ShL.Range("K" & Cel.Row)

End If
Next I
End With
End Sub
------------------------------------------------------------
J'aimerai le modifier pour qu'au lieu d'une simple correspondance en colonne B j'ai une double correspondance B + C sur la meme ligne, dans ce cas il copie dans la feuille les cellules D a AS de la ligne.

Exemple: Si cells B+C dans "Report" = B+C dans "IMP" : copie des cells D a AS de "IMP" dans D a AS de "Report"

mes capacite en VBA etant tres limitees... j'aurai besoin d'un coup de pouce.

A+
Drill
 

Dranreb

XLDnaute Barbatruc
Re : Mise a jour d'un tableau par macro

Répondez d'abord à ma dernière suggestion, voulez vous ?
Parce que ce serait la plus simple et la plus performante.
Y aurait il un inconvénient à ce que votre tableau soit toujours classé en ordre croissant sur les colonnes B et C (ou les 3 premières colonnes, je ne sais plus) ?

P.S. Peut être n'avez vous pas compris le principe ? Réfléchissez. Si vous copiez la Imp, la collez derrière puis classez le tout, vos anciennes et nouvelles lignes se retrouveront ensemble l'une derrière l'autre, et il ne restera plus qu'à supprimer la deuxième après en avoir reproduit les colonnes S:AS dans la première. Plus besoin de recherche: juste vérifier que la ligne du dessus porte les mêmes valeurs en B et C que la ligne examinée.
À +
 
Dernière édition:

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Bonjour,

La colonne A est une constante... sans interet.
La colonne B est une liste de nurmero de document genere par plusieur serveur utilisant des series differentes.
on peut certe la triee en ordre croissant mais le tout doit etre remis en ordre de date (colonne G, non formate)
La colonne C et le numero de ligne de chaque document de la colonne B.

C'est vrai que votre idees de trie est bonne. Neamoins je cherche quelque chose de tres simple en manipulation pour les utilisateurs finaux qui sont tres limites en excel. un copier coller etant la limite de ce que je peux leur demander.

Slts,
DRILL
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Mise a jour d'un tableau par macro

Mais non, voyons. Ils n'auraient pas à s'en occuper. C'est votre macro qui effectuerait tout ça : le copier/coller, le classement, la boucle pour supprimer la 2ième ligne, et puis un reclassement final sur la date.
 

frangy

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Bonjour DRILL, Dranreb, le forum,

Voici un code qui reprend la méthode Find comme tu le souhaitais.
Je pense toutefois que Dranreb a raison de te suggérer la méthode de tri / comparaison car elle peut s’avérer plus performante au vu du nombre de lignes à traiter.
A toi de tester.
Code:
Option Explicit
Sub Bulk()
Dim WsS As Worksheet
Dim WsC As Worksheet
Dim C As Range, Cel As Range, PlageS As Range
Dim firstAddress As String
    Application.ScreenUpdating = False
    Set WsS = Sheets("IMP") 'Feuille source (IMP)
    Set WsC = Sheets("Report") 'Feuille cible (Report)
    Set PlageS = WsS.Range("B2:B" & WsS.Range("B2").End(xlDown).Row)
    For Each C In PlageS
        Set Cel = WsC.Columns("B:B").Find(C.Value, LookIn:=xlValues, Lookat:=xlWhole)
        If Not Cel Is Nothing Then
            firstAddress = Cel.Address
            Do
                'Si les valeurs dans les colonnes C sont identiques _
                on effectue la mise à jour
                If Cel.Offset(0, 1) = C.Offset(0, 1) Then
                    Cel.Offset(0, 2).Resize(1, 42) = C.Offset(0, 2).Resize(1, 42).Value
                    Exit Do
                End If
                Set Cel = WsC.Columns("B:B").FindNext(Cel)
            Loop While Not Cel Is Nothing And Cel.Address <> firstAddress
        End If
    Next C
    Set Cel = Nothing: Set PlageS = Nothing: Set WsC = Nothing: Set WsS = Nothing
    Application.ScreenUpdating = True
End Sub

A+
 

Dranreb

XLDnaute Barbatruc
Re : Mise a jour d'un tableau par macro

Voilà:
VB:
Sub Bulk()
Dim DernL As Long, L As Long
Application.ScreenUpdating = False
Feuil2.Range("A2:AS" & Feuil2.[A65536].End(xlUp).Row).Copy _
   Destination:=Feuil1.[A65536].End(xlUp).Offset(1)
DernL = Feuil1.[A65536].End(xlUp).Row
Feuil1.Range("A2:AU" & DernL).Sort Key1:=Range("B2"), Order1:=xlAscending, _
                                   Key2:=Range("C2"), Order2:=xlAscending, _
   Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
   DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
For L = DernL To 3 Step -1
   If Feuil1.Cells(L - 1, 2).Value = Feuil1.Cells(L, 2).Value And _
      Feuil1.Cells(L - 1, 3).Value = Feuil1.Cells(L, 3).Value Then
      Feuil1.[D:AS].Rows(L - 1).Value = Feuil1.[D:AS].Rows(L).Value
      Feuil1.Rows(L).Delete
      End If
   Next L
DernL = Feuil1.[A65536].End(xlUp).Row
Feuil1.Range("A2:AU" & DernL).Sort Key1:=Range("G2"), Order1:=xlAscending, _
   Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
   DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
End Sub
 
Dernière édition:

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Bonjour frangy,

Je viens d'essayer ce code sur une mise a jour comprenant 17000 lignes.
Elle marche impecable sauf un bug sur la ligne : Cel.Offset(0, 2).Resize(1, 42) = C.Offset(0, 2).Resize(1, 42).Value
Quand cela tombe sur une cellule contenant un texte assez long (certaine de ces cellule contiennent un texte de plus de 1600 caratcteres)
Vous avez surement une parade.

Slts
DRILL
 

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Dranred,

J'ai nome les feuilles dans votre code comme ci-dessous:
Code:
Sub Bulk()
Dim DernL As Long, L As Long
Dim WsS As Worksheet
Dim WsC As Worksheet
    Set WsS = Sheets("IMP")
    Set WsC = Sheets("Report")
Application.ScreenUpdating = False
WsS.Range("A2:AS" & WsS.[A65536].End(xlUp).Row).Copy _
   Destination:=WsC.[A65536].End(xlUp).Offset(1)
DernL = WsC.[A65536].End(xlUp).Row
WsC.Range("A2:AU" & DernL).Sort Key1:=Range("B2"), Order1:=xlAscending, _
                                   Key2:=Range("C2"), Order2:=xlAscending, _
   Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
   DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
For L = DernL To 3 Step -1
   If WsC.Cells(L - 1, 2).Value = WsC.Cells(L, 2).Value And _
      WsC.Cells(L - 1, 3).Value = WsC.Cells(L, 3).Value Then
      WsC.[D:AS].Rows(L - 1).Value = WsC.[D:AS].Rows(L).Value
      WsC.Rows(L).Delete
      End If
   Next L
DernL = WsC.[A65536].End(xlUp).Row
WsC.Range("A2:AU" & DernL).Sort Key1:=Range("G2"), Order1:=xlAscending, _
   Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
   DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
End Sub

Quand je lance la macro; meme probleme que celui constate avec le code de frangy quand la macro arrive sur des cellules contenant des textes long.
Dans ce cas c'est sur la ligne du code:
WsC.[D:AS].Rows(L - 1).Value = WsC.[D:AS].Rows(L).Value

La aussi il y a surement une parade que j'ignore.

Slts
DRILL
 
Dernière édition:

Discussions similaires