VBA nom de fichier et selection intervalle

Résolu/Fermé
manautop Messages postés 138 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 24 janvier 2013 - Modifié par manautop le 30/12/2011 à 00:57
manautop Messages postés 138 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 24 janvier 2013 - 30 déc. 2011 à 11:34
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

A voir également:

4 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 757
30 déc. 2011 à 09:16
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

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
0
manautop Messages postés 138 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 24 janvier 2013 3
Modifié par manautop le 30/12/2011 à 10:38
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 757
30 déc. 2011 à 10:39
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"))
0
manautop Messages postés 138 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 24 janvier 2013 3
30 déc. 2011 à 10:38
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
0
manautop Messages postés 138 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 24 janvier 2013 3
30 déc. 2011 à 11:34
dsl je n'avais pas vu ta réponses quand j'ai mis ma solution,

Un grand merci à toi pour ton aide, tes explications et le temps passé

Merci
0