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 SubPourriez-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 Sourceireste 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