Comment puis-je remplacer un Microsoft Word style de caractère au sein d'une plage/la sélection dans VBA?
Je suis en train de travailler sur un modèle Word 2007 avec une macro qui permet d'appliquer des styles de caractères pour le texte sélectionné. Il semble que la fonctionnalité recherche/remplacement serait un bon endroit pour commencer, mais je crois que j'ai trouvé un bug/limitation qui empêche la macro de travail comme souhaité.
Voici mon code vba:
Sub restyleSelection()
Dim r As Range
Set r = Selection.Range
With r.Find
.Style = ActiveDocument.Styles("Default Paragraph Font")
.Text = ""
.Replacement.Text = ""
.Replacement.Style = ActiveDocument.Styles("Emphasis")
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Sub
Si je crée un document de test qui contient quelques paragraphes et de sélectionner quelques mots dans un des paragraphes, puis exécutez la macro, la "Accent" le style est appliqué non seulement à la sélection, mais au-delà de la fin de la sélection à la fin du document.
Ce comportement est le même à l'aide de l'interface outil de recherche/remplacement.
Ma question est: Comment puis-je surmonter ce bug/limitation et d'appliquer le style de caractère SEULEMENT au sein de la sélection/plage?
Un peu plus d'informations:
Ce que j'ai vraiment besoin de la macro à faire est d'appliquer certaines mises en forme à l'ensemble de la sélection tout en maintenant le caractère existant styles dans la sélection. Par exemple, si le texte contient le caractère Audacieux de style, le caractère en Italique style, et le reste est de Paragraphe par Défaut de la Police, la macro doit remplacer le Gras par "Révisé Bold", remplacer "Italique" avec "Révisée en Italique", et de remplacer "de Paragraphe par Défaut de la Police" avec "Révisé". De cette façon, lorsque j'utilise le compagnon macro "défaire" l'action de cette macro, le caractère original de styles (Gras, Italique, Paragraphe par Défaut de la Police) peut être remplacé.
RÉSOLU:
Voici la solution, je suis finalement arrivé à:
Sub applyNewRevisedText
Dim r As Range ' Create a new Range object
Set r = Selection.Range ' Assign the current selection to the Range
Dim rng As Range
For Each rng In r.Words
Set rngStyle = rng.Style
Select Case rngStyle
Case "Bold"
rng.Style = ActiveDocument.Styles("New/Revised Text Bold")
Case "Italic"
rng.Style = ActiveDocument.Styles("New/Revised Text Emphasis")
Case Else
rng.Style = ActiveDocument.Styles("New/Revised Text")
End Select
Next rng
End Sub
OriginalL'auteur PaulBurton0 | 2012-01-05
Vous devez vous connecter pour publier un commentaire.
Pour répondre à votre question directe
N'est-ce pas répondre à la nécessité?:
EDIT:
Ok, en fonction de votre commentaire, ce sujet de quelque chose comme:
.Mots éclatement de chaque mot dans la gamme en une collection de plages. Ensuite, vous pouvez effectuer de style sur chaque mot en se fondant sur son style.
Gotcha. J'ai édité ma réponse. Vous aide?
Qui a vraiment moi sur la bonne voie. La seule chose qui me retient, c'est maintenant que
If rng.Style = ActiveDocument.Styles("Default Paragraph Font")
ne semble pas reconnaître la base des styles de paragraphe, sans mise en forme des caractères. Je suppose que je peux parcourir le 30-impair styles de paragraphe dans le modèle si j'en ai besoin et demander le bon caractère de style comme nécessaire, mais est-il un moyen de savoir sirng.Style
est un style de paragraphe ou d'un style de caractère? Je vois qu'il y a un Type:=wdStyleTypeCharacter paramètre pour les Styles , mais est-il une telle chose pour le Style bien?OK, j'ai restructuré la macro, un peu à utiliser un
Select Case
déclaration d'appliquer les styles de caractères pour les mots qui ont déjà des styles de caractère, et puis leCase Else
s'applique le caractère approprié, le style à quelque chose qui tombe en travers (qui est, n'a aucun caractère styles appliqués). Vous n'avez en fait répondu à ma question, je viens d'être paresseux et de la recherche pour free réponses supplémentaires 🙂 Merci beaucoup.pas de problème. Content que ça vous a où vous avez besoin. Vous pourriez peut-être poster un exemple de votre solution finale pour le futur, les personnes dans le besoin?
OriginalL'auteur Justin Self
J'ai eu un problème un peu différent et résolu sans avoir recours à une boucle. Le code fonctionne PAS pour le texte qui est mis en forme directement, mais il fonctionne pour le texte qui est mis en forme avec les styles de caractère.
Considérons comme une partie du texte étant sélectionné, y compris ou non, y compris les chaînes à qui déjà quelques de style de caractère a été attribué.
Si dans l'intervalle sélectionné pas de caractère de style a encore été attribuée, après la recherche du début de la sélection ne sera pas le même. Si, toutefois, au moins un style de caractère a été attribué le début de la sélection sera le même qu'avant la recherche. Maintenant, vous pouvez traiter ces deux cas séparément. Dans les deux cas, tous les caractères à l'intérieur de la sélection à laquelle aucun style de caractère a été attribué précédemment sera désormais lié à "myStyle".
OriginalL'auteur Marcel