Copier des lignes automatiquement dans une autre feuille
cool excellent, merci bon appétit chez moi c'est l'heure du goûter
je voudrais tout simplement rajouter à ta macro Inserlignes : mettre dans la première ligne insérée sous chaque nom en colonne J, le total des lignes "andré", "Charles" etc, sachant que le nombre de lignes va augmenter. J'ai cherché cherché, testé pleins de bouts de codes piochés sur différents forums
mais je ne suis vraiment vraiment pas experte, je n'arrive pas ou cela ne fait pas complètement ce que je veux. Ce n'est vraiment pas pour moi les macros
du coup quelqu'un peut m'aider a faire ma macro somme ?
bien entendu quand vous aurez un petit temps à m'accorder, je vais encore chercher sur les forums
mille merci
Bonjour,
Est-ce-que ton Chevalier servant ... est parti vers d'autres conquêtes ... en t'abandonnant ...
non, non, je suis là ; j'ai quelques petites chose à terminer, puis je me remets sur le dossier !
Oui james, vous m'avez tous les deux abandonnés
A mon grand désarroi, j'attend le retour de l'un ou de l'autre
dhanny a l'air "au taquet", j'attends avec impatience son prochain mail
car c'est du chinois pour moi les macros (sauf deux toutes petites que j'ai réussi
Et pour le final et qui clôturera nos aventures malheureusement, mais mon fichier sera terminé, j'aurai besoin de ton aide james ... c'est une modification de ta parfaite macro avec une autre condition
VALOUB a écrit :je voudrais tout simplement rajouter à la macro InsertLignes : mettre dans la première ligne insérée sous chaque nom en colonne J,
le total des lignes "André", "Charles" etc, sachant que le nombre de lignes va augmenter.
Je te propose le fichier Excel ci-dessous ; fais Ctrl e ; ça marche uniquement si tu lances cette nouvelle macro
à partir de la feuille "VENTES", et c'est indépendant de la sub InsertLignes() ; alors, c'est ok ?
J'ai d'nouveau faim, alors j'retourne manger ; bon appétit !
coucou tu as encore faim ?
Je viens d'essayer, tu fais du bon travail, je te remercie du temps que tu m'accordes
quand je fais contrôle e je vois le total apparaître dans une petite case et disparaitre, il ne peut pas se mettre en colonne J dans une des premières lignes insérées ?
mince j'ai lu trop vite ton mail, il n'y a donc pas de solutions ?
Ah ben c'est sûr, j'ai encore faim ! et même drôlement !!! j'ai rien mangé depuis c'matin pour faire plein d'choses urgentes
puis ensuite faire ton exo !
vite !!! au secours !!! tu m'laisses pas le temps d'souffler, ni même d'aller manger !!!
Tu a écrit :Je viens d'essayer, tu fais du bon travail, je te remercie du temps que tu m'accordes
Merci pour le retour !
Tu a écrit :quand je fais contrôle e je vois le total apparaître dans une petite case et disparaître
La « petite case » s'appelle une « boîte de dialogue » (ou MsgBox) et il n'y a aucune raison pour qu'elle disparaisse d'elle-même :
il faut pour cela que tu valides le message : clic sur le bouton OK ; ou appui sur Entrée ou sur barre d'espace ; tu peux aussi
appuyer sur la touche Echap ; tu peux voir plus bas une copie d'écran avec la MsgBox ouverte, et elle est bien toujours là
tant que j'fais pas une des actions décrites précédemment.
il ne peut pas se mettre en colonne J dans une des premières lignes insérées ?
Laisse-moi aller manger, stp, et j'verrai ça après l'repas ; tu vois, j'ai une patience d'ange :
(normal, j'suis Simon Templar, alias Le Saint
merci, bon appétit, reprends des forces tu vas en avoir besoin avec mes questions "nazes"
donc tu penses qu'il n'y a pas de solution ? que la boite de dialogue qui fonctionne très bien, j'ai du buger !
ça ne peut pas fonctionner avec la macro interligne ? "insérer interligne entre chaque nom différents" et y mettre la somme des lignes dans la colonne J " , pas possible ? dans votre super langage codé ?
Bonjour le fil
Pour information la procédure actuelle (juste la phase calcul/transfert) sans les tris prend environ 3 minutes !
Je viens de découvrir le post, avec une méthode optimisée j'obtiens pour le même traitement 1 seconde et quelques centièmes !
Comme quoi Excel peut être rapide !
(..)
Avec tri VBA (Tri à Bulle non optimisé) 2 secondes et toujours quelques centièmes !
(..)
Avec comptage et saut de lignes au changement de nom : 2 secondes 22 centièmes !
Ce n'est pas l'outil qui compte, c'est la méthode !
bonjour, bienvenue sur le post très animé et joyeux
tu peux expliquer ?
Bonjour VALOUB,
Bonne nouvelle, tout est réglé !
À l'ouverture du fichier, tu seras sur la feuille "VENTES" ;
regarde bien que la colonne J est vide ; Ctrl e ; vu ?
Si tu passes à une autre feuille puis que tu reviens
sur la feuille "VENTES" : idem.
Alors, heureuse ?
Amicalement
bonjour dhanny,
Heureuse, heureuse,
génial, c'est ce que je voulais
C'est votre métier ? à toi et à James ?
en tout cas, c'est remarquable que vous aidiez les gens sur ce forum, sans vous ......
le bénévolat ça prend du temps, j'en fait également partie (mais pas dans l'informatique
mais c'est une joie.
Dhanny, James007 : une macro finale et je vous laisse tranquille malheureusement c'était sympa
A moins que vous m'expliquiez comment faire, dans une nouvelle feuille après ventes (prendre le module 1 et le modifier : extraire les lignes avec date en H mais qui n'on pas de dates en I)
Bonjour VALOUB, le fil
VALOUB a écrit :bonjour, bienvenue sur le post très animé et joyeuxtu peux expliquer ?
Evidemment j'explique. J'ai utilisé des tableaux VBA (donc uniquement en mémoire) aucun traitement sur les feuilles de calculs avant que tout ne soit terminé
Démonstration par le code
' Cette structure pour décrire les onglets "RDV"
Public Type typRdv
nom As String
ligFin As Long
colFin As Long
tabBase As Variant
End Type
' Dans le fichier actuel il y a 2 onglets RDV
Public Const nbrRdv = 2
' Tableau qui contiendra les elements de chaque onglet
Public tabRdv(1 To nbrRdv) As typRdv
' Nouvelle Extraction
Sub NewExtract()
Dim cptRdv ' Compteur de Rdv
Dim cptLig, cptCol ' Compteur des lignes et colonnes
Dim tabRest() ' Le tableau qui sera restitué comme résultat
Dim nbrLig ' Nombre de ligne dans le tableau résultat
Dim ligFin ' Dernière ligne de l'onglet VENTES
Dim tpsStart, tpsFinal ' Pour afficher les temps de traitement
tpsStart = Timer ' Temps de départ
InitRdv "rdv 2016", 1 ' Intégrer en mémoire les rdv 2016
InitRdv "rdv 2017", 2 ' idem pour 2017
' Au depart 0 ligne
nbrLig = 0
' Pour le nombre de rdv connu
For cptRdv = 1 To nbrRdv
' Pour chaque onglet de rdv
With tabRdv(cptRdv)
' Pour le nombre de lignes de chaque rdv
For cptLig = 1 To .ligFin - 1
' Si la date "n'est pas vide"
If Not (.tabBase(cptLig, 9) = "") And Not (.tabBase(cptLig, 9) = "-") Then
' Ajouter une ligne au tableau resultat
nbrLig = nbrLig + 1
' Redimensionner le tableau resultat
' => Attention pour pouvoir être redimensionné ce tableau est à l'envers !
' => Il y a une colonne de plus pour intégrer directement le comptage et permettre le tri
' tout cela en mémoire
ReDim Preserve tabRest(1 To .colFin + 1, 1 To nbrLig)
' Pour toutes les colonnes connues
For cptCol = 1 To .colFin
' Le tableau résultat = le tableau de base
tabRest(cptCol, nbrLig) = .tabBase(cptLig, cptCol)
Next
' Intégration d'une clef pour permettre le tri (NOM + DATE inversée)
tabRest(cptCol, nbrLig) = .tabBase(cptLig, 1) & Format(.tabBase(cptLig, 8), "YYYYMMDD")
End If
Next
End With
Next
' Trier le tableau résultat et le découper ensuite (saut de ligne au changement de nom
tabRest = DecouperRdv(TrierRdv(tabRest))
' Dans l'onglet VENTES
With Worksheets("VENTES")
' Chercher la dernière ligne pour effacer les anciennes données
ligFin = .Cells(Rows.Count, 1).End(xlUp).Row
Range(.Cells(2, 1), .Cells(IIf(ligFin > 1, ligFin, 2), 10)).ClearContents
' Copîer le tableau résultat
.Cells(2, 1).Resize(UBound(tabRest, 1), UBound(tabRest, 2)) = tabRest
End With
' Calculer et afficher le temps d'exécution
tpsFinal = Timer - tpsStart
MsgBox tpsFinal
End Sub
Function DecouperRdv(tablo)
Dim tabTemp() ' Tableau temporaire
Dim cptLig, cptCol ' Compteur de lignes et colonnes
Dim cliRef ' Le client de reference pour pouvoiur faire les sauts de ligne
Dim nbrLig ' nouveau nombre de ligne du tableau découpé
Dim cptTot ' pour calculer directement snas passer par des formules
' au départ une seule ligne
nbrLig = 1
' prendre en compte le premier client
cliRef = tablo(1, 1)
' redimensionner le tableau temporaire et intégrer tds la 1ère ligne
' => Attention ce tableau est à l'envers pour permettre de le rendre dynamique
ReDim tabTemp(1 To UBound(tablo, 1), 1 To nbrLig)
For cptCol = 1 To UBound(tablo, 1)
tabTemp(cptCol, 1) = tablo(cptCol, 1)
Next
' Le compteur est à 1 au début pour permettre le comptage de la 1ère ligne
cptTot = 1
' Pour chaque ligne (à partir de la 2ème puisque la 1ère sert de comparaison)
For cptLig = 2 To UBound(tablo, 2)
' Si la ligne en cours est différente de la clef
If Not (tablo(1, cptLig) = cliRef) Then
' Initialiser cette ligne comme étant la clef suivante
cliRef = tablo(1, cptLig)
' Intégrer tds le comptage
tabTemp(UBound(tabTemp, 1), nbrLig) = cptTot
' Remettre le compteur à 0 (zero)
cptTot = 0
' AJouter une ligne (vide) dans le tableau pour faire les saut entre chaque nom
nbrLig = nbrLig + 1
ReDim Preserve tabTemp(1 To UBound(tabTemp, 1), 1 To nbrLig)
For cptCol = 1 To UBound(tabTemp, 1)
tabTemp(cptCol, nbrLig) = ""
Next
End If
' Ajouter une ligne
nbrLig = nbrLig + 1
ReDim Preserve tabTemp(1 To UBound(tabTemp, 1), 1 To nbrLig)
' Copier les informations de la ligne en cours
For cptCol = 1 To UBound(tabTemp, 1)
tabTemp(cptCol, nbrLig) = IIf(cptCol = UBound(tabTemp), "", tablo(cptCol, cptLig))
Next
' et 1 de plus
cptTot = cptTot + 1
Next
' En profiter pour remettre le tableau dans le bon sens
DecouperRdv = WorksheetFunction.Transpose(tabTemp)
End Function
Function TrierRdv(tablo)
Dim cptAct, cptTri
Dim cptCol
Dim bidon
For cptAct = 1 To UBound(tablo, 2)
For cptTri = cptAct To UBound(tablo, 2)
If tablo(UBound(tablo, 1), cptAct) > tablo(UBound(tablo, 1), cptTri) Then
For cptCol = 1 To UBound(tablo, 1)
bidon = tablo(cptCol, cptAct)
tablo(cptCol, cptAct) = tablo(cptCol, cptTri)
tablo(cptCol, cptTri) = bidon
Next
End If
Next
Next
TrierRdv = tablo
End Function
Sub InitRdv(nomRdv, numRdv)
With Worksheets(nomRdv)
tabRdv(numRdv).nom = nomRdv
tabRdv(numRdv).ligFin = .Cells(Rows.Count, 1).End(xlUp).Row
tabRdv(numRdv).colFin = .Cells(1, Columns.Count).End(xlToLeft).Column
tabRdv(numRdv).tabBase = Range(.Cells(2, 1), .Cells(tabRdv(numRdv).ligFin, tabRdv(numRdv).colFin))
End With
End SubBonjour à tous,
Si je comprends bien ... tout a été repris à Zéro ...
Bonjour James007,
Je te laisse lire mon message de 10:01 et la réponse de VALOUB de 10:31 :
c'est ok pour ce qu'elle demandait concernant les Stats : une macro que j'ai
ajoutée en plus des autres ; elle peut être appelée par l'utilisateur via Ctrl e
et elle est aussi appelée automatiquement par le code la feuille.
Je vais aller d'abord faire une longue pause avant de voir sa nouvelle demande,
puis je lui répondrai ; mais si tu veux continuer toi-même ta macro Extract(),
je t'en prie...
Cordialement
merci dhanny, ta macro fonctionne parfaitement à l'ouverture
j'ai même réussi à l'adapter à mon vrai fichier, miracle mais ce n'était pas très compliqué tu as fait tout le travail
je n'ai eu qu'un petit changement à faire
voilà......
ça va être triste mais reposant pour vous
rebonjour,
Je crois qu'il va falloir que je demande une formation excel parce que là, ça me dépasse...
je suis en train de lire le cours sur le site (je ferai un entraînement ce week end)
ce qui est simple pour vous n'est pas forcément pour moi, suis novice
c'était pour NCC 1701