Word VBA shape forecolor wdThemeColorAccent2 在菜单中显示为 ThemeColor 1
Word VBA shape forecolor wdThemeColorAccent2 shows as ThemeColor 1 in the menu
我在 Word (Office 365) 中编写了一些宏代码,将形状轮廓的颜色设置为其中一种主题颜色。对形状执行此操作的代码如下所示:
shape.line.foreColor.ObjectThemeColor = wdThemeColorAccent2
通过为 ObjectThemeColor
字段指定 'wdXX' 颜色,形状周围线条的颜色将在更改文档 ColorTheme 时自动更改。
我的问题(或第一个奇怪的地方)是当我用上面的代码分配 Accent2 然后执行:select 形状、菜单、格式、形状轮廓,并将鼠标悬停在带有红色轮廓(标记活动线条颜色),工具提示显示 "Turquoise, Accent 1" 而不是 "Accent 2."
我原以为 wdThemeColorAccent2
颜色会在工具提示中被称为 Accent 2
,但事实并非如此。
第二个问题是我显然无法使用宏代码指定菜单中显示的最后一种颜色。由于偏移(代码中的 Accent 2 = 菜单中的 Accent 1),我需要在代码中使用 wdThemeColorAccent7
来分配菜单中显示的最后一种颜色(工具提示中标记为 Accent 6)。
我想知道这是否是 Word 中的错误(在我看来确实如此),或者我是否做错了什么。为了重现这种情况,我创建了一个简单的空矩形,select 对其进行了编辑,然后 运行 上面的代码行更改了形状的轮廓颜色。这是一个说明问题的小子程序(select 你的形状在 运行 子程序之前)。
Sub TestAccent()
Dim shp As Shape
Set shp = selection.ShapeRange(1)
shp.line.foreColor.ObjectThemeColor = wdThemeColorAccent4
shp.line.Weight = 0.5
shp.line.Visible = True
End Sub
我相信 "theme scale" 中的颜色(见下图)不对应于 WdThemeColorIndex
的名称,而是对应于基础数值。如果您查看 VBA 编辑器的对象浏览器 (F2),然后搜索 wdThemeColorAccent
,您将获得完整列表。单击列表中的成员,您将在底部看到数值。
值 0 分配给 MainDark1,VBA 无法识别。值 1、2 和 3 分配给 MainLight1、MainDark2 和 MainLight2,它们是黑色、白色和图像中的第一个条目(这些颜色在背景和文本的最后四个枚举中重复)。值 4 (wdThemeColorAccent4
) 到 9 (wdThemeColorAccent6
) 对应于下图中的其余颜色。 (注意:图片后有更多讨论!)
所以,不,我不认为这是一个错误,只是您的期望与开发人员将数字枚举分配给枚举名称时的想法不符。或者,也许设计配色方案的人在 VBA 代码被锁定后改变了主意……我想你在工具提示中看到的名称是从 VBA 中删除的另一个步骤。您可能会发现 this article 中的信息很有帮助。
如果您使用值而不是名称,事情可能不会那么混乱。或者,定义您自己的枚举:
Public Enum ColorSchemeAccents
Accent1 = 3
Accent2 = 4
Accent3 = 5
Accent4 = 6
Accent5 = 7
Accent6 = 8
Accent7 = 9
Accent8 = 10
End Enum
Sub TestAccent()
Dim shp As Shape
Set shp = Selection.ShapeRange(1)
shp.Line.ForeColor.ObjectThemeColor = ColorSchemeAccents.Accent8
shp.Fill.ForeColor = RGB(250, 250, 250)
shp.Line.Weight = 2
shp.Line.Visible = True
End Sub
尽管 ColorFormat 对象的 .ObjectThemeColor 被定义为 wdThemeColorIndex 实际上该值取决于上下文。
如果它是一个 Word 对象 - 例如文本,那么你应该使用 wdThemeColorIndex 常量,但如果它是一个 Office 对象 - 例如形状,那么你必须使用 msoThemeColorIndex 常量。奇怪的是,它们不一样——大多数情况下,mso 常量比 wd 常量多一个,但对于 Background1&2 和 Text1&2 情况则不然——Text1&2 在这两种情况下都相同,但对于 Background1&2,mso 比 wd 多两个。
这样做的副作用是在 VBA 中似乎不可能设置 Background2 颜色,因为它的 mso 值为 16 并且超出范围但是如果您使用本机 GUI 来设置它,则可以设置它到 16!
看起来很差 design/implementation 需要清理!
我在 Word (Office 365) 中编写了一些宏代码,将形状轮廓的颜色设置为其中一种主题颜色。对形状执行此操作的代码如下所示:
shape.line.foreColor.ObjectThemeColor = wdThemeColorAccent2
通过为 ObjectThemeColor
字段指定 'wdXX' 颜色,形状周围线条的颜色将在更改文档 ColorTheme 时自动更改。
我的问题(或第一个奇怪的地方)是当我用上面的代码分配 Accent2 然后执行:select 形状、菜单、格式、形状轮廓,并将鼠标悬停在带有红色轮廓(标记活动线条颜色),工具提示显示 "Turquoise, Accent 1" 而不是 "Accent 2."
我原以为 wdThemeColorAccent2
颜色会在工具提示中被称为 Accent 2
,但事实并非如此。
第二个问题是我显然无法使用宏代码指定菜单中显示的最后一种颜色。由于偏移(代码中的 Accent 2 = 菜单中的 Accent 1),我需要在代码中使用 wdThemeColorAccent7
来分配菜单中显示的最后一种颜色(工具提示中标记为 Accent 6)。
我想知道这是否是 Word 中的错误(在我看来确实如此),或者我是否做错了什么。为了重现这种情况,我创建了一个简单的空矩形,select 对其进行了编辑,然后 运行 上面的代码行更改了形状的轮廓颜色。这是一个说明问题的小子程序(select 你的形状在 运行 子程序之前)。
Sub TestAccent()
Dim shp As Shape
Set shp = selection.ShapeRange(1)
shp.line.foreColor.ObjectThemeColor = wdThemeColorAccent4
shp.line.Weight = 0.5
shp.line.Visible = True
End Sub
我相信 "theme scale" 中的颜色(见下图)不对应于 WdThemeColorIndex
的名称,而是对应于基础数值。如果您查看 VBA 编辑器的对象浏览器 (F2),然后搜索 wdThemeColorAccent
,您将获得完整列表。单击列表中的成员,您将在底部看到数值。
值 0 分配给 MainDark1,VBA 无法识别。值 1、2 和 3 分配给 MainLight1、MainDark2 和 MainLight2,它们是黑色、白色和图像中的第一个条目(这些颜色在背景和文本的最后四个枚举中重复)。值 4 (wdThemeColorAccent4
) 到 9 (wdThemeColorAccent6
) 对应于下图中的其余颜色。 (注意:图片后有更多讨论!)
所以,不,我不认为这是一个错误,只是您的期望与开发人员将数字枚举分配给枚举名称时的想法不符。或者,也许设计配色方案的人在 VBA 代码被锁定后改变了主意……我想你在工具提示中看到的名称是从 VBA 中删除的另一个步骤。您可能会发现 this article 中的信息很有帮助。
如果您使用值而不是名称,事情可能不会那么混乱。或者,定义您自己的枚举:
Public Enum ColorSchemeAccents
Accent1 = 3
Accent2 = 4
Accent3 = 5
Accent4 = 6
Accent5 = 7
Accent6 = 8
Accent7 = 9
Accent8 = 10
End Enum
Sub TestAccent()
Dim shp As Shape
Set shp = Selection.ShapeRange(1)
shp.Line.ForeColor.ObjectThemeColor = ColorSchemeAccents.Accent8
shp.Fill.ForeColor = RGB(250, 250, 250)
shp.Line.Weight = 2
shp.Line.Visible = True
End Sub
尽管 ColorFormat 对象的 .ObjectThemeColor 被定义为 wdThemeColorIndex 实际上该值取决于上下文。
如果它是一个 Word 对象 - 例如文本,那么你应该使用 wdThemeColorIndex 常量,但如果它是一个 Office 对象 - 例如形状,那么你必须使用 msoThemeColorIndex 常量。奇怪的是,它们不一样——大多数情况下,mso 常量比 wd 常量多一个,但对于 Background1&2 和 Text1&2 情况则不然——Text1&2 在这两种情况下都相同,但对于 Background1&2,mso 比 wd 多两个。 这样做的副作用是在 VBA 中似乎不可能设置 Background2 颜色,因为它的 mso 值为 16 并且超出范围但是如果您使用本机 GUI 来设置它,则可以设置它到 16!
看起来很差 design/implementation 需要清理!