VBA nom de fichier et selection intervalle
Résolu
manautop
Messages postés
138
Date d'inscription
Statut
Membre
Dernière intervention
-
manautop Messages postés 138 Date d'inscription Statut Membre Dernière intervention -
manautop Messages postés 138 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je me permet de venir poser une question, plutot deux concernant une macro sous excel 2003
Après plusieurs recherche et plein de test et tentative d'adaptation,
Ce que j'essaye de faire : (cf code plus bas)
- copier les 200 premieres lignes d'un fichier (ligne 1 à 200 colone A)
- coller ces ligne dans un fichier dont le nom est : OFFRE5402_141
- enregistrer en csv ce nouveau fichier, le fermer
- copier les 200 lignes suivante du premier fichier (201 à 300)
- coller ces 200 lignes dans un fichier dont le nom est OFFRE5402_142 (OFFRE5402_n+1)
- enregistrer en csv ce nouveau fichier, le fermer
et ainsi de suite
en sachant que je ne connais pas le nombre de ligne par avance ( qui peut varier d'une à 40 000 lignes)
Sub Separation()
'
'
Range("A1:A200").Select
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
ActiveWorkbook.SaveAs Filename:= _
"C:\Documents and Settings\JSEBBAN\Bureau\2\OFFRE5402_.csv", FileFormat:=xlCSV, CreateBackup:=False
ActiveWindow.Close
End Sub
Après plusieurs recherche et plein de test et tentative d'adaptation, j'ai bien compris qu'il fallait que j'utilise des variable type i = n + 199 pour la selection
que je fasse une boucle pour ne pas avoir a taper mille ligne de code
Pourquoi ?
Parce qu'il s'agit de fichier qui sont intégrés par un autre prog à nos base de données et qui extrait ensuite plein de résultat par comparaison, le problème et qu'a cause d'un bug dont personne ne sait d'ou il vient qui fait que plus on ajoute de ligne moins le prog traite de ligne à la sec; ainsi ici le prog traite 200 lignes par sec en passant au dessus le prog traite 1 ligne par min... allez savoir
Merci
Je me permet de venir poser une question, plutot deux concernant une macro sous excel 2003
Après plusieurs recherche et plein de test et tentative d'adaptation,
Ce que j'essaye de faire : (cf code plus bas)
- copier les 200 premieres lignes d'un fichier (ligne 1 à 200 colone A)
- coller ces ligne dans un fichier dont le nom est : OFFRE5402_141
- enregistrer en csv ce nouveau fichier, le fermer
- copier les 200 lignes suivante du premier fichier (201 à 300)
- coller ces 200 lignes dans un fichier dont le nom est OFFRE5402_142 (OFFRE5402_n+1)
- enregistrer en csv ce nouveau fichier, le fermer
et ainsi de suite
en sachant que je ne connais pas le nombre de ligne par avance ( qui peut varier d'une à 40 000 lignes)
Sub Separation()
'
'
Range("A1:A200").Select
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
ActiveWorkbook.SaveAs Filename:= _
"C:\Documents and Settings\JSEBBAN\Bureau\2\OFFRE5402_.csv", FileFormat:=xlCSV, CreateBackup:=False
ActiveWindow.Close
End Sub
Après plusieurs recherche et plein de test et tentative d'adaptation, j'ai bien compris qu'il fallait que j'utilise des variable type i = n + 199 pour la selection
que je fasse une boucle pour ne pas avoir a taper mille ligne de code
Pourquoi ?
Parce qu'il s'agit de fichier qui sont intégrés par un autre prog à nos base de données et qui extrait ensuite plein de résultat par comparaison, le problème et qu'a cause d'un bug dont personne ne sait d'ou il vient qui fait que plus on ajoute de ligne moins le prog traite de ligne à la sec; ainsi ici le prog traite 200 lignes par sec en passant au dessus le prog traite 1 ligne par min... allez savoir
Merci
A voir également:
- VBA nom de fichier et selection intervalle
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
4 réponses
Bonjour,
Une proposition :
Adapter à la macro ci dessous les noms de classeur et de feuille... A Eclater.xls = votre classeur de 40000 lignes.
Sheets("Feuil1") = la feuille contenant les données
Une proposition :
Adapter à la macro ci dessous les noms de classeur et de feuille... A Eclater.xls = votre classeur de 40000 lignes.
Sheets("Feuil1") = la feuille contenant les données
Option Explicit Sub EclaterFichier() Dim Lign As Long, DrLig As Long Dim Cpt As Integer Dim Chemin As String, NomFich As String Application.DisplayAlerts = False Cpt = 0 Chemin = "C:\Documents and Settings\JSEBBAN\Bureau\2\" With Workbooks("A Eclater.xls").Sheets("Feuil1") DrLig = .Range("A" & Rows.Count).End(xlUp).Row For Lign = 1 To DrLig Step 200 NomFich = "OFFRE5402_" & 141 + Cpt & ".csv" Workbooks.Add .Range("A" & Lign & ":A" & Lign + 199).Copy Range("A1") ActiveWorkbook.SaveAs Filename:=Chemin & NomFich, FileFormat:=xlCSV, CreateBackup:=False ActiveWindow.Close Cpt = Cpt + 1 Next End With Application.DisplayAlerts = True End Sub
Merci Franck P
Vous etes mon sauveur, j'etais trés loin
Grace à vous j'ai compris l'utilisation de "" et du &
je me permet quelques questions :
DrLig = .Range("A" & Rows.Count).End(xlUp).Row ==> permet de selectioner les lignes tant qu'elles ne sont pas vide ?
Cpt ==> je ne comprend pas , pourriez vous m'expliquer, je comprend que cela à un rapport avec l'augmentation du nom d'un à chaque fois mais je ne comprend pas comment
For Lign = 1 To DrLig Step 200 =+> permet de selectionner des plages de 200 ce que je ne comprend pas c'est comment vous faites pour que la macro commence ensuite à 201 jusqu'a 300 puis de 301 à 400 etc ???
Dernière question pour étendre la selection à deux colonnes par exp
je dois passer par ça
ption Explicit
Sub EclaterFichier()
Dim Lign As Long, DrLig As Long
Dim Cpt As Integer
Dim Chemin As String, NomFich As String
Dim rRange
Set rRange = Range(Columns(1), Columns(2))
Application.DisplayAlerts = False
Cpt = 0
Chemin = "C:\Documents and Settings\JSEBBAN\Bureau\2\"
With Workbooks("A.xlsx").Sheets("Feuil1")
DrLig = .Range("rRange" & Rows.Count).End(xlUp).Row
For Lign = 1 To DrLig Step 200
NomFich = "OFFRE5402_" & 141 + Cpt & ".csv"
Workbooks.Add
.Range("A:" & Lign & ":A" & Lign + 199).Copy Range("A1")
ActiveWorkbook.SaveAs Filename:=Chemin & NomFich, FileFormat:=xlCSV, CreateBackup:=False
ActiveWindow.Close
Cpt = Cpt + 1
Next
End With
Application.DisplayAlerts = True
End Sub
dsl de ces questions mais ce serait bete de copier coller cette macro sans la comprendre
Cordialement
John
Vous etes mon sauveur, j'etais trés loin
Grace à vous j'ai compris l'utilisation de "" et du &
je me permet quelques questions :
DrLig = .Range("A" & Rows.Count).End(xlUp).Row ==> permet de selectioner les lignes tant qu'elles ne sont pas vide ?
Cpt ==> je ne comprend pas , pourriez vous m'expliquer, je comprend que cela à un rapport avec l'augmentation du nom d'un à chaque fois mais je ne comprend pas comment
For Lign = 1 To DrLig Step 200 =+> permet de selectionner des plages de 200 ce que je ne comprend pas c'est comment vous faites pour que la macro commence ensuite à 201 jusqu'a 300 puis de 301 à 400 etc ???
Dernière question pour étendre la selection à deux colonnes par exp
je dois passer par ça
ption Explicit
Sub EclaterFichier()
Dim Lign As Long, DrLig As Long
Dim Cpt As Integer
Dim Chemin As String, NomFich As String
Dim rRange
Set rRange = Range(Columns(1), Columns(2))
Application.DisplayAlerts = False
Cpt = 0
Chemin = "C:\Documents and Settings\JSEBBAN\Bureau\2\"
With Workbooks("A.xlsx").Sheets("Feuil1")
DrLig = .Range("rRange" & Rows.Count).End(xlUp).Row
For Lign = 1 To DrLig Step 200
NomFich = "OFFRE5402_" & 141 + Cpt & ".csv"
Workbooks.Add
.Range("A:" & Lign & ":A" & Lign + 199).Copy Range("A1")
ActiveWorkbook.SaveAs Filename:=Chemin & NomFich, FileFormat:=xlCSV, CreateBackup:=False
ActiveWindow.Close
Cpt = Cpt + 1
Next
End With
Application.DisplayAlerts = True
End Sub
dsl de ces questions mais ce serait bete de copier coller cette macro sans la comprendre
Cordialement
John
dsl de ces questions mais ce serait bete de copier coller cette macro sans la comprendre C'est rare de lire ça, mais je suis entièrement de ton avis, ça fait plaisir!!!
1- DrLig = .Range("A" & Rows.Count).End(xlUp).Row ==> renvoie le numéro de la dernière ligne non vide de la colonne A. Tu dis au départ ne pas savoir combien de lignes traiter, on le sait grâce à ça.
Ca nous permet de boucler sur toutes les lignes (For Lign=), de la première (Lign = 1) à la dernière (To DrLig), en "sautant" systématiquement 200 lignes plus bas (Step 200)
D'ou la ligne de code : For Lign = 1 To DrLig Step 200
2- Cpt. Tu dis que le nom du fichier csv s'incrémente de 1 en 1 en commençant par "gnagna" & 141.
Donc, on incrémente un compteur numérique : Cpt de 1 en 1 et on ajoute à la fin de ton nom de fichier 141 + Cpt
1ere boucle ==> "gnagna"141
Cpt = Cpt + 1
2eme boucle ==> "gnagna"142
Cpt = Cpt + 1
3eme boucle ==> "gnagna"143 etc etc...
3- For Lign = 1 To DrLig Step 200
1ere boucle ==> Lign = 1
2eme boucle ==> Lign = 201
3eme boucle ==> Lign = 401
(Step 200 : on boucle de 200 en 200...)
La sélection ne se fait pas là, mais sur cette ligne :
.Range("A:" & Lign & ":A" & Lign + 199).Copy
On copie dans la colonne A de Lign à Lign + 199
Soit, si on reprends notre boucle :
For Lign = 1 To DrLig Step 200
1ere boucle ==> Lign = 1 ====> on copie de 1 à 1+199 donc de 1 à 200
2eme boucle ==> Lign = 201 ====> on copie de 201 à 201+199 donc de 201 à 400
3eme boucle ==> Lign = 401 ====> on copie de 401 à 401+199 donc de 401 à 600
etc etc...
4- Dernière question pour étendre la selection à deux colonnes par exp
On reprends cette ligne : .Range("A:" & Lign & ":A" & Lign + 199).Copy Range("A1")
On copie de A Lign à A Lign + 199...
Ce que tu veux toi : Copier de A Lign à B Lign + 199... Logique non?
Donc
.Range("A:" & Lign & ":B" & Lign + 199).Copy Range("A1")
5- pour finir, la syntaxe du copier coller
.Range("A:" & Lign & ":B" & Lign + 199).Copy Range("A1")
Je copie DE ALignBLign+199 (.Range("A:" & Lign & ":B" & Lign + 199).Copy ) VERS A1(Range("A1"))
1- DrLig = .Range("A" & Rows.Count).End(xlUp).Row ==> renvoie le numéro de la dernière ligne non vide de la colonne A. Tu dis au départ ne pas savoir combien de lignes traiter, on le sait grâce à ça.
Ca nous permet de boucler sur toutes les lignes (For Lign=), de la première (Lign = 1) à la dernière (To DrLig), en "sautant" systématiquement 200 lignes plus bas (Step 200)
D'ou la ligne de code : For Lign = 1 To DrLig Step 200
2- Cpt. Tu dis que le nom du fichier csv s'incrémente de 1 en 1 en commençant par "gnagna" & 141.
Donc, on incrémente un compteur numérique : Cpt de 1 en 1 et on ajoute à la fin de ton nom de fichier 141 + Cpt
1ere boucle ==> "gnagna"141
Cpt = Cpt + 1
2eme boucle ==> "gnagna"142
Cpt = Cpt + 1
3eme boucle ==> "gnagna"143 etc etc...
3- For Lign = 1 To DrLig Step 200
1ere boucle ==> Lign = 1
2eme boucle ==> Lign = 201
3eme boucle ==> Lign = 401
(Step 200 : on boucle de 200 en 200...)
La sélection ne se fait pas là, mais sur cette ligne :
.Range("A:" & Lign & ":A" & Lign + 199).Copy
On copie dans la colonne A de Lign à Lign + 199
Soit, si on reprends notre boucle :
For Lign = 1 To DrLig Step 200
1ere boucle ==> Lign = 1 ====> on copie de 1 à 1+199 donc de 1 à 200
2eme boucle ==> Lign = 201 ====> on copie de 201 à 201+199 donc de 201 à 400
3eme boucle ==> Lign = 401 ====> on copie de 401 à 401+199 donc de 401 à 600
etc etc...
4- Dernière question pour étendre la selection à deux colonnes par exp
On reprends cette ligne : .Range("A:" & Lign & ":A" & Lign + 199).Copy Range("A1")
On copie de A Lign à A Lign + 199...
Ce que tu veux toi : Copier de A Lign à B Lign + 199... Logique non?
Donc
.Range("A:" & Lign & ":B" & Lign + 199).Copy Range("A1")
5- pour finir, la syntaxe du copier coller
.Range("A:" & Lign & ":B" & Lign + 199).Copy Range("A1")
Je copie DE ALignBLign+199 (.Range("A:" & Lign & ":B" & Lign + 199).Copy ) VERS A1(Range("A1"))
ah ben j'ai trouvé plus simple
Option Explicit
Sub EclaterFichier()
Dim Lign As Long, DrLig As Long
Dim Cpt As Integer
Dim Chemin As String, NomFich As String
Application.DisplayAlerts = False
Cpt = 0
Chemin = "C:\Documents and Settings\JSEBBAN\Bureau\2\"
With Workbooks("A.xlsx").Sheets("Feuil1")
DrLig = .Range("A" & Rows.Count).End(xlUp).Row
DrLig = .Range("B" & Rows.Count).End(xlUp).Row
For Lign = 1 To DrLig Step 200
NomFich = "OFFRE5402_" & 141 + Cpt & ".csv"
Workbooks.Add
.Range("A" & Lign & ":A" & Lign + 199).Copy Range("A1")
.Range("B" & Lign & ":B" & Lign + 199).Copy Range("B1")
ActiveWorkbook.SaveAs Filename:=Chemin & NomFich, FileFormat:=xlCSV, CreateBackup:=False
ActiveWindow.Close
Cpt = Cpt + 1
Next
End With
Application.DisplayAlerts = True
End Sub
Merci lol
Option Explicit
Sub EclaterFichier()
Dim Lign As Long, DrLig As Long
Dim Cpt As Integer
Dim Chemin As String, NomFich As String
Application.DisplayAlerts = False
Cpt = 0
Chemin = "C:\Documents and Settings\JSEBBAN\Bureau\2\"
With Workbooks("A.xlsx").Sheets("Feuil1")
DrLig = .Range("A" & Rows.Count).End(xlUp).Row
DrLig = .Range("B" & Rows.Count).End(xlUp).Row
For Lign = 1 To DrLig Step 200
NomFich = "OFFRE5402_" & 141 + Cpt & ".csv"
Workbooks.Add
.Range("A" & Lign & ":A" & Lign + 199).Copy Range("A1")
.Range("B" & Lign & ":B" & Lign + 199).Copy Range("B1")
ActiveWorkbook.SaveAs Filename:=Chemin & NomFich, FileFormat:=xlCSV, CreateBackup:=False
ActiveWindow.Close
Cpt = Cpt + 1
Next
End With
Application.DisplayAlerts = True
End Sub
Merci lol