【问题标题】:How to bold only a portion of Word paragraph in Visual Studio (VB)如何在 Visual Studio (VB) 中仅将 Word 段落的一部分加粗
【发布时间】:2019-03-08 21:55:02
【问题描述】:

我正在尝试从 Visual Basic 程序中导出 Word 文档。文档的不同部分需要不同的格式。

我有几个段落,我只需要将每个段落的部分加粗。我正在尝试设置需要加粗的每个段落中的范围,但无论我做什么,它似乎只想加粗整个段落。

我想做这样的事情:

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 对象中工作,而不是遍历整个文档中的所有字符。

希望这是有道理的。有什么想法吗?

【问题讨论】:

  • 您在一个空段落上设置了粗体属性,然后添加了文本。反过来做。例如添加段落,添加文本,设置子范围,然后最后将格式应用于子范围。

标签: vb.net ms-word


【解决方案1】:

为了格式化单个文本运行,插入时有必要将文本分解为单个运行。此外,最好使用独立的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)、LeftMid 等来确定子字符串在较长字符串中的位置。然后Range.StartRange.End 可以使用这些值。但通常最好不要依赖startend 值,因为Word 可以插入不可见的字符,这些字符会导致此编号失效。

【讨论】:

  • 没关系,我在别处打错字了。我认为这是可行的,但我必须尝试一些其他的东西。
  • 从@JohnA 的评论复制到错误的答案:感谢您的回复。不幸的是,当我尝试这个时,什么都没有出现——整行甚至都没有打印出来。我认为您放错了一些引号,因为如果我按字面意思尝试您的代码,它会在 Word doc 上按字面意思打印出三行整行代码(基本上是代码中的第 5-8 行)。所以我在“Job ID is”后面加上了引号。此外,您需要在 Word.WdCollapseDirection.wdCollapseEnd 周围加上括号。
  • 感谢@JohnA 的更正 - 我在移动设备上打字,我的头顶上...抱歉造成混乱!我已经对答案中的代码进行了更改。
【解决方案2】:

创建另一个 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

【讨论】:

  • 如果我这样做会引发错误消息。我做不到:textToBeBolded = Para1.Range(1,14)
  • 当然我在一个新的 Range 中声明了它:Dim textToBeBolded As Word.Range
  • 我也没有 SetRange。除了 Word 对象库之外,我还应该引用另一个库吗?
  • 什么错误信息?如前所述,我无法测试代码本身 - 但是创建单独的子范围然后将字体修饰符应用于该子范围的概念是这里的重要概念。
  • SetRange 是从Range 对象调用的方法:docs.microsoft.com/en-us/office/vba/api/word.range.setrange
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 2012-02-21
  • 2010-11-06
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多