Vérification de valeurs et remplacement de lignes

Bonjour à toutes et à tous,

Tout d'abord je tiens à vous féliciter pour ce site et pour l'aide fournie.

Je suis novice en VBA et j'ai beaucoup progressé en peu de temps grâce à vos tutos et au forum.

J'arrive toutefois à un point de blocage et me vois dans l'obligation de solliciter votre aide.

Voici la situation :

Je dispose d'un premier fichier nommé "Source" contenant environ 1500 lignes et 27 colonnes.

J'ai crée une macro qui génère un deuxième fichier nommé "Traitement" qui recopie les lignes du premier tableau avec un Do Loop et sous réserve d'une condition de valeur sur ma colonne "O".

Extrait du code (qui fonctionne, à défaut d'être beau) :

Do While Cells(x, y) <> ""
If Cells(x, 15) = "En attente de Chiffrage" Or Cells(x, 15) = "En attente de devis" Then
Rows(x).Copy [...]

Mon problème est le suivant :

Je souhaite ré-importer les lignes de mon fichier "Traitement" selon les critères suivants :

  • Les lignes disposent en colonne "A" d'un numéro de dossier unique ;
  • Seules les lignes dont la colonne "O" (liste de choix des statuts du dossier) a été modifiée doivent être réintégrées dans le fichier "Source" ;
  • Les lignes réintégrées depuis "Traitement" remplacent les lignes existantes dans "Source"

En fouillant sur le forum, j'ai adapté une macro qui balaie le fichier "Traitement" avec une boucle 'For each' et qui trouve le numéro de dossier de la colonne "A" dans "Source" grâce à un .Find.

Toutefois, cette boucle recopie l'ensemble du fichier "Traitement" dans "Source".

J'ai tenté de mettre un 'If' lié à ma colonne "O" de statut, mais ça ne fonctionne pas.

Petit bonus, le copier/coller s'applique actuellement aux valeurs, j'aimerais qu'il recopie aussi le format car la modification de statut entraîne une mise en forme conditionnelle avec changement de couleur de la ligne.

Voici mon code incomplet pour le ré-import :

La macro est lancée depuis "Source"

Sub reimport_devis()
Dim WsS As Worksheet, WsC As Worksheet
Dim Cel As Range, C As Range

' Ouvrir le fichier de Traitement retravaillé
Application.Workbooks.Open "Traitement"
Application.ScreenUpdating = False

    Set WsS = Workbooks("Traitement").Worksheets("Traitement")
    Set WsC = Workbooks("Source").Worksheets("Suivi")

        'On effectue un balayage de chacune des clés dans la colonne A de la feuille "Traitement"
        For Each Cel In WsS.Range("A6:A" & WsS.Range("A" & Rows.Count).End(xlUp).Row)
        'On cherche une correspondance de chaque clé dans la feuille "Suivi"
        Set C = WsC.Columns(1).Find(Cel, , xlValues, xlWhole)
        'Si la clé existe
                If Not C Is Nothing Then
                'alors, on effectue la copie des données de la colonne A à la colonne AA de la feuille "Traitement"
                Cel.Resize(, 27).Copy
                'puis on effectue le remplacement de ces données dans la feuille "Suivi"
                WsC.Range("A" & C.Row).PasteSpecial (xlPasteValues)
                Else
                End If
                Next Cel

    Application.CutCopyMode = False
    Set C = Nothing: Set WsS = Nothing: Set WsC = Nothing
    Application.ScreenUpdating = True
    Workbooks("Traitement").Activate
    ActiveWorkbook.Close
End Sub

Pourriez-vous s'il vous plaît me venir en aide ?

Merci d'avance pour vos contributions.

Je souhaite ré-importer les lignes de mon fichier "Traitement" selon les critères suivants :

  • Les lignes disposent en colonne "A" d'un numéro de dossier unique ;
  • Seules les lignes dont la colonne "O" (liste de choix des statuts du dossier) a été modifiée doivent être réintégrées dans le fichier "Source" ;
  • Les lignes réintégrées depuis "Traitement" remplacent les lignes existantes dans "Source"

si (ligne de la colonne A feuille source=ligne de la colonne A feuille traitement) ET (ligne de la colonne O feuille source<>ligne de la colonne O feuille traitement) alors

ligne de la feuille source=ligne de la feuille traitement

fin de si

comme les for each me semble tordu, je suis un adepte des boucles for , ca donne un truc comme ca

for Sourcei=x to y 'boucle sur les lignes de la feuille Source
for Traiti=x to y 'boucle sur les lignes de la feuille Traitement

if (sheets("Source").cells(Sourcei,"A")=Sheets("Traitement").cells(Traiti,"A")) and (sheets("Source").cells(Sourcei,"O")<>Sheets("Traitement").cells(Traiti,"O")) then 
'voir description au dessus
             Sheets("Source").Rows(Sourcei)=Sheets("Traitement").rows(Traiti)
'voir description au dessus
end if

next Traiti
next Sourcei

reste a installer tes .find et .pastespecial comme il faut

Bonjour Zarik,

Merci pour ta réponse rapide. Je regarde ton code ce soir et te ferai un retour demain

Rechercher des sujets similaires à "verification valeurs remplacement lignes"