Boucle de macro en double
Bonjour
je rencontre un problème avec la macro suivante, et je ne voie pas l'erreur. elle commence très bien à copier les lignes d'un tableau pour le coller dans un nouveau en collant également la 1er ligne du tableau initial. ensuite pour chaque nouveau fichier Excel créé, la macro doit le nommer avec le nom contenu en A2.
elle nomme correctement les fichiers dans un 1er temps mais ensuite elle double les fichiers en les appelant tous par le contenu de A2 en rajoutant un chiffre pour éviter d'écraser. (cela double le nombre de fichiers...)
un regard averti m'aiderai fortement
Merci
sub extraire_lignes_final()
'Déclaration des variables
Dim wbSource As Workbook
Dim wbDest As Workbook
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim i As Long
Dim j As Long
Dim LastRow As Long
Dim NewFileName As String
Dim DestFolder As String
Dim SourceRange As Range
'Ouverture du fichier source
Set wbSource = ThisWorkbook
Set wsSource = wbSource.Sheets("liste_a_trier") 'Nom de la feuille contenant le tableau
'Détermination de la dernière ligne du tableau
LastRow = wsSource.Cells(Rows.Count, 1).End(xlUp).Row
'Boucle pour créer un nouveau fichier pour chaque ligne du tableau
For i = 2 To LastRow 'on commence à la ligne 2 pour exclure la première ligne du tableau
'Nom du nouveau fichier à partir de la cellule A2
NewFileName = wsSource.Cells(2, 1).value & "_" & i - 1 & ".xlsx" 'i-1 pour éviter le nom "nomdufichier_1.xlsx"
'Création d'un nouveau fichier
Set wbDest = Workbooks.Add
Set wsDest = wbDest.Sheets("Feuil1")
'Copie de la première ligne du tableau
For j = 1 To wsSource.Cells(1, Columns.Count).End(xlToLeft).Column
wsDest.Cells(1, j).value = wsSource.Cells(1, j).value
Next j
'Copie de la ligne correspondante du tableau
For j = 1 To wsSource.Cells(1, Columns.Count).End(xlToLeft).Column
wsDest.Cells(2, j).value = wsSource.Cells(i, j).value
Next j
'Définit le nom du fichier
Set SourceRange = wsSource.Range("A1")
DestFolder = "D:\DestFolder\"
wbDest.SaveAs filename:=DestFolder & SourceRange.Cells(i, 1).value & ".xlsx", FileFormat:=xlOpenXMLWorkbook 'ok pour valeur de la 1ere colonne
'Enregistrement et fermeture du nouveau fichier
wbDest.SaveAs DestFolder & NewFileName
wbDest.Close
'Nettoyage de la mémoire
Set wbDest = Nothing
Set wsDest = Nothing
Next i
'Nettoyage de la mémoire
Set wbSource = Nothing
Set wsSource = Nothing
End SubBonjour,
Peut-être ici l'erreur:
NewFileName = wsSource.Cells(2, 1).value & "_" & i - 1 & ".xlsx" 'i-1 pour éviter le nom "nomdufichier_1.xlsx"Cells(2, 1)= cellule A2 , à la place du 2, il faudrait mettre i, Cells(i, 1)
Cdlt
Oui mais, avec ces 3 lignes:
NewFileName = wsSource.Cells(i, 1).Value & "_" & i - 1 & ".xlsx" 'i-1 pour éviter le nom "nomdufichier_1.xlsx"
wbDest.SaveAs Filename:=DestFolder & SourceRange.Cells(i, 1).Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook 'ok pour valeur de la 1ere colonne
wbDest.SaveAs DestFolder & NewFileName 'Enregistrement et fermeture du nouveau fichierLa première créée le fichier ""fichier_1.xlsx""
L a seconde enregistre le fichier en "fichier.xlsx"
et la troisième enregistre le premier fichier, donc il est normal que vous ayez ce résultat.
Après, difficile d'en dire plus rien qu'en analysant un bout de code sans fichier.
j'ai supprimer la ligne (wbDest.SaveAs DestFolder & NewFileName) et ça fonctionne super
MERCI
'Enregistrement et fermeture du nouveau fichier
'wbDest.SaveAs DestFolder & NewFileName
wbDest.Closej'ai une petite question supplémentaire
lorsque j'ai des lignes qui commence par le même contenu (colonne A), j'aurai bien voulu mettre ces lignes dans le même fichier (par exemple coller les 4 lignes "Captain america" dans un nouveau fichier (il y a 40 colonnes !)
Merci pour l'aide
| Commune | id | id_ex | siret | rup_mi | gestion | date_creat | date_decla | date_publi | date_disso | nature | groupement |
| Annihilus | W851000003 | 851003908 | 173P | 05/09/1994 | 03/11/2006 | 12/10/1994 | 0001-01-01 | D | S | ||
| Aquaman | W853004043 | 021S | 13/01/2016 | 31/12/2022 | 30/01/2016 | 26/12/2022 | D | S | |||
| Batman | W851001930 | 173P | 13/11/2013 | 28/09/2016 | 21/12/2013 | 0001-01-01 | D | S | |||
| Beta Ray Bill | W853000001 | 853005966 | 173P | 07/03/2003 | 28/11/2005 | 19/04/2003 | 0001-01-01 | D | S | ||
| Captain America | W852004095 | 173P | 13/04/2012 | 15/02/2017 | 28/04/2012 | 0001-01-01 | D | S | |||
| Captain America | W853000321 | 853003983 | 173P | 25/03/1992 | 20/05/2015 | 15/04/1992 | 0001-01-01 | D | S | ||
| Captain America | W852001473 | 51525866300043 | 191S | 21/09/2009 | 26/03/2020 | 03/10/2009 | 0001-01-01 | D | S | ||
| Captain America | W853000321 | 853003983 | 173P | 25/03/1992 | 20/05/2015 | 15/04/1992 | 0001-01-01 | D | S | ||
| Hercule | W851002631 | 851004528 | 171S | 01/08/1999 | 05/04/2022 | 0001-01-01 | 0001-01-01 | D | S | ||
| Hulk | W851001930 | 173P | 13/11/2013 | 28/09/2016 | 21/12/2013 | 0001-01-01 | D | S | |||
| La Femme invisible | W853000006 | 853006439 | 032P | 02/03/2004 | 05/09/2008 | 27/03/2004 | 0001-01-01 | D | S | ||
| Le Fauve | W851006514 | 851005141 | 173P | 30/04/2004 | 04/05/2022 | 0001-01-01 | 0001-01-01 | D | S | ||
| Namor | W853000001 | 853005966 | 173P | 07/03/2003 | 28/11/2005 | 19/04/2003 | 0001-01-01 | D | S | ||
| Oracle | W851000003 | 851003908 | 173P | 05/09/1994 | 03/11/2006 | 12/10/1994 | 0001-01-01 | D | S | ||
Bonjour,
Voici le code comme demandé, j'ai supposé que le fichier était trié auparavant par la colonne A, si ce n'est pas le cas, il faudra ajouter le tri dans le code.
Cette macro est dissociée de la précédente, vous l'associerez à un bouton pour pouvoir l'exécuter quand bon vous semble.
Sub Nouveau_Classeur_Pour_Doublons()
'Déclaration des variables
Dim wbSource As Workbook
Dim wbDest As Workbook
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim i As Long
Dim LastRow As Long
Dim NewFileName As String
Dim DestFolder As String
Dim SourceRange As Range
Application.ScreenUpdating = False
'Ouverture du fichier source
Set wbSource = ThisWorkbook
Set wsSource = wbSource.Sheets("liste_a_trier") 'Nom de la feuille contenant le tableau
'Détermination de la dernière ligne du tableau
LastRow = wsSource.Cells(Rows.Count, 1).End(xlUp).Row
'Boucle pour créer un nouveau fichier pour chaque ligne du tableau
For i = 2 To LastRow 'on commence à la ligne 2 pour exclure la première ligne du tableau
doublon = Application.WorksheetFunction.CountIf(Range(Cells(2, "A"), Cells(LastRow, "A")), Cells(i, "A"))
If doublon > 1 Then
Range(Cells(i, 1), Cells(i + doublon - 1, 40)).Copy
'Nom du nouveau fichier à partir de la cellule A2
NewFileName = wsSource.Cells(i, 1).Value & ".xlsx" 'Nom du fichier = "Nom de la cellule A .xlsx"
'Création d'un nouveau fichier
Set wbDest = Workbooks.Add
Set wsDest = wbDest.Sheets("Feuil1")
'Copie de la plage de cellules correspondant au doublon
ActiveSheet.Paste
'Enregistrement et fermeture du nouveau fichier
DestFolder = "D:\DestFolder\"
wbDest.SaveAs DestFolder & NewFileName
wbDest.Close
i = i + doublon - 1
End If
Next i
'Nettoyage de la mémoire
Set wbDest = Nothing
Set wsDest = Nothing
'Nettoyage de la mémoire
Set wbSource = Nothing
Set wsSource = Nothing
End SubCdlt
10000 Mercis
vous êtes un chef
