Macro et VBA

Résolu
CHARLYJACK Messages postés 345 Date d'inscription   Statut Membre Dernière intervention   -  
CHARLYJACK Messages postés 345 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à toutes et à tous,

je suis grand débutant en VBA,
et j'ai besoin d'une manipulation pour le boulot.

J'ai une série de numéros de comptes clients dans la colonne A.
Cette liste est de taille variable.

Mon besoin est le suivant:

je dois diviser la liste en pages de 40 comptes.

Je prends 40 comptes dans la colonne A
je copie et je colle dans une nouvelle feuille 1.

je prends les 40 suivants et je les colle dans une feuille 2.

et etc ... jusqu'au dernier compte de la liste.

Pourriez vous m'aider, car les livres VBA pour l'instant
c'est du chinois pour moi.

merci

David

2 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Un exemple:
    Sub eclate() 
        Const nlig As Long = 40 'nombre de lignes à copier 
        Const ncol As Long = 3 ' nombre de colonnes à copier 
        Dim sh As Worksheet, numf As Long, lig As Long 
        Set sh = ActiveSheet 
        Application.ScreenUpdating = False 
        numf = 1: lig = 1 
        For lig = 1 To sh.[A65536].End(xlUp).Row 
            Worksheets.Add after:=Worksheets(Worksheets.Count) 
            ActiveSheet.Name = "Part " & numf 
            ActiveSheet.Range("A1").Resize(nlig, ncol) = sh.Cells(lig, 1).Resize(nlig, ncol).Value 
            lig = lig + nlig - 1 
            numf = numf + 1 
        Next lig 
        sh.Activate 
        Application.ScreenUpdating = True 
    End Sub 
    

    Bien sélectionner la feuille concernée avant de lancer la macro.
    Si elle a un nom déterminé remplacer :
    Set sh = ActiveSheet
    par :
    Set sh = Worksheets("nom_de_la_feuille")

    De plus je ne contrôle pas si on arrive en fin de feuille, il y aura une erreur si n° dernière ligne remplie+ nlig > 65536 (sur excel 2003)

    eric
    3
    1. CHARLYJACK Messages postés 345 Date d'inscription   Statut Membre Dernière intervention   1
       
      Salut Eric
      merci pour cette réponse rapide et efficace !!!
      ça va me faire gagner beaucoup de temps
      mais promis je continue à bosser mon VBA.
      à plus
      David
      0
    2. CHARLYJACK Messages postés 345 Date d'inscription   Statut Membre Dernière intervention   1
       
      Salut Eric

      encore merci pour cette programmation

      je sais que j'abuse
      mais peux tu m'indiquer
      comment selectionner la colonne B en plus de la colonne A

      dans cette même programmation

      merci

      David
      0
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonsoir,

      Tout dépend de comment tu veux les traiter, et ça sera + ou - simple selon ton choix...

      - en prendre 20 sur A et 20 sur B ?
      ou
      - traiter tout A puis tout B ?
      - si la dernière feuille générée par A est incomplète faut-il absolument la compléter à 40 (oui/non/ça serait mieux) ?

      Est-ce que le nombre de colonnes peut être amené à s'étendre encore ?

      eric
      0
    4. CHARLYJACK Messages postés 345 Date d'inscription   Statut Membre Dernière intervention   1
       
      Salut Eric et merci de l'interêt que tu portes
      à mes interrogations.

      En effet, pour des besoins statistiques le nombre de colonnes peut varier:
      Numéro client / Montant de dette / Montant retard / Date ...

      La dernière feuille générée par A sera incomplète ( et peut rester inachevée) dans la mesure
      où le nombre de clients varie en fonction des arrêtés comptables.

      Je pense que A, B, C ... peuvent être traîtés simultanément car les infos de chaque
      ligne correspondent au même client.

      merci d'avance

      David
      0
    5. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjour,

      J'ai modifié le code au post 1.
      Maintenant le nombre de lignes et de colonnes à copier sont définis par 2 constantes au début.
      Tu peux faire évoluer comme tu veux.

      eric
      0
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Bonjour Eric, (+1)
    Je ne connaîssais pas cette facon de recopier.
    Au regard de ton code, peut-être moyen d'un peu le simplifier ?
    Sub eclate()   
        Const nLig As Long = 40 'nombre de lignes à copier   
        Const nCol As Long = 3 ' nombre de colonnes à copier   
        Dim sh As Worksheet, Lig As Long   
        Set sh = ActiveSheet   
        Application.ScreenUpdating = False   
        For Lig = 1 To sh.[A65536].End(xlUp).Row Step nLig   
            Worksheets.Add after:=Worksheets(Worksheets.Count)   
            ActiveSheet.Name = "Part " & Lig & " - " & Lig + 39   
            ActiveSheet.Range("A1").Resize(nLig, nCol) = sh.Cells(Lig, 1).Resize(nLig, nCol).Value   
        Next Lig   
        sh.Activate   
        Application.ScreenUpdating = True   
    End Sub
    A+
    PS: Surtout intéressant pour remplacer Copy par valeur. Éviter le PasteSpecial qui nécessite le passage par un select.
    L'expérience instruit plus sûrement que le conseil. (André Gide)
    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
    NOTE : Je ne répond pas aux MP pour les questions techniques.
    Ça doit se passer sur le forum pour que tous puisse y participer ou en profiter.
    1
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonsoir lermite,

      Tu as tout à fait raison, mon code n'était pas vraiment optimisé sur ce point.
      eric
      0
    2. CHARLYJACK Messages postés 345 Date d'inscription   Statut Membre Dernière intervention   1
       
      Bonsoir lermite,
      un grand merci à toi de participer à mon apprentissage VBA !
      0