Macro et VBA

Résolu/Fermé
CHARLYJACK Messages postés 353 Date d'inscription mardi 19 octobre 2010 Statut Membre Dernière intervention 16 mai 2023 - 19 oct. 2010 à 21:47
CHARLYJACK Messages postés 353 Date d'inscription mardi 19 octobre 2010 Statut Membre Dernière intervention 16 mai 2023 - 3 avril 2011 à 20:19
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




A voir également:

2 réponses

eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
Modifié par eriiic le 27/10/2010 à 13:48
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
CHARLYJACK Messages postés 353 Date d'inscription mardi 19 octobre 2010 Statut Membre Dernière intervention 16 mai 2023 1
20 oct. 2010 à 08:42
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
CHARLYJACK Messages postés 353 Date d'inscription mardi 19 octobre 2010 Statut Membre Dernière intervention 16 mai 2023 1
26 oct. 2010 à 23:01
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
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
26 oct. 2010 à 23:21
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
CHARLYJACK Messages postés 353 Date d'inscription mardi 19 octobre 2010 Statut Membre Dernière intervention 16 mai 2023 1
27 oct. 2010 à 08:49
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
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
27 oct. 2010 à 13:43
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 15/02/2011 à 12:24
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
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
15 févr. 2011 à 21:30
Bonsoir lermite,

Tu as tout à fait raison, mon code n'était pas vraiment optimisé sur ce point.
eric
0
CHARLYJACK Messages postés 353 Date d'inscription mardi 19 octobre 2010 Statut Membre Dernière intervention 16 mai 2023 1
15 févr. 2011 à 22:36
Bonsoir lermite,
un grand merci à toi de participer à mon apprentissage VBA !
0