Code VBA avec condition if + copie autre classeur
Bonjour à tous ,
Débutante en Code VBA , j'aurai besoin d'aide pour me faire gagner du temps sur une tâche quotidienne.
Je souhaiterai qu'il me coupe ( dans le fichier "1= base de donnée") et qui colle ( dans un autre "fichier 2 = archivage ligne 2019")tout les lignes entières si il Ya le mot "TERMINER" dans les cellules ( colonne B du fichier 1donc si dans B1,B2.....B500.... Jai TERMINER) .
Avec si possible un Message box m'indiquant le nbr de ligne qu'il va couper et coller .
j'ai regardé 2/3 code :
If [CONDITION ICI] Then ' => SI condition validée ALORS
'Instructions si vrai
Else ' => SINON
'Instructions si faux
End If
Apres pour mon fichier 2 : j'aurai des variables
Dim i As Long
i = .Range("A" & Rows.count).End(xlUp).Row + 1
Puis après les wookbook a définir pas rapport a mon chemin d'accès de mon fichier 2
Je pense que je suis passer à coter de pas mal de choses, je n'arrive pas a regrouper toutes ces variable / code
Merci d'avance pour votre aide
Cordialement et Meilleurs Vœux à tous 2019
bonjour
tu veux faire sur informatique comme sur papier en 1970
il FAUT faire de l'informatique, c'est à dire ne pas disperser des données d'une base à une autre.
dans ton fichier, il te suffit de filtrer la colonne contenant les TERMINE pour ne voir que ce qui n'est pas terminé, et inversement pour ne voir que les archives
aucune formule, aucun VBA. Rien !
il faut juste connaître la fonction de filtre d'Excel
bonne année
amitiés
Bonjour JMD , et merci pour ta réponse , que je comprend et conçois.
Cependant actuellement c'est déjà se que je fait mais mon fichier étant lourd car 5 000 lignes sur 200 colonnes avec formules cela prend de la mémoire et ralenti l'ouverture du fichier les recherches etc....
De plus ses un fichier partagé :/
n'y aurait-il pas d'autres solutions?
Cordialement
re
mon avis perso : avec 200 colonnes, tu dois galérer, même en ne conservant que quelques lignes
c'est quoi toutes ces colonnes ?
Re
Oui la galère tu as totalement raison !! toutes ces colonnes corresponde a un flux logistique de la recption a l'expedition en passant par toutes les informations nécéssaires. C'est un fichier exel tres lourd donc en partages avec différents services.
jai regarder quelque forum se qui ma donner sa comme code , cependant celui- ci est colle les ligne sur un autree onglet
Sub test()
Dim dlg As Integer, lg As Integer, i As Integer
With ActiveSheet
dlg = .Range("A" & Rows.Count).End(xlUp).Row
For i = dlg To 2 Step -1
If UCase(Range("I" & i)) = "OK" Then
lg = Sheets("ARCHIVE").Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("A" & i & ":I" & i).Copy Sheets("ARCHIVE").Range("A" & lg)
.Rows(i).Delete
End If
Next
End With
End Sub
quand pensez-vous ?
Merci
Bonsoir fleurmi, jmd
On suppose que les 2 fichiers sont dans le même dossier.
La macro est à placer dans un module du fichier "archivage"
Attention au nom des fichiers et des feuilles à traiter
Option Explicit
Sub test()
Dim rng As Range
Application.ScreenUpdating = False
With Workbooks.Open(ThisWorkbook.Path & "\base_donnee.xls")
With .Sheets("Feuil1")
.AutoFilterMode = False
With .Range("a1").CurrentRegion
.AutoFilter 2, "terminer"
On Error Resume Next
Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rng Is Nothing Then
rng.Copy
With ThisWorkbook.Sheets("archive")
.Range("a" & Rows.Count).End(xlUp)(2) _
.PasteSpecial xlPasteValues
End With
MsgBox "Copie de " & Application.Subtotal(3, Columns("b")) - 1 & " ligne(s)"
End If
.AutoFilter
End With
End With
.Close False
End With
Application.ScreenUpdating = True
End Sub
klin89
Bonjour Klin89,
un Grand merci a toi pour ce code , ses totalement mes besoins .
Cependant je viens de copier le code et modifié le nom des feuilles/classeurs.. il m'affiche un message d'erreur 400 :/
j'ai bien un dossier dedans 2 fichier ; 1=base dont 1 feuille nommé base / 2=archive dont 1 feuille nommé archive
ci-joint un copie d'écran
je regarde plus attentivement ce soir.
merci beaucoup , si cela pouvait marcher sa me changera mai journée de boulo
Cordialement
ah je viens de penser sur mon fichier "archive" jai des entetes de colonnes identiques a mon 1 er fichier . :/
Re fleurmi,
Il faut bien placer le code dans un module standard du fichier "archive", le fichier "base" restant fermé.
J'ai réajusté le code puisqu'il faut supprimer les lignes filtrées du fichier base.
Option Explicit
Sub test()
Dim rng As Range
Application.ScreenUpdating = False
'ouverture du fichier source
With Workbooks.Open(ThisWorkbook.Path & "\base.xlsx")
With .Sheets("base")
.AutoFilterMode = False
With .Range("a1").CurrentRegion
'filtre des donnees sur la 2eme colonne
.AutoFilter 2, "terminer"
On Error Resume Next
'les lignes visibles sans la ligne d'en-tetes
Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rng Is Nothing Then
'copie les lignes filtrees
rng.Copy
'colle les lignes filtrees dans le fichier cible
With ThisWorkbook.Sheets("archive")
.Range("a" & Rows.Count).End(xlUp)(2) _
.PasteSpecial xlPasteValues
End With
MsgBox "Copie de " & Application.Subtotal(3, .Columns("b")) - 1 & " ligne(s)"
'suppression des lignes filtrees du fichier source
rng.EntireRow.Delete
Else
MsgBox "Aucune donnée à copier"
End If
.AutoFilter
End With
End With
'fermeture du fichier source et enregistrement des modifications
.Close True
End With
Set rng = Nothing
Application.ScreenUpdating = True
End Sub
J'ai considéré que tes données en feuille "base" commençaient en A1 avec une ligne d'en-têtes, idem dans l'autre fichier feuille "archive".
klin89
Salut fleurmi ,jmd, Klin89
regarder cette proposition :
'attention ==> "terminer" <> "TERMINER"
Sub test()
Dim i, drnB, drnA, cntr%
Dim W_Source, Sh_Source, W_Destination, Sh_Destination
Dim archv, bseD
Application.ScreenUpdating = False
'******########******
W_Source = "base.xlsm"
Sh_Source = "base"
W_Destination = "archive.xlsx"
Sh_Destination = "archive"
'******########******
Set bseD = Workbooks(W_Source).Sheets(Sh_Source)
Workbooks.Open (ThisWorkbook.Path & "\" & W_Destination)
Set archv = Workbooks(W_Destination).Sheets(Sh_Destination)
On Error Resume Next
drnB = bseD.Range("B" & Rows.Count).End(xlUp).Row
drnA = archv.Range("B" & Rows.Count).End(xlUp).Row + 1
For i = 1 To drnB
If bseD.Range("B" & i).Value = "terminer" Then 'ucase(bseD.Range("B" & i).Value) = ucase("terminer")
'attention ==> "terminer" <> "TERMINER"
archv.Range("A" & drnA).EntireRow.Value = bseD.Range("A" & i).EntireRow.Value
bseD.Range("A" & i).EntireRow.Value = ""
cntr = cntr + 1
End If
Next
MsgBox "Copie de : " & cntr & " ligne(s)"
Workbooks(W_Destination).Save
Workbooks(W_Destination).Close True
Application.ScreenUpdating = True
End Sub
Bonjour Klin89 ,
Merci pour ton code , ca marche nikel
j'ai compris qu'il n'était pas dans un "module standard" => insertion module ...
Bonjour AMIR,
Merci aussi beaucoup pour ton code , qui fonctionne également
De vos yeux d'expert je ne vois pas réellement quelle est la différence entre ses 2 codes ?
De plus pensez vous qu'il faut mieux faire marcher cette macro en fichier Excel "départager" ou cela posera pas de soucis sur un Excel partager ?
PS : Dans la continuité de ce code , j'ai voulu aller plus loin en incluant un trie automatique de la colonne R (date) du fichier base du plus ancien au plus récent. Jai essayer de l'inséré dans celui-ci déjà existant regardez ,quand pensez-vous ?
code simple :
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Add Key:=Range( _
"R2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("base").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Clear
Windows("archive.xlsm").Activate
.Close True
End With
Set rng = Nothing
Application.ScreenUpdating = True
code avec l'ancien ;
Option Explicit
Sub test()
Dim rng As Range
Application.ScreenUpdating = False
'ouverture du fichier source
With Workbooks.Open(ThisWorkbook.Path & "\base.xlsx")
With .Sheets("base")
.AutoFilterMode = False
With .Range("a1").CurrentRegion
'filtre des donnees sur la 2eme colonne
.AutoFilter 2, "terminé"
On Error Resume Next
'les lignes visibles sans la ligne d'en-tetes
Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rng Is Nothing Then
'copie les lignes filtrees
rng.Copy
'colle les lignes filtrees dans le fichier cible
With ThisWorkbook.Sheets("archive")
.Range("a" & Rows.Count).End(xlUp)(2) _
.PasteSpecial xlPasteValues
End With
MsgBox "Copie de " & Application.Subtotal(3, .Columns("b")) - 1 & " ligne(s)"
'suppression des lignes filtrees du fichier source
rng.EntireRow.Delete
Else
MsgBox "Aucune donnée à copier"
End If
.AutoFilter
End With
End With
'nouveau code de tri de la colonne R sur le fichier de base avant l'enregistrement et fermeture .
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Add Key:=Range( _
"R2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("base").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Clear
Windows("archive.xlsm").Activate
.Close True
End With
Set rng = Nothing
Application.ScreenUpdating = True
End With
'fermeture du fichier source et enregistrement des modifications
.Close True
End With
Set rng = Nothing
Application.ScreenUpdating = True
End Sub
Je reviens se soir sur le Forum
merci a vous
Cordialement
Bonjour Klin89 ,
Merci pour ton code , ca marche nikel
j'ai compris qu'il n'était pas dans un "module standard" => insertion module ...
Bonjour AMIR,
Merci aussi beaucoup pour ton code , qui fonctionne également
De vos yeux d'expert je ne vois pas réellement quelle est la différence entre ses 2 codes ?
De plus pensez vous qu'il faut mieux faire marcher cette macro en fichier Excel "départager" ou cela posera pas de soucis sur un Excel partager ?
PS : Dans la continuité de ce code , j'ai voulu aller plus loin en incluant un trie automatique de la colonne R (date) du fichier base du plus ancien au plus récent. Jai essayer de l'inséré dans celui-ci déjà existant regardez ,quand pensez-vous ?
code simple :
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Add Key:=Range( _
"R2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("base").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Clear
Windows("archive.xlsm").Activate
.Close True
End With
Set rng = Nothing
Application.ScreenUpdating = True
code avec l'ancien ;
Option Explicit
Sub test()
Dim rng As Range
Application.ScreenUpdating = False
'ouverture du fichier source
With Workbooks.Open(ThisWorkbook.Path & "\base.xlsx")
With .Sheets("base")
.AutoFilterMode = False
With .Range("a1").CurrentRegion
'filtre des donnees sur la 2eme colonne
.AutoFilter 2, "terminé"
On Error Resume Next
'les lignes visibles sans la ligne d'en-tetes
Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rng Is Nothing Then
'copie les lignes filtrees
rng.Copy
'colle les lignes filtrees dans le fichier cible
With ThisWorkbook.Sheets("archive")
.Range("a" & Rows.Count).End(xlUp)(2) _
.PasteSpecial xlPasteValues
End With
MsgBox "Copie de " & Application.Subtotal(3, .Columns("b")) - 1 & " ligne(s)"
'suppression des lignes filtrees du fichier source
rng.EntireRow.Delete
Else
MsgBox "Aucune donnée à copier"
End If
.AutoFilter
End With
End With
'nouveau code de tri de la colonne R sur le fichier de base avant l'enregistrement et fermeture .
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Add Key:=Range( _
"R2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("base").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveWorkbook.Worksheets("base").AutoFilter.Sort.SortFields.Clear
Windows("archive.xlsm").Activate
.Close True
End With
Set rng = Nothing
Application.ScreenUpdating = True
End With
'fermeture du fichier source et enregistrement des modifications
.Close True
End With
Set rng = Nothing
Application.ScreenUpdating = True
End Sub
Je reviens se soir sur le Forum
merci a vous
Cordialement
re fleurmi,
Le tri peut s'effectuer au début de la procédure, cela ne change rien au résultat final, non
Option Explicit
Sub test()
Dim rng As Range
Application.ScreenUpdating = False
'ouverture du fichier source
With Workbooks.Open(ThisWorkbook.Path & "\base.xlsx")
With .Sheets("base")
.AutoFilterMode = False
With .Range("a1").CurrentRegion
'tri sur la colonne "R"
.Sort key1:=.Cells(1, 18), order1:=xlAscending, Header:=xlYes
'filtre des donnees sur la 2eme colonne
.AutoFilter 2, "terminer"
On Error Resume Next
'les lignes visibles sans la ligne d'en-tetes
Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rng Is Nothing Then
'copie les lignes filtrees
rng.Copy
'colle les lignes filtrees dans le fichier cible
With ThisWorkbook.Sheets("archive")
.Range("a" & Rows.Count).End(xlUp)(2) _
.PasteSpecial xlPasteValues
End With
MsgBox "Copie de " & Application.Subtotal(3, .Columns("b")) - 1 & " ligne(s)"
'suppression des lignes filtrees du fichier source
rng.EntireRow.Delete
Else
MsgBox "Aucune donnée à copier"
End If
.AutoFilter
End With
End With
'fermeture du fichier source et enregistrement des modifications
.Close True
End With
Set rng = Nothing
Application.ScreenUpdating = True
End Sub
klin89