VBA Word:Font.TextColor和Font.ColorIndex的区别是什么?

5

我有一个插入文本的宏,一直以来都运行良好,但是现在在某些文档中,当应用颜色时会出现错误445。
以下是代码:

'Some code before that insert a first page with a different section and writes into the header
ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
Selection.TypeParagraph

With Selection.Font
    .Name = "Calibri"
    .Size = 14
    .Bold = True
    .Italic = False
    .TextColor = RGB(68, 114, 196)
End With

With Selection.ParagraphFormat
    .Alignment = wdAlignParagraphCenter
    .SpaceAfter = 6
End With

Selection.TypeText Text:="eReference file for work order: "
ActiveDocument.Bookmarks.Add Range:=Selection.Range, Name:="workorder"

Selection.TypeParagraph

我注意到如果我更改 "Selection.Font.TextColor = RGB (68, 114, 196)" 并替换为 "Selection.Font.ColorIndex = wdDarkBlue",它可以正常工作。因此我的问题是:这两者之间有什么区别?为什么在某些文档中“TextColor”无法正常工作?

谢谢!


. TextColor 是只读的,所以你无法将其设置为你想要的颜色。 - gizlmo
它工作了吗?你的意思是设置 Font.ColorIndex = RGB(68, 114, 196) 就会把颜色设置为 RGB(64, 114, 196) 吗?还是仅仅不会崩溃?因为根据 WdColorIndex 枚举类型的性质,我非常怀疑将其分配给 RGB 值会得到你所要的颜色。虽然我可能错了——我对 Word 对象模型不是很熟悉。 - Mathieu Guindon
这段代码在我的Word 2013中运行没有问题。你在哪里设置了“Selection”? - Comintern
@Comintern 看起来代码会随机触发错误。它在某些文档上无法正常工作。但我找不到任何不同之处。而且我并没有真正设置 Selection。我只是不知道如何在不使用它的情况下设置颜色。 - Pookye
2
@Mat'sMug 谢谢你的帮助。我找到了解决方案。引起问题的文档处于“兼容模式”。我转换了这些文档,宏就可以正常工作了。虽然我不是很理解所有的东西,但它确实有效... - Pookye
显示剩余2条评论
1个回答

7

Font.TextColorFont.ColorIndex在MSDN上都有文档。

ColorIndex

返回或设置代表指定字体颜色的WdColorIndex常量。可读/写。

WdColorIndex是一个枚举类型,定义了一些预定义常量。作为枚举类型,它的基础值是一个数值 - 一个Long整数。当你将其赋值为RGB函数调用的结果时,你给它的是一个Long整数,但不是WdColorIndex值 - 我非常怀疑你得到的颜色与设置的RGB值匹配。

TextColor

返回表示指定字体颜色的ColorFormat对象。只读。

ColorFormat对象让你有更多控制格式的方式。它是只读的,因为它是一个对象 - 这并不意味着你不能更改它(即修改其状态),只是意味着你不能将该对象引用Set到其他东西...但你也不需要那样做。

所以,代替这个:

.TextColor = RGB(68, 114, 196)

你可以这样做:

 .TextColor.RGB = RGB(68, 114, 196)

MSDN 上的 ColorFormat.RGB 属性

就我个人而言,当我尝试将非 WdColorIndex 枚举值分配给 Font.ColorIndex 时,我会收到运行时错误 5843,因此我对你所说的“它是有效的”感到困惑 - 特别是考虑到 IntelliSense 会为其提供可能的值:

wdColorIndex 常量


1
@Pookye 可能是因为你正在使用“选择” - 再次说明,我并不是非常熟悉 MS-Word,但在 Excel 中,“选择”可以是任何东西,并且编写针对它的代码是可怕的做法,会使代码变得非常脆弱。 - Mathieu Guindon
是的,我觉得是这样。我在调试模式下运行它,并设置了一个断点,它停在了".TextColor = RGB (68, 11, 196)"这一行上。我发现真的很奇怪的是它在某些文档上运行正常,而在其他文档上却不行。 - Pookye
即时 / 调试工具窗口 (Ctrl+G) 中键入 ?TypeName(Selection),您是通过编程控制选择还是让用户自行选择?如果针对当前选择进行操作并假定用户选择了文本而不是形状,则可能会导致此类错误。 - Mathieu Guindon
非常抱歉,我是VBA的新手,不太清楚如何使用“Immediate”窗口...当我将鼠标放在错误后面的Selection上时,它显示“Selection = ♀”。实际上,在运行宏时没有选定任何文本。我只需向当前文档添加一个新的第一页,在页眉和第一页中进行编写。当我在编写第一页内容之前设置字体时,出现了错误。 - Pookye
1
顺便说一句,熟悉一下“立即”工具窗口吧——在调试时它是你最好的朋友。Debug.Print语句会打印到该窗口中,你可以在任何地方中断并针对该工具窗口中的当前调试上下文执行代码。学会使用“立即”窗格应该是你知道如何设置断点后的第一要务。 - Mathieu Guindon
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接