VBA nom de fichier et selection intervalle

Résolu
manautop Messages postés 152 Statut Membre -  
manautop Messages postés 152 Statut Membre -
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

4 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. manautop Messages postés 152 Statut Membre 3
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  3. manautop Messages postés 152 Statut Membre 3
     
    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
  4. manautop Messages postés 152 Statut Membre 3
     
    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