Как выделить жирным шрифтом только часть абзаца Word в Visual Studio (VB)

Я пытаюсь экспортировать документ Word из программы Visual Basic. Разным частям документа потребуется разное форматирование.

У меня несколько абзацев, и мне нужно выделить только части каждого из них. Я пытаюсь установить диапазон внутри каждого абзаца, который должен быть выделен жирным шрифтом, но, что бы я ни делал, мне кажется, что он только хочет выделить полужирным шрифтом весь абзац.

Я хочу сделать что-то вроде этого:

Dim Para1 As Word.Paragraph
Para1 = WordDoc.Content.Paragraphs.Add
Para1.Range.Start = 1
Para1.Range.End = 14
Para1.Range.Font.Bold = True
Para1.Range.Text = "Job number is: " + myJobID

... чтобы он выделялся жирным шрифтом от 'J' до ':' (в Para1.Range.Text), но не выделял жирным шрифтом myJobID (который является переменной, которую я получаю от пользователя). Однако, что бы я ни делал, весь абзац, включая myJobID, выделяется жирным шрифтом.

Я также попытался создать переменную Range, которая устанавливает диапазон на основе всего документа, но проблема в том, что длины нескольких переменных, которые я выводю в документ Word, будут разных размеров, и, следовательно, нет способ узнать, где будет начинаться следующий раздел, который я хочу выделить жирным шрифтом. В общем, я должен работать с объектом Paragraph, а не перебирать все символы во всем документе.

Надеюсь, это имело смысл. Любые идеи?


person JohnA    schedule 08.03.2019    source источник
comment
Вы устанавливаете свойство жирного шрифта на пустой абзац, а затем добавляете текст. Сделайте наоборот. Например, добавьте абзац, добавьте текст, установите поддиапазон, а затем, наконец, примените форматирование к поддиапазону.   -  person freeflow    schedule 09.03.2019


Ответы (2)


Для форматирования отдельных фрагментов текста необходимо при вставке разбивать текст на отдельные фрагменты. Кроме того, лучше всего работать с независимым объектом Range. Между командами форматирования Range необходимо «свернуть» - подумайте об этом, как о нажатии правой (или левой) стрелки выделения, чтобы сделать его мигающим курсором. Что-то в этом роде

Dim Para1 As Word.Paragraph
Dim rng as Word.Range
Para1 = WordDoc.Content.Paragraphs.Add
rng = Para1.Range
rng.Text = "Job number is: "
rng.Font.Bold = True
rng.Collapse(Word.WdCollapseDirection.wdCollapseEnd)
rng.Text = myJobID
rng.Font.Bold = False
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd

Если действительно необходимо вставить полный текст за один раз, то поиск / замена текста, который должен быть отформатирован по-другому, является одним из способов форматирования постфактум, хотя и менее эффективным.

Другая возможность - использовать функции обработки строк, такие как Instr (или Contains), Left, Mid и т. Д., Чтобы определить, где в более длинной строке находится подстрока. Тогда Range.Start и Range.End могут работать с этими значениями. Но в целом лучше не полагаться на значения start и end, поскольку Word может вставлять невидимые символы, которые могут сбрасывать эту нумерацию.

person Cindy Meister    schedule 09.03.2019
comment
Неважно, где-то у меня была опечатка. Думаю, это работает, но мне нужно поиграть с другими вещами. - person JohnA; 11.03.2019
comment
Скопировано из комментария @JohnA, отправленного на неправильный Ответ: Спасибо за ответ. К сожалению, когда я пытаюсь это сделать, вообще ничего не появляется - вся строка даже не печатается. Я думаю, вы потеряли некоторые кавычки, потому что, если я попробую ваш код буквально, он распечатает три целые строки кода буквально в документе Word (в основном, строки 5-8 вашего кода). Поэтому я ставлю кавычки после идентификатора вакансии. Кроме того, вам потребовались круглые скобки, окружающие Word.WdCollapseDirection.wdCollapseEnd. - person Cindy Meister; 11.03.2019
comment
Спасибо за исправления @JohnA - я набирал текст на мобильном устройстве, вне головы ... Извините за путаницу! Я внес изменения в код в Ответе. - person Cindy Meister; 11.03.2019

Создайте еще один объект Range, который охватывает только символы, которые вы хотите выделить полужирным шрифтом.

Приведенный ниже код не протестирован (на этом компьютере нет полной версии VS), но должен дать вам представление:

Dim para1 As Word.Paragraph
Dim textToBeBolded As Word.Range

para1 = WordDoc.Content.Paragraphs.Add 'ThisDocument.Paragraphs.Add in VBA
para1.Range.Text = "Job number is: " + myJobID
para1.Range.SetRange 1, 14
textToBeBolded = para1.Range
textToBeBolded.SetRange 1, 14
textToBeBolded.Font.Bold = True
person AJD    schedule 08.03.2019
comment
Если я это сделаю, появится сообщение об ошибке. Я не могу: textToBeBolded = Para1.Range (1,14) - person JohnA; 09.03.2019
comment
И, конечно же, я объявил это в новом диапазоне: Dim textToBeBolded As Word.Range. - person JohnA; 09.03.2019
comment
У меня тоже нет SetRange. Есть ли еще одна библиотека, на которую я должен ссылаться, помимо библиотеки объектов Word? - person JohnA; 09.03.2019
comment
Какое сообщение об ошибке? Как уже отмечалось, я не смог протестировать сам код, но концепция создания отдельного поддиапазона с последующим применением модификаторов шрифта к этому поддиапазону является здесь важной концепцией. - person AJD; 09.03.2019
comment
SetRange - это метод, вызываемый из объекта Range: docs. microsoft.com/en-us/office/vba/api/word.range.setrange - person AJD; 09.03.2019
comment
В textToBeBolded = Para1.Range (1,14) он сообщает мне, что не может передать более 1 параметра. Это свойство только для чтения. - person JohnA; 09.03.2019
comment
Я также пытаюсь: тусклый жирный текст как Word.Range boldedtext.SetRange (1, 14), но выдает ошибку - person JohnA; 09.03.2019
comment
подождите несколько минут - я что-то тестирую на VBA. - person AJD; 09.03.2019
comment
Dim textToBeBolded As Word.Range = Para0.Range ... а затем .... textToBeBolded.SetRange (1, 14) .... вообще ничего не выделяет жирным шрифтом - person JohnA; 09.03.2019
comment
@JohnA: Я отредактировал сообщение. Я тестировал это в VBA, но для публикации сделал мысленное преобразование в VB.Net. Код работал так, как вы хотели в VBA - жирным шрифтом до двоеточия (за исключением того, что в моем коде он добавил только один абзац и не продолжал добавлять абзацы каждый раз, когда я его запускал?) - person AJD; 09.03.2019
comment
stackoverflow.com/ questions / 50121575 / относится к проблеме, которую я отметил в конце моего последнего комментария. Это не прямой ответ на ваш вопрос, но, вероятно, стоит отметить остальную часть вашего кода. - person AJD; 09.03.2019