VBA Tri par chapitre

C@thy

XLDnaute Barbatruc
Bonjour le forum,

Dans un document j'ai un style Cathy avec le nom du fichier .doc qui a été copié dans le document et la date de dernière modif de ce fichier, ensuite dans un style sous thème j'ai le thème et ensuite le texte qui va avec.
je souhaiterais trier ce document par thème et à l'intérieur par date de dernière modif.

(ensuite je crée mon sommaire trié de cette façon, c'est le but de la manip).

Code:
Sub ListeWeek()
ChangeFileOpenDirectory chemin
Set Dossier = CreateObject("Scripting.FileSystemObject").getfolder(chemin)
i = 0
For Each SousDossier In Dossier.SubFolders
chemin = SousDossier
  For Each Fichier In SousDossier.Files
    If Right(Fichier.Name, 4) = ".doc" And LCase(Left(Fichier.Name, 9)) <> "prompteur" Then  ' liste les fichier DOC seulement
        ReDim Preserve ATraiter(i) ' pour les noms des fichiers valides
        ReDim Preserve DateModif(i) ' pour les dates
         ReDim Preserve ATraiterchem(i)
        ATraiter(i) = Fichier.Name
        DateModif(i) = Fichier.DateLastModified
        ATraiterchem(i) = chemin & "\" & Fichier.Name
        i = i + 1
    End If
  Next
Next
Call tri(ATraiter, 0, UBound(ATraiter, 1))
End Sub
Code:
Sub tri(a, gauc, droi)
   ref = a((gauc + droi) \ 2)
   g = gauc: d = droi
   Do
     Do While a(g) < ref: g = g + 1: Loop
     Do While ref < a(d): d = d - 1: Loop
     If g <= d Then
       Temp = a(g): a(g) = a(d): a(d) = Temp
       g = g + 1: d = d - 1
     End If
   Loop While g <= d
   If g < droi Then Call tri(a, g, droi)
   If gauc < d Then Call tri(a, gauc, d)
MsgBox Join(ATraiter, vbLf) 'vérif
End Sub

là, en fait, je trie par nom du fichier.
Comme le thème figure en 1er dans mon nom de fichier, c'est donc trié par thème
je vais ouvrir un par un les fichiers selon cet ordre et je les copie dans mon doc. de synthèse (fichier joint)

Comment est-il possible de trier, à l'intérieur d'un même thème, par date et heure de dernière mise à jour?:eek:

Ensuite j'ai une routine qui élimine les titres identiques pour créer mon sommaire
Code:
Sub RechercherStyle()
Dim them As String
    Selection.HomeKey unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Style = ActiveDocument.Styles("sous thème")
    Selection.Find.Text = ""
    Selection.Find.Execute 'on cherche le 1 er item
    them = Selection.Text
    Selection.MoveRight unit:=wdWord, Count:=1, Extend:=wdMove
    Selection.Collapse
    Selection.Find.Execute 'On est au 2eme
  Do
    If Selection.Text = them Then
      Selection.Delete
    Else
      them = Selection.Text
    End If
  Loop While Selection.Find.Execute 'on recherche le style suivant
End Sub

Code:
Sub TDM() 'Table des matières
Selection.HomeKey unit:=wdStory
On Error Resume Next
ActiveDocument.TablesOfContents(1).Delete
Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "SOMMAIRE"
        .Replacement.Text = ""
    End With
    Selection.Find.Execute
    Selection.Collapse 'réduit la sélection au point d'insertion
Selection.MoveRight unit:=wdWord, Count:=3, Extend:=wdMove
    With ActiveDocument
            .TablesOfContents.Add Range:=Selection.Range, RightAlignPageNumbers:= _
            True, UseHeadingStyles:=True, UpperHeadingLevel:=2, _
            LowerHeadingLevel:=2, IncludePageNumbers:=True, AddedStyles:= _
            "Titre 1;1;Thématique;2;sous thème;1;Titre;1", UseHyperlinks:=True, _
            HidePageNumbersInWeb:=True, UseOutlineLevels:=False
        .TablesOfContents(1).TabLeader = wdTabLeaderDots
        .TablesOfContents.Format = wdIndexIndent
    End With
     Selection.InsertBreak Type:=wdPageBreak
End Sub
Si vous avez des idées, merci de m'en faire part.

Je peux changer l'ordre de mes titres si c'est plus facile, par exemple mettre le nom du fichier avec la date et heure de dernière modif sous le titre de style sous thème

je recherche tous les styles sous thème pour un même libellé de thème (ex. AFFAIRES ETRANGERES) je compare les dates, je mets la date la plus récente en 1er etc...

Merci à vous, toutes les idées sont les bienvenues.

Bises et bonne journée

C@thy
 

Pièces jointes

  • docum.zip
    42.3 KB · Affichages: 101

C@thy

XLDnaute Barbatruc
Re : VBA Tri par chapitre

Coucou Zon, je suis le nez dans le guidon...
en réalité il s'agit d'un tri par ordre alpha du nom de fichier et décroissant sur la date (le + récent en 1er)

Oui ça m'irait, bien sûr, je serais difficile!!! Ce serait carrément géant!!
Comme ça m'a l'air bien compliqué:rolleyes: j'envisage de demander aux utilisateurs de nommer le fichier comme ceci :
THEME puis nb de jours restant jusqu'à la fin de l'année puis titre de la news, ainsi le tri alpha serait bon,
qu'en penses-tu?

Sinon, je ne vois pas bien comment dans un doc Word on pourrait couper un élément (la news complète) et le coller sous le thème dans l'ordre décroissant de la date de création:confused: trop dur:mad:

Merci à toi, Zon, t'es super sympa de m'accompagner jusque là.

Bises

C@thy
 
Dernière édition:

C@thy

XLDnaute Barbatruc
Re : VBA Tri par chapitre

Bonjour le forum, Zon,

je n'ai pas arrêté d'y penser cette nuit :

une solution pourrait consister à balayer les sous-répertoires dans l'ordre des jours de la semaine, de vendredi, jeudi... à lundi (ils ne sont pas tous présents s'il y a des jours fériés ils peuvent être absents ou bien vides)

mais c'est une solution pour mettre dans l'ordre de la date, si on fait une synthèse hebdo.

Dans le cas d'une synthèse jour, il faut (dans les 2 cas d'ailleurs...) mettre le + récent en 1er, et donc tenir compte... de l'heure!!!
Damned!:D

Je joins mon fichier de travail (news2), qui est presque terminé, ainsi que les news du mercredi et du vendredi de la semaine 47 (soit le 24 et le 26 novembre)

Edit : je précise au passage que le code n'est pas optimisé mais fonctionne...
il faut conserver le saut de section et ne pas le supprimer intempestivement car la 1ère page a un logo, mais pas les autres, du coup j'ai rajouté des déplacements après ce saut de section.
Il y a sans doute trop de code, des choses inutiles, mais tout va comme je veux, pour moi l'appli est terminée, sauf l'ordre du sommaire, j'ai juste un tri par thème, et c'est déjà pas mal,
reste la chronologie!..

La macro s'appelle AFP, comme Agence France Presse.

Merci pour tout,

Bises et bonne journée,

C@thy
 

Pièces jointes

  • news.zip
    53 KB · Affichages: 92
  • news.zip
    53 KB · Affichages: 99
  • news.zip
    53 KB · Affichages: 102
  • news2.zip
    93 KB · Affichages: 109
  • news2.zip
    93 KB · Affichages: 111
  • news2.zip
    93 KB · Affichages: 108
Dernière édition:

Zon

XLDnaute Impliqué
Re : VBA Tri par chapitre

Salut Cathy,

Est-ce que tes fichiers commencent toujours par

T = Array("AFFAIRES ÉTRANGÈRES", "ECONOMIE","EDUCATION", "POLITIQUE", "SOCIAL") ' à adapter




A+++

Ps pas loin de la solution mais un compteur ne réagit pas comme je l'aimerais, je verrai vendredi.
 
Dernière édition:

Zon

XLDnaute Impliqué
Re : VBA Tri par chapitre

Salut,

Arf, Il est diffcile de trier sur 2 critères dans notre cas , puisque les noms de fichiers sont différents.

Le FSO prend en 1er le dernier fichier modifié dans un répertoire donc créer un repertoire par théme serait le plus judicieux: Politique, économie....

tu vois ce que je veux dire ?

A+++
 

C@thy

XLDnaute Barbatruc
Re : VBA Tri par chapitre

Oui, Zon, je vois ce que tu veux dire,
mais on ne peut changer leurs répertoires, ils ne s'y retrouveraient plus, ils en ont déjà 52*5 = 270!

Edit : Ou alors les créer provisoirement et les supprimer après??:confused::confused::confused:

imagine qu'on copie les news avec la date au-dessus du thème,
est-ce que dans le document on pourrait prendre toute la news (jusqu'à la date du thème suivant non comprise et le coller là où il faut?

Ca me paraît une galère, mais est-ce que c'est possible?:confused:

Merci pour tous tes efforts pour me concocter mon supercadeau de Noël, je sais qu'à 1:00 du mat tu étais encore sur le sujet. (mon petit doigt t'a vu et me l'a dit). Je ne sais pas si on l'aura un jour, mais je sais que tu fais tout pour, et je t'en remercie grandement. De toute façon je te dois déjà un immense merci pour m'avoir menée jusque là.
Pour le reste, je sais que c'est un vrai défi. J'ai essayé d'imaginer dans ma tête plein de solutions de contournement, franchement, c'est hard comme sujet... Si tu arrives à trouver une soluce, ce sera superchapeau pour toi, mais ne t'esquinte pas la santé, faut dormir, hein???

Edit : tu as vu, notre fil remporte un franc succès, le nombre de consultations est intéressant!! Ce fil va finir par devenir une bobine, si on continue...

Gros bisous et bonne journée

C@thy
 
Dernière édition:

C@thy

XLDnaute Barbatruc
Re : VBA Tri par chapitre

voici les thèmes que j'ai déjà rencontrés dans les documents :
'T = Array("AFFAIRES ÉTRANGÈRES", "BUDGET", "CULTURE", "ECONOMIE", "EDUCATION", "EMPLOI", "ENSEIGNEMENT SUPRIEUR", "ENVIRONNEMENT", "FONCTION PUBLIQUE", "GRAND PARIS", "IMMIGRATION - INTÉRIEUR - JUSTICE", "INDUSTRIE", "INSTITUTIONS", "POLITIQUE", "SANTÉ", "SOCIAL", "TRANSPORTS")

Biz
 

C@thy

XLDnaute Barbatruc
Re : VBA Tri par chapitre

Coucou Zon,

pour te venir en aide j'ai ouvert un fil sur le forum XL intitulé tri sur 2 criteres.
Hasco propose une soluce qui passe par XL
Je ne peux pas tester pour l'instant, pas de PC avec moi, mais je ne suis pas sure que les utilisateurs aient XL sur leur poste
c'est un poste specifique dédié aux news de l'AFP
toutefois ce fil peut ouvrir des horizons, qu'en penses-tu?

Bises

C@thy
 

Zon

XLDnaute Impliqué
Re : VBA Tri par chapitre

Salut Cathy,

Je reprend le sujet, notre idée était bonne sauf que le tri sur 2 critères n'est pas bon dans notre cas pour la bonne raison que les nom de fichiers sont différents:

quand on veut trier tous les DUPONT par ordre de naissance le tri multi est valable mais si DUPONT Jean et René sont comparés , c'est Jean en 1er. Il reste les requêtes SQL (c 'est loin depuis la fac) mais si on peut éviter...

POur avoir réfléchi à l'option de déplacer les articles selon la date, c'est une usine à gaz car certains articles sont sur 2 pages et c'est là le pb , WOrd (sauf erreur de ma part) ne sait pas sélectionner du texte entre 2 saut de page sur 2 pages différentes, si une bonne âme a le code ....

Je m'y remet dés que j'ai un peu de temps au bout de code qui nous permettra d'arriver à ce que tu veux.

Tu viens de me donner les thèmes c'est un bon début...

A+++
 

C@thy

XLDnaute Barbatruc
Re : VBA Tri par chapitre

Voici ce à quoi j'avais pensé : le thème le + court est santé
donc 5 caractères si on balaie tous les fichiers, on crée un répertoire avec les 5 premiers car
si le répertoire existe on copie le fichier qui commence par ces 5 car. dans le répertoire sinon (nouveau thème) on crée le répertoire
on cree le repertoire et on copie le fichier dedans
ensuite on trie a l'interieur de chaque repertoire par date décroissant
on cree le doc de synthèse puis on supprime tous les repertoires thèmes
oui daccord c'est un peu une usine a gaz... Mais ton idée est bonne je pense
merci encore pour tous les efforts que tu as faits tu es génial
Bises

C@thy
 

Zon

XLDnaute Impliqué
Re : VBA Tri par chapitre

Salut Cathy,

à tester sur les 6 ou 7 thèmes que tu as donnés,
le fichier prompteur doit être présent dans le même repertoire que tes fichiers (voir commentaire dans listeday2

recopies ce code dans newsmacro, j'ai juste renommer certaines procédures pour les tests


Code:
Sub TriZon() 'Zon, manque la gestion d'erreur
Dim I&, J&, K&, L&, N&
Dim Temp(), T
T = Array("AFFAIRES ÉTRANGÈRES", "ECONOMIE", "EDUCATION", "INDUSTRIE", "POLITIQUE", "SOCIAL") 'à adapter pour l'ordre aussi
  L = -1
  For I = 0 To UBound(T) 'on parcours les différents
    For J = K To UBound(ATraiter)
      If InStr(1, ATraiter(J, 0), T(I)) > 0 Then 'on recherche si AFFAIRES ETRANG2RES est trouvé dans le nom de fichier
        L = L + 1
      Else
        TriMulti2 ATraiter, 1, K, L, False, False  'on trie 2eme colonne depart à L éléments trouves
        K = L + 1
        Exit For
      End If
    Next J
  Next I
End Sub

Sub ListeDay2()
ChangeFileOpenDirectory chemin
I = 0
  Set Dossier = CreateObject("Scripting.FileSystemObject").getfolder(chemin)
  ReDim ATraiter(0 To Dossier.Files.Count - 2, 0 To 1) '-2 car en base 0 et prompteur est présent dans le dossier courant
  For Each Fichier In Dossier.Files
    If Right(Fichier.Name, 4) = ".doc" And LCase(Left(Fichier.Name, 9)) <> "prompteur" Then  ' liste les fichier DOC seulement
      ATraiter(I, 0) = Fichier.Name
      ATraiter(I, 1) = Fichier.DateLastModified
      I = I + 1
    End If
  Next
End Sub
Sub TraitDay2()
Dim Mondoc As String
Dim K&
Mondoc = ThisDocument.Name
Dim v
Selection.EndKey Unit:=wdStory
For K = LBound(ATraiter) To UBound(ATraiter)
  On Error GoTo 0
  With Selection
    .InsertBreak Type:=wdPageBreak
      '.TypeText Text:=DateModif(i)
      '.Style = ActiveDocument.Styles("Cathy")
      '.TypeParagraph
      '.Style = ActiveDocument.Styles("Normal")

  ChangeFileOpenDirectory chemin
  Documents.Open filename:=ATraiter(K, 0), AddToRecentFiles:=False
'   v = Split(ActiveDocument.Path, "\")
'  sem = IIf(UBound(v) > 0, v(UBound(v) - 1), v(UBound(v)))
  Selection.WholeStory 'tout sélectionner
  Selection.Copy
  ActiveWindow.Close
  Selection.EndKey Unit:=wdStory 'fin du doc
  Selection.PasteAndFormat (wdPasteDefault)
End With
Next K
End Sub
Sub TriMulti2(Tablo, Col As Byte, Min&, Max&, Optional SensTri As Boolean, Optional Casse As Boolean)   'ZOn
 Dim I&, J&, K&, M, Chaine
  I = Min
  J = Max
  M = IIf(Casse, UCase(Tablo((Min + Max) / 2, Col)), Tablo((Min + Max) / 2, Col))
  If SensTri Then
    While (I <= J)
      If Casse Then
        While (UCase(Tablo(I, Col)) < M And I < Max)
          I = I + 1
        Wend
        While (M < UCase(Tablo(I, Col)) And J > Min)
          J = J - 1
        Wend
      Else
        While (Tablo(I, Col) < M And I < Max)
          I = I + 1
        Wend
        While (M < Tablo(J, Col) And J > Min)
          J = J - 1
        Wend
      End If
      If (I <= J) Then
        For K = LBound(Tablo, 2) To UBound(Tablo, 2)
          Chaine = Tablo(I, K)
          Tablo(I, K) = Tablo(J, K)
          Tablo(J, K) = Chaine
        Next K
        I = I + 1
        J = J - 1
      End If
    Wend
  Else
    While (I <= J)
      While (Tablo(I, Col) > M And I < Max)
        I = I + 1
      Wend
      While (M > Tablo(J, Col) And J > Min)
        J = J - 1
      Wend
      If (I <= J) Then
        For K = LBound(Tablo, 2) To UBound(Tablo, 2)
          Chaine = Tablo(I, K)
          Tablo(I, K) = Tablo(J, K)
          Tablo(J, K) = Chaine
        Next K
        I = I + 1
        J = J - 1
      End If
    Wend
  End If
  If (Min < J) Then TriMulti2 Tablo, Col, Min, J, SensTri, Casse
  If (I < Max) Then TriMulti2 Tablo, Col, I, Max, SensTri, Casse
End Sub


Sub AFP()

Dim Temp

'MsgBox "Nombre de jours restant jusqu'à la fin de l'année : " & DateDiff("d", Date, DateSerial(Year(Date), 12, 31))
Application.ScreenUpdating = False
TraitDeb
AcquisitionDossier
If IsNumeric(Right(chemin, 1)) Then
   ListeWeek                                  'constitution de la liste des doc à traiter
   Call tri(ATraiter, 0, UBound(ATraiter, 1)) 'tri des doc par thème
   TraitWeek                                  'traiter les doc de la semaine
   RechercherStyle                            'suprimer les titres qui apparaissent plusieurs fois
   MajDateHeure                               'Mise à jour de la date et heure dans l'en-tête
   NumeroSemaine                              'Mise à jour du num de semaine dans l'en-tête
   SemaineDuAu                                'Mise à jour de semaine du... au ... dans l'en-tête
   TDM                                        'Constitution de la Table Des Matières
   SupprSautsDePage                           'Suppression des sauts de page en trop
   SauvWeek                                   'Sauvegarde prompteur-hebdo
Else
   ListeDay2                                   'constitution de la liste des doc à traiter
   TriMulti2 ATraiter, 0, 0, UBound(ATraiter), True 'Atraiter est en base 0 donc la 1ére colonne est 0, la 2eme 1 etc
   TriZon
   TraitDay2                                  'traiter les doc du jour
   RechercherStyle                            'suprimer les titres qui apparaissent plusieurs fois
   MajDateHeure                               'Mise à jour de la date et heure dans l'en-tête
   NumeroSemaine                              'Mise à jour du num de semaine dans l'en-tête
   SemaineDuAu                                'Mise à jour de semaine du... au ... dans l'en-tête
   TDM                                        'Constitution de la Table Des Matières
   SupprSautsDePage                           'Suppression des sauts de page en trop
   SauvDay                                    'Sauvegarde prompteur-quotidien
Application.ScreenUpdating = True
End If
End Sub

Je me suis adapté au code existant mais je n'aime pas cette façon d'écrire le code variables publiques, pas de fonction , pas de gestion d'erreur.

A+++
 

C@thy

XLDnaute Barbatruc
Re : VBA Tri par chapitre

Un IMMENSE MERCI Zon,
je teste ca tout a l'heure je te tiens au courant
jespere ne plus t'embeter après car tu as été vraiment SUPER

Oui tu as raison mon code n'est pas top mais j'ai fait ce que je savais faire
et comme je perdais mes variables je les ai mises en Public
et la gestion des erreurs je ne maitrise pas...
Je te souhaite une bonne journée
et je te remercie pour tout

plein de gros bisous

C@thy
 
Dernière édition:

C@thy

XLDnaute Barbatruc
Re : VBA Tri par chapitre

Bonjour Zon, j'ai testé, ça marche en partie

si je prends le mercredi, ça marche bien pour politique (ordre décroissant) mais pour social j'ai l'ordre inverse à savoir le plus ancien en 1er
je vais essayer de voir ce que je peux faire et je te tiens au courant.

Bises et bonne journée

C@thy
 

Discussions similaires

Réponses
4
Affichages
218
Réponses
6
Affichages
249
Réponses
0
Affichages
157

Statistiques des forums

Discussions
312 333
Messages
2 087 371
Membres
103 528
dernier inscrit
maro