XL 2013 vendee globe

Viaduc12

XLDnaute Nouveau
Bonsoir à tous
Je suis nouveau dans ce forum. J'ai lu un grand nombre d'exemples mais aucun ne correspond vraiment à ce que je souhaite réaliser.
Si vous avez visité le site du Vendée globe 2016-2017 un tableau excel est crée toutes les 4 heures soit 6 par jour.
Il donne le classement de tous les skippers.
J'ai donc eu l'idée d'insérer les tableaux les uns à la suite des autres dans une feuille appelée "Classement".
J'ai crée ensuite un tableau par skipper (29 feuilles).
Cette macro (mise à jour globale) peut être commandée à partir de n'importe lequel des tableaux individuels des skippers.
Mon problème est que mon fichier est aujourd'hui à plus de 5000 lignes et l'ordi mets plus de 5 minutes pour réaliser l'opération.
Une idée serait de ne pas recommencer à zéro mais plutôt là ou s'est arrêtée la dernière mise à jour.
A moins que vous ayez une idée de simplification ?
Et c'est là que je vous appelle à la rescousse.
J'ai posté qu'un tableau partiel. Merci de votre aide.
Bonne soirée
 

Pièces jointes

  • VENDEE GLOBE 2016 2017.xlsm
    1.5 MB · Affichages: 82

Paf

XLDnaute Barbatruc
Bonjour,

si vous écriviez quelque part (en A1 d' une nouvelle feuille par ex) le dernier N° de ligne de la feuille Classement traité , lors de la mise à jour suivante on récupère ce N° + 1 et le N° de la dernière ligne de la feuille Classement et on effectue le traitement uniquement sur ces lignes. puis on copie le N° de la dernière ligne de la feuille Classement en A1 de la nouvelle feuille.

A regarder le code actuel, pas compris pourquoi on a un traitement par skipper ni a quoi servent les colonnes W à AY de la feuille Classement.

A+
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Bonsoir à tous
Je suis nouveau dans ce forum. J'ai lu un grand nombre d'exemples mais aucun ne correspond vraiment à ce que je souhaite réaliser.
Si vous avez visité le site du Vendée globe 2016-2017 un tableau excel est crée toutes les 4 heures soit 6 par jour.
Il donne le classement de tous les skippers.
J'ai donc eu l'idée d'insérer les tableaux les uns à la suite des autres dans une feuille appelée "Classement".
J'ai crée ensuite un tableau par skipper (29 feuilles).
Cette macro (mise à jour globale) peut être commandée à partir de n'importe lequel des tableaux individuels des skippers.
Mon problème est que mon fichier est aujourd'hui à plus de 5000 lignes et l'ordi mets plus de 5 minutes pour réaliser l'opération.
Une idée serait de ne pas recommencer à zéro mais plutôt là ou s'est arrêtée la dernière mise à jour.
A moins que vous ayez une idée de simplification ?
Et c'est là que je vous appelle à la rescousse.
J'ai posté qu'un tableau partiel. Merci de votre aide.
Bonne soirée
a-postériori le nom de fichier change à chaque fois, l'historisation permettrait de savoir si l'extraction existe déjà.

le gros point d'achoppement :
existe-il un historique des différents fichiers fournis par Vendée-globe
sinon comment faire pour ne pas rater une mise à jour (toutes les 6heures ...)
ensuite :
supprimer les fusions de cellules
remplacer les séparateurs décimaux US par ceux du poste utilisateur
supprimer les unités collées aux valeurs
l'utilisation de filtres/tri sera alors possible.
 

Viaduc12

XLDnaute Nouveau
Bonsoir à tous et merci de vos remarques pertinentes.

"si vous écriviez quelque part (en A1 d' une nouvelle feuille par ex) le dernier N° de ligne de la feuille Classement traité , lors de la mise à jour suivante on récupère ce N° + 1 et le N° de la dernière ligne de la feuille Classement et on effectue le traitement uniquement sur ces lignes. puis on copie le N° de la dernière ligne de la feuille Classement en A1 de la nouvelle feuille."

Je précise que je télécharge chaque fichier dans l'historique des classements sur le site de la course.
Je copie le tableau en B258 par exemple. Ensuite je mets à jour la colonne A manuellement : en A258 je tappe = $B$258 puis j'étire la formule jusqu'à la fin du tableau (32 lignes). Je ferai de même quand je copierai le tableau suivant de B290 à B312 je n'ai pas réussi à automatiser cette tâche.
J'ai crée un compteur dans la feuille de chaque skipper case A1 qui indique le numéro de la première ligne vide de la colonne A (ici 13)
Ce chiffre déclenche le calcul dont le résultat apparaît case F1 de la feuille classement et qui correspond à la première ligne vide de cette feuille (ici 290).
De ce fait lorsque je copie un ou plusieurs tableaux dans la feuille classement ce compteur reste figé et donc détermine à partir de quelle ligne doit démarrer la prochaine mise à jour. Je ne suis pas assez bon pour demander au programme de débuter à cet endroit car c'est là la clé de la rapidité de la mise à jour. Je n'ai réussi qu'a lui dire de ne pas faire la mise à jour si la case H1 de la feuille classement est égale à zéro et c'est pour cela que lorsque vous exécutez le code vous avez le message "les données sont à jour"

"A regarder le code actuel, pas compris pourquoi on a un traitement par skipper ni a quoi servent les colonnes W à AY de la feuille Classement."
Le traitement par skipper me permet de connaitre l'évolution du classement de chaque skipper.
De W1 AY1 figure le nom de chaque skipper.
Si le nom du skipper est trouvé dans la colonne D la fonction renvoie "garder" sinon elle renvoie "supprimer".
La colonne est reporté dans le code du skipper de telle sorte que l'ordinateur affecte toutes les lignes du skipper dans sa feuille.
Je prends l'exemple d'Alex Thomson :
cellule12 = Range("AC" & cycle1A).Value LA COLONNE AC CORRESPOND AU SKIPPER ALEX THOMSON
If cellule12 = "garder" Then CHAQUE FOIS QUE LA COLONNE CONTIENT LE MOT "garder"
Range("A" & cycle1A & ":" & "V" & cycle1A).Select LES CELLULES DE A à V DE LA LIGNE CORRESPONDANTE SONT COPIEES
Selection.Copy
Sheets("AlexThomson").Select
Range("A" & cycle1B).Select PUIS COLLÉES DANS LA FEUILLE ALEX THOMSON
ActiveSheet.Paste
C'est à cause de ça que j'ai du effectuer 29 codes différents
Il y a surement d'autres moyens pour y arriver mais c'est la seule façon que j'ai trouvé et c'est à cause de ça que l'ordi met 5 minutes à exécuter le code car ma feuille classement contient actuellement 5569 lignes et ils n'en sont qu'a mis course.

"a-postériori le nom de fichier change à chaque fois, l'historisation permettrait de savoir si l'extraction existe déjà."
Il est vrai que cela serait un plus dans le logiciel.

"supprimer les fusions de cellules
remplacer les séparateurs décimaux US par ceux du poste utilisateur
supprimer les unités collées aux valeurs
l'utilisation de filtres/tri sera alors possible."

Le problème est que l'indication du moment du classement se trouve seulement dans la première ligne. J'ai peur qu'en épurant le tableau de la sorte il se produise un mélange.

J'espère vous avoir éclairé sur mon raisonnement.

Je pense qu'il faut explorer la problématique de Paf et faire en sorte de ne pas recommencer à zéro chaque mise à jour.
Je vous remercie encore de votre contribution.
Bonne soirée à tous.
 

Paf

XLDnaute Barbatruc
Re et bonjour Modeste geedee,

un essai macro:

VB:
Sub Dispatch()
Dim T, i As Long, DerL As Long, Deb As Long,
Start = Timer
Application.ScreenUpdating = False
With Worksheets("Classement")
DerL = .Range("A" & Rows.Count).End(xlUp).Row
If .Range("F1") = DerL Then
    MsgBox "Pas de nouvelles données à traiter"
    Exit Sub
Else
    Deb = .Range("F1") + 1
End If
T = .Range("A" & Deb & ":T" & DerL)
End With
For i = LBound(T, 1) To UBound(T, 1)
    If IsNumeric(T(i, 2)) And T(i, 2) <> "" Then
        Feuille = Split(T(i, 4), vbLf) ' on crée un tableau avec les donnée colonne D
        With Worksheets(Feuille(0)) ' feuille(0) contient le nom du skipper
         .Range("A" & .Range("F" & Rows.Count).End(xlUp).Row + 1).Resize(1, UBound(T, 2)) = Application.Index(T, i)
        End With
    End If
Next
Worksheets("Classement").Range("F1") = DerL
Application.ScreenUpdating = True
MsgBox Timer - Start
End Sub

Le principe : on prend chaque ligne 'utile' de la feuille classement et on la copie dans la feuille correspondant au skipper.
Impératif, les noms de feuille doivent être strictement identiques au nom de skipper. il y a donc une trentaine de feuilles à modifier.

Pour le premier traitement , vider la cellule F1 de la feuille classement. En fin de traitement s'y inscrit automatiquement le N° de la dernière ligne traitée.

Sur le classeur fourni le traitement des 289 lignes demande environ 1,2 secondes. A voir sur plus de 5000 lignes

A+
 

Viaduc12

XLDnaute Nouveau
Re et bonjour Modeste geedee,

un essai macro:

VB:
Sub Dispatch()
Dim T, i As Long, DerL As Long, Deb As Long,
Start = Timer
Application.ScreenUpdating = False
With Worksheets("Classement")
DerL = .Range("A" & Rows.Count).End(xlUp).Row
If .Range("F1") = DerL Then
    MsgBox "Pas de nouvelles données à traiter"
    Exit Sub
Else
    Deb = .Range("F1") + 1
End If
T = .Range("A" & Deb & ":T" & DerL)
End With
For i = LBound(T, 1) To UBound(T, 1)
    If IsNumeric(T(i, 2)) And T(i, 2) <> "" Then
        Feuille = Split(T(i, 4), vbLf) ' on crée un tableau avec les donnée colonne D
        With Worksheets(Feuille(0)) ' feuille(0) contient le nom du skipper
         .Range("A" & .Range("F" & Rows.Count).End(xlUp).Row + 1).Resize(1, UBound(T, 2)) = Application.Index(T, i)
        End With
    End If
Next
Worksheets("Classement").Range("F1") = DerL
Application.ScreenUpdating = True
MsgBox Timer - Start
End Sub

Le principe : on prend chaque ligne 'utile' de la feuille classement et on la copie dans la feuille correspondant au skipper.
Impératif, les noms de feuille doivent être strictement identiques au nom de skipper. il y a donc une trentaine de feuilles à modifier.

Pour le premier traitement , vider la cellule F1 de la feuille classement. En fin de traitement s'y inscrit automatiquement le N° de la dernière ligne traitée.

Sur le classeur fourni le traitement des 289 lignes demande environ 1,2 secondes. A voir sur plus de 5000 lignes

A+
 

Viaduc12

XLDnaute Nouveau
Bonjour à tous et merci Beaucoup Paf
Quand vous dites qu'il faut que les feuilles soient identiques au nom du skipper comment dois-je les rédiger ?
feuille (Armel Le Cléac'h Banque Populaire VIII) ou Armel Le Cléac'h ou bien Armel Le Cléac'h Banque Populaire VIII ?
Je vous remercie.
 

Paf

XLDnaute Barbatruc
re,

le nom de la feuille doit être le nom du skipper, soit celui en première ligne des cellules colonne D
pour "Stéphane Le Diraison", la feuille doit s'appeler "Stéphane Le Diraison" et non "StéphaneLeDiraison"
En fait, rajouter des espaces aux noms existants.( et "-" pour jean-pierre)

Une nouvelle version qui 'stocke' les données par skipper puis colle ces données en une seule fois par feuille.
N'ayant plus qu'un seul 'accès en écriture' pour chaque feuille, le traitement devrait être un peu plus rapide.
Peu sensible pour les 289 lignes 1 à 1,1 seconde au lieu de 1,2.
VB:
Sub Dispatch_V2()
Dim T, i As Long, DerL As Long, Deb As Long, Skipper, Dico, TT(), Clé, NbL As Integer
Start = Timer
Application.ScreenUpdating = False
Set Dico = CreateObject("Scripting.Dictionary")
With Worksheets("Classement")
DerL = .Range("A" & Rows.Count).End(xlUp).Row
If .Range("F1") = DerL Then
    MsgBox "Pas de nouvelles données à traiter"
    Exit Sub
Else
    Deb = .Range("F1") + 1
End If
T = .Range("A" & Deb & ":T" & DerL)
End With
For i = LBound(T, 1) To UBound(T, 1)
    If IsNumeric(T(i, 2)) And T(i, 2) <> "" Then
        Skipper = Split(T(i, 4), vbLf)(0) '
        If Not Dico.exists(Skipper) Then
            ReDim TT(1 To 1)
            TT(1) = Application.Index(T, i)
        Else
            TT = Dico(Skipper)
            ReDim Preserve TT(1 To UBound(TT) + 1)
            TT(UBound(TT)) = Application.Index(T, i)
        End If
        Dico(Skipper) = TT
        If UBound(TT) > NbL Then NbL = UBound(TT)
        Erase TT
    End If
Next
For Each Clé In Dico.keys
    With Worksheets(Clé) '
        .Range("A" & .Range("F" & Rows.Count).End(xlUp).Row + 1).Resize(UBound(Dico(Clé)), UBound(T, 2)) = Application.Transpose(Application.Transpose(Dico(Clé)))
    End With
Next
Worksheets("Classement").Range("F1") = DerL
Application.ScreenUpdating = True
MsgBox Timer - Start
End Sub

A+

Edit : Pour les deux versions, les données à partir de la colonne W ne sont plus utiles
 
Dernière édition:

Viaduc12

XLDnaute Nouveau
Bonsoir Paf
Le code marche à merveille.

J'ai modifié 2 choses :
J'ai remplacé la ligne T = .Range("A" & Deb & ":T" & DerL) j Par T = .Range("A" & Deb & ":V" & DerL) j parce que les colonnes U et V n'étaient pas copiées.
J'ai corrigé une petite erreur orthographique en remplaçant : MsgBox "Pas de nouvelles données à traiter" par MsgBox "Pas de nouvelle donnée à traiter" parce qu'en l'absence de donnée, ce mot ne prends pas de S.
Je me suis amusé à effacer toutes les lignes de tous les skippers.
La mise à jour a été réalisée en 177,0156 secondes.
Pour mettre à jour 4 tableaux elle se fait en 0,185 secondes.

J'ai essayé la version 2. Elle ne fonctionne pas "excel ne réponds pas ".
Mais ce n'est pas grave puisque la version 1 marche.
Toutes mes félicitations.

Je voudrai savoir si je dois mettre une option "sujet résolu".
Merci encore à vous et aussi à Modeste geedee.
 

Discussions similaires

Statistiques des forums

Discussions
312 487
Messages
2 088 830
Membres
103 971
dernier inscrit
abdazee