0
votes

VBA Word: Trouvez un paragraphe qui a un style spécifique

J'essaie d'écrire un code dans VBA, où je vais obtenir le numéro d'un paragraphe qui aura un style spécifique (disons en rubrique 1). Je passe par une boucle et malheureusement, je reçois une telle erreur: xxx pré>

voici mon code: p>

Public Function FindParagraph(ByVal pStyle As String) As Integer
    Dim doc As Document
    Dim pNum As Integer
    Set doc = ActiveDocument

    For pNum = 1 To doc.Paragraphs.Count
        Debug.Print pNum, doc.Paragraphs(pNum).Range.Style
        If doc.Paragraphs(pNum).Range.Style = pStyle Then
            FindParagraph = pNum
            Exit For
        End If
    Next pNum
End Function

Sub DoSth()
    Dim i As Integer
    i = FindParagraph("Heading 1")
    Debug.Print i
End Sub


1 commentaires

Juste un indice utile concernant la modification de votre question. Si vous avez eu des réponses et d'autres réponses, vous ne devez pas modifier la question initiale, mais devriez-y ajouter à elle (voir ma réponse) afin que les commentaires et les réponses que vous aviez en relation avec la question initiale ont toujours un sens.


3 Réponses :


1
votes

Le code que vous avez fourni ne compile pas. Il donne une erreur à xxx

car la méthode isempty ne doit être utilisée que sur un type de variante et que le type que vous avez affecté à PSTyle est une chaîne. Pour atteindre votre intention, vous devrez modifier cette ligne sur xxx

mise à jour pour fournir une fonction révisée xxx

Mise à jour 2020-APR-15 Résolution de la question de la TOC

Le code posté par l'OP et par moi-même échoue lorsque le paragraphe est un champ de table des matières. Cette défaillance se produit en raison de la fonctionnalité de membre par défaut des objets VBA.

L'élément par défaut d'un objet est une méthode appelée si l'instance d'objet est donnée sans méthode de qualification. Cette fonctionnalité peut être utile car elle simplifie le code, mais peut conduire à d'étranges erreurs similaires à celle que nous vivons.

En mot, les styles sont des objets avec de nombreuses propriétés et méthodes. La méthode de style par défaut est NAMELOCAL (voir le navigateur d'objet pour Word.Style) qui renvoie une variante contenant une chaîne (voir le type de style dans les fenêtres locales). Par conséquent, même si le pstyle est défini comme un type de chaîne, la coercition VBA permet à la variante / chaîne d'être affectée au pstyle à chaîne et tout semble être correct.

Toutefois, dans le cas d'un champ de TOC, il apparaît que Word ne renvoie pas le style d'enveloppe le champ TOC, il renvoie la valeur de 'rien' I.E. Il n'y a pas de style pour un TOC. Rien (pas la même chose que vbnullstring) ne peut être attribué à une chaîne et, par conséquent, une erreur se produit.

Il semble y avoir deux solutions au problème rencontré ci-dessus.

  1. Modifiez le code pour utiliser la syntaxe correcte pour les informations dont nous avons besoin. I.e. style.namelocal. Malheureusement, cette solution échouera également parce que nous ne pouvons pas appeler une méthode (Namelocal) sur un objet qui n'est rien.

  2. Modifiez le type de variable pour PSTyle de la chaîne à la variante. Les types de variantes peuvent contenir des objets et peuvent donc contenir la valeur de rien qui est généré lorsqu'un paragraphe est un champ de TOC.

    Solution 2 semblerait fonctionner correctement, à partir d'une perspective puriste, vous auriez une variante variante intermédiaire qui capture le résultat de style, puis teste la variante pour rien avant d'attribuer la valeur de chaîne ou VBNullstring à PSTyle. < / p>

    mise à jour finale 2020-avr-15

    J'ai été instaualement appelé par Mme F pour certains emplois urgents, alors oublié d'ajouter ce morceau final.

    Le membre par défaut Le piège peut être évité facilement. Ceci est dû au travail incroyable effectué par les gens sur RubberDuck.

    http://rubberduckvba.com /

    Le RubberDuck Adidin pour VBA (qui est gratuit) a, comme l'un de ses nombreux talents, une analyse de code beaucoup plus rigoureuse (inspections de code) de VBA. L'une des inspections consiste à avertir où un membre par défaut a été utilisé dans le code. RubberDuck élimine vraiment une quantité importante de douleur lors de la rédaction de code VBA car il vous aide à comprendre exactement les hypothèses que vous avez faites dans votre code (que vous n'aviez pas réalisé que vous avez réalisé) ... >


16 commentaires

Pas vraiment. "Bien que pas de pstyle <>" Heading 1 "est un double négatif, donc vous dites vraiment" tandis que PSTyle = "en direction de 1" de sorte que la boucle ne fera rien si le premier paragraphe n'est pas "en rubrique 1". Je soupçonne que tu veux dire "tandis que Pstyle <>" "Heading 1". Vous avez également une erreur dans l'emplacement de i = i + 1. Cela devrait venir après la ligne "PSTyle = ..." ". Pourquoi?, Parce que vous avez défini I en 1 avant de démarrer la boucle, puis la première action de la boucle est de définir i = i + 1, vous commencez donc à tester le pstyle avec une valeur de i = 2. Votre code produira également une erreur si vous ne trouvez jamais un "Rubrique 1"


J'ai mis à jour ma réponse avec une fonction révisée pour vous


Cet article peut également être intéressant vba.relief.jp / Word-VBA-Get-Index-Number-Index-paragraphe


Je comprends le code mais je ne sais toujours pas pourquoi je reçois cette erreur lorsque la toc est atteinte par le débogueur. Avez-vous une idée pourquoi?


Y a-t-il des paragraphes après la TOC?


Vous devriez également considérer le i = i + 1. Si vous avez 10 paragraphes de votre document, votre code échouera s'il ne trouve pas «en-tête» dans les 10 premiers paragraphes, car votre code continue au paragraphe 11 et au-delà et vous ne pouvez pas tester ce qui n'existe pas. Avez-vous le même problème avec mon code?


Oui, il y a beaucoup de paragraphes. Il y a un tableau de paragraphe des matières. C'est bon. Ensuite, il y a le premier vide du TOC et ce n'est pas correct. Ce qui est intéressant, la deuxième entrée de la TOC est ok. C'est ce que je ne comprends pas.


Je reçois une erreur: Erreur de temps d'exécution '424': Objet requis pour cette ligne si doc.autolums (parindex) .Range.style = paragraphe.style = paragraphes alors


Je peux reproduire le problème avec un document contenant un TOC. Je vais enquêter plus loin.


Ce qui est curieux, c'est le fait que si je supprime toc de mon document, le code fonctionne et il trouve le paragraphe :). Je vais ajouter mon nouveau code à mon premier message /


«Je ne sais toujours pas pourquoi je reçois cette erreur lorsque la toc est atteinte» probablement parce que vous avez attaché le TOC à un paragraphe à laquelle le style de la route est appliqué.


@macropod, il semble que tu as raison. Merci pour ce conseil.


J'ai trouvé la raison pour laquelle il y a un problème et mis à jour ma réponse ci-dessus pour expliquer le problème et la solution.


@freeflow Merci beaucoup pour une réponse aussi vaste et utile!


Malheureusement, en utilisant le type variante ne donne pas d'effet positif. Mon problème est ce qui suit. J'ai un groupe de tables que je veux changer le style de. Cependant, les tables sont dans différentes parties du document. Je souhaite donc définir la plage du document et faire des actions pour les tables uniquement dans une plage spécifique. C'est pourquoi je devais trouver un numéro de paragraphe spécial car je n'ai aucune autre idée comment définir une telle gamme.


Je ressens ta douleur. Cependant, c'est maintenant un nouveau sujet pour que vous puissiez ouvrir une nouvelle question.



0
votes

Il n'est pas possible qu'un paragraphe n'est pas possible de ne pas avoir de style de paragraphe, de sorte que le paragraphe manque de tout style est inutile.

aussi, en boucle dans tous les paragraphes est beaucoup moins efficace que l'utilisation de la recherche. Par exemple, le code suivant récupère le numéro d'indice de paragraphe de chaque rubrique 1: xxx

plus de code, mais beaucoup plus rapide.


0 commentaires

0
votes

au lieu de la place pour i = 1 à .... compte Essayez pour chaque boucle pour une meilleure efficacité xxx

ses œuvres pour les styles de paragraphe. Pour les styles de caractères, vous devez utiliser. MéthodeFind.


0 commentaires