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
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
A voir également:
- Macro et VBA
- Macro word - Guide
- Macro logiciel - Télécharger - Organisation
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Macro recorder - Télécharger - Confidentialité
- Incompatibilité de type vba ✓ - Forum Programmation
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
Modifié par eriiic le 27/10/2010 à 13:48
Bonjour,
Un exemple:
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
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
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
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 ?
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.
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 SubA+
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.
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
15 févr. 2011 à 21:30
Bonsoir lermite,
Tu as tout à fait raison, mon code n'était pas vraiment optimisé sur ce point.
eric
Tu as tout à fait raison, mon code n'était pas vraiment optimisé sur ce point.
eric
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
15 févr. 2011 à 22:36
Bonsoir lermite,
un grand merci à toi de participer à mon apprentissage VBA !
un grand merci à toi de participer à mon apprentissage VBA !
20 oct. 2010 à 08:42
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
26 oct. 2010 à 23:01
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
26 oct. 2010 à 23:21
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
27 oct. 2010 à 08:49
à 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
27 oct. 2010 à 13:43
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