IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

Tri à bulle curieux des noms de police [WD-365]


Sujet :

VBA Word

  1. #1
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut Tri à bulle curieux des noms de police
    Bonjour à la communauté.
    Je tente de faire un document avec un exemple de toutes mes polices installées (plus de 7000).
    J'ai écris un code, mais le tri à bulle ne fonctionne tout simplement pas. Et pourtant, je l'utilise souvent...
    Voici ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Sub ListePolicesInstallées()
        Documents.Add
        Dim Compt As Integer, Lign As Integer, LstPolice() As String
        Compt = 1
        For Each PolicesCar In FontNames
            With Selection
                Compt = Compt + 1
            End With
        Next
        ReDim LstPolice(Compt)
        Lign = 1
        For Each PolicesCar In FontNames
            With Selection
                LstPolice(Lign) = PolicesCar
                Lign = Lign + 1
            End With
        Next
        'Tri à bulles **************************
        Dim i As Integer, j  As Integer, k As Integer, v As Integer
        If loBound = -1 Then loBound = LBound(LstPolice())
        If upBound = -1 Then upBound = UBound(LstPolice())
        k = upBound
        For i = loBound + 1 To upBound
            v = LstPolice(i): j = i
            While LstPolice(j - 1) > v
                LstPolice(j) = LstPolice(j - 1): j = j - 1
            Wend
            LstPolice(j) = v
        Next i
     
        For Lign = 1 To UBound(LstPolice())
            With Selection
                .Font.Name = "Arial"
                .Font.Size = 12
                .Font.Underline = 1
                .Font.Italic = False
                .ParagraphFormat.Alignment = 0
                .Font.Bold = True
                .TypeText Text:=LstPolice(Lign)
                .TypeParagraph
            End With
            With Selection
                .Font.Name = LstPolice(Lign)
                .Font.Bold = False
                .Font.Underline = 0
                .TypeText Text:="Ex : servez un whisky au juge blond qui fume la pipe" & vbLf & "0123456789&é(-è_çà)=#{[|`\^@]}/*-+.ôï$£*µù%!§:/;.,?"
                .TypeParagraph
            End With
            'If Lign > 20 Then Exit Sub
        Next
    End Sub
    Si quelqu'un a une astuce, un conseil, je suis preneur.
    Denis.
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  2. #2
    Membre confirmé
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 351
    Points : 552
    Points
    552
    Par défaut
    Bonjour,

    J'ai testé votre code. Celui-ci fonctionne mais il prend énormément de temps en raison des 1326 polices en stock dans FontNames chez moi et du tri réalisé.
    Mon éditeur VBA étant paramétré pour déclarer obligatoirement les variables, j'ai dû déclarer celles manquantes. J'ai ajouté un Msgbox en début de code pour connaître le nombre de polices.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    Sub ListePolicesInstallées()
     
    Dim PolicesCar, loBound, upBound
     
        MsgBox FontNames.Count
     
        Documents.Add
        Dim Compt As Integer, Lign As Integer, LstPolice() As String
        Compt = 1
        For Each PolicesCar In FontNames
            With Selection
                Compt = Compt + 1
            End With
        Next
        ReDim LstPolice(Compt)
        Lign = 1
        For Each PolicesCar In FontNames
            With Selection
                LstPolice(Lign) = PolicesCar
                Lign = Lign + 1
            End With
        Next
        'Tri à bulles **************************
        Dim i As Integer, j  As Integer, k As Integer, v As Integer
        If loBound = -1 Then loBound = LBound(LstPolice())
        If upBound = -1 Then upBound = UBound(LstPolice())
        k = upBound
        For i = loBound + 1 To upBound
            v = LstPolice(i): j = i
            While LstPolice(j - 1) > v
                LstPolice(j) = LstPolice(j - 1): j = j - 1
            Wend
            LstPolice(j) = v
        Next i
     
        For Lign = 1 To UBound(LstPolice())
            With Selection
                .Font.Name = "Arial"
                .Font.Size = 12
                .Font.Underline = 1
                .Font.Italic = False
                .ParagraphFormat.Alignment = 0
                .Font.Bold = True
                .TypeText Text:=LstPolice(Lign)
                .TypeParagraph
            End With
            With Selection
                .Font.Name = LstPolice(Lign)
                .Font.Bold = False
                .Font.Underline = 0
                .TypeText Text:="Ex : servez un whisky au juge blond qui fume la pipe" & vbLf & "0123456789&é(-è_çà)=#{[|`\^@]}/*-+.ôï$£*µù%!§:/;.,?"
                .TypeParagraph
            End With
            'If Lign > 20 Then Exit Sub
        Next
    End Sub

  3. #3
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Bonjour E KERGRESSE, et merci pour votre aide.
    En fait, nos codes fonctionnent, mais pas leur tri.
    J'ai fais deux petites boucles (avant le tri et après) qui écrivent les valeurs de LstPolice() dans un fichier .txt.
    Je m'aperçois que l'ordre des valeurs des deux fichiers sont les mêmes...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Open "D:\Documents\01 Polices.txt" For Output As #1
        ReDim LstPolice(Compt - 1)
        Lign = 1
        For Each PolicesCar In FontNames
            'With Selection
                LstPolice(Lign) = PolicesCar
                print #1, LstPolice(Lign)
                Lign = Lign + 1
            'End With
        Next
    Résultat :
    Times New Roman
    Arial
    Courier New
    Symbol
    Helvetica
    Courier
    Wingdings
    MS Mincho
    ...
    ...
    Après avoir placé des points d'arrêts (F9) un peu partout, je vois que le tri ne se fait pas.
    La macro passe au-dessus du "For i = loBound + 1 To upBound" pour aller après son "Next i".
    J'ai cherché, et ces "Debug.print" répondent 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        If loBound = -1 Then loBound = LBound(LstPolice) 'LBound(LstPolice()) donne le même résultat
        If upBound = -1 Then upBound = UBound(LstPolice) 'UBound(LstPolice()) donne le même résultat
        Debug.Print loBound
        Debug.Print upBound
    Je pense à Option Base mais j'en doute...
    J'avoue que je tourne un peu en rond.
    Encore merci pour votre aide.
    Denis.
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Hello,
    Tu peux aussi essayer pour le tri l'objet ArrayList :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub ListePolicesInstalléesJP()
    Dim Coll As Object, PolicesCar, i As Long
        Set Coll = CreateObject("System.Collections.ArrayList")
        Documents.Add
        For Each PolicesCar In FontNames
           Coll.Add PolicesCar
        Next
        Coll.Sort ' tri
        Application.ScreenUpdating = False
        For i = 0 To Coll.Count - 1
            With Selection
                .Font.Name = "Arial"
                .Font.Size = 12
                .Font.Underline = 1
                .Font.Italic = False
                .ParagraphFormat.Alignment = 0
                .Font.Bold = True
                .TypeText Text:=Coll(i)
                .TypeParagraph
            End With
            With Selection
                .Font.Name = Coll(i)
                .Font.Bold = False
                .Font.Underline = 0
                .TypeText Text:="Ex : servez un whisky au juge blond qui fume la pipe" & vbLf & "0123456789&é(-è_çà)=#{[|`\^@]}/*-+.ôï$£*µù%!§:/;.,?"
                .TypeParagraph
            End With
            'If Lign > 20 Then Exit Sub
        Next i
        Application.ScreenUpdating = True
    End Sub
    Par contre il ne peut rien contre le temps d'écriture du texte dans le document.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Salut jurassic pork et mille mercis pour ton aide.
    Tout fonctionne super bien ! ! !
    Le coup du Set Coll = CreateObject("System.Collections.ArrayList"), je ne l'avais pas vu venir ! ! !
    J'avoues que j'ai du mal à utiliser les dictionnaires et les collections, mais voici un bel exemple d'utilisation.
    Encore un super grand merci à toi ainsi qu'à la communauté.
    Bien à vous.
    Denis...
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Graphique à bulle avec des noms
    Par scrouet dans le forum Excel
    Réponses: 2
    Dernier message: 18/08/2011, 22h57
  2. tri par ordre alphabétique des noms de fichier contenu dans un dossier
    Par ulnar dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 07/04/2011, 16h20
  3. Trier des tableaux horaire avec un tri à bulle ?
    Par lcoulon dans le forum Débuter
    Réponses: 18
    Dernier message: 30/01/2011, 20h11
  4. TRI d'une structure à partir des noms
    Par jeff69 dans le forum C
    Réponses: 12
    Dernier message: 26/08/2006, 20h20
  5. Récupérer le nom des styles de police
    Par boublee dans le forum Windows
    Réponses: 1
    Dernier message: 10/08/2005, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo