跳到主要内容

Office软件辅助

对当前 Office / WPS 窗口执行 VBA、给选中对象设格式,或触发功能区命令。本模块为测试状态。执行 VBA 主要参考网友 @Zetalpha 的子程序。

当前模块定义

sys:officehelper第三方软件交互Action
标准模块
输入 8 · 输出 3 · 枚举 2

输入参数

  • 操作类型operationEnum必填
    填写 固定输入默认 execVBA
    4 个选项执行VBA宏代码、设置格式/对象属性赋值、执行界面命令
    执行VBA宏代码默认execVBA
    设置格式/对象属性赋值setFormats
    执行界面命令executeMsoCommand
    获取ProgIdgetProgId
  • 应用程序appTypeEnum可选
    填写 固定输入默认 word_wps
    12 个选项Word 或 WPS文字(根据前台进程自动识别)、Word、WPS文字
    Word 或 WPS文字(根据前台进程自动识别)默认word_wps
    Wordword
    WPS文字wps
    Excel 或 WPS表格(根据前台进程自动识别)excel_et
    Excelexcel
    WPS表格et
    PowerPoint 或 WPS幻灯片(根据前台进程自动识别)powerpoint_wpp
    PowerPointpowerpoint
    WPS幻灯片wpp
    Outlook (支持界面命令outlook
    Project (支持界面命令project
    Visio (支持界面命令、VBAvisio
  • 宏名称或VBA代码codeText可选

    宏的名称,或VBA代码(将执行第一个找到的Sub或Function)

    填写 固定输入条件 仅:execVBA
    查看默认值
    Sub Hello()
    MsgBox "Hello World"
    End Sub
  • 命令IDcommandText可选

    界面按钮所对应的命令ID,请参考模块文档了解如何获取。

    填写 固定输入条件 仅:executeMsoCommand
  • 格式设置/属性赋值代码formatsText可选

    请参考文档说明

    填写 固定输入条件 仅:setFormats
  • 等待执行结束waitRespBoolean可选

    不等待将立即继续后续步骤的执行,如果遇到异常情况无法获知。

    填写 固定输入条件 仅:execVBA, setFormats, executeMsoCommand默认 true
  • 最长等待时间(ms)waitMsNumber必填

    最长的等待返回结果的,毫秒数

    填写 固定输入条件 仅:execVBA, setFormats, executeMsoCommand默认 10000
  • 失败后停止动作stopIfFailBoolean可选

    失败后是否停止动作

    填写 固定输入默认 true

输出参数

  • 步骤执行是否成功isSuccessBoolean

    步骤执行是否成功

  • 返回内容respText
    条件 仅:execVBA, setFormats, executeMsoCommand
  • ProgIdprogIdText

    获取程序的ProgId,可用于在C#里得到对应的Application对象。

    条件 仅:getProgId

概述

Office软件辅助

辅助控制Office软件
操作类型
应用程序
宏名称或VBA代码
Sub Hello() MsgBox "Hello World" End Sub
宏的名称,或VBA代码(将执行第一个找到的Sub或Function)
最长等待时间(ms)
10000
最长的等待返回结果的,毫秒数
步骤执行是否成功
-- 选择变量 --
步骤执行是否成功
返回内容
-- 选择变量 --
  • 低权限运行,不能操作「以管理员身份」启动的 Office / WPS。
  • 关掉系统 UAC 可能影响本模块。
  • 读写打开的 Excel 工作簿请看 Excel区域操作;只读写文件、不启动 Excel 请看 Excel文件读写

执行VBA代码

前置条件:

  • Office 系列软件需要开启**【信任对 VBA 工程对象模型的访问】** 选项。
  • WPS 需要安装 VBA 模块,并开启「信任对于 Visual Basic 项目的访问」。
  • 以上选项开启方法请参考本文

注意事项:

  • WPS产品因为其版本众多,每个版本所包含的组件不同,兼容性差异较大,不一定能正常运行。
  • 因为底层COM接口的限制,如果同时开启了多个同名进程,可能会获取到错误的活动文档。
  • Excel 软件执行VBA代码后,将会丢失撤销(undo)历史,无法进行撤销操作。因此,请先备份好重要数据,再使用VBA代码。
  • 通过Quicker启动运行的Excel程序会被提权,导致无法控制。请从Windows启动Excel,或通过打开Excel文档的方式开启Excel。
示例:录制VBA宏并转换为动作
Office软件辅助执行VBA宏代码 Excel

参数说明

应用程序:要操作的程序。可选 Word / WPS 文字、Excel / WPS 表格、PowerPoint / WPS 幻灯片,以及「根据前台进程自动识别」的组合项;Outlook、Project、Visio 见下方操作类型限制。

宏名称或VBA代码

  • 如需执行文档中已有的宏,填写宏的名称。
  • 否则填写完整的宏代码。通常是这样的格式:
Sub 宏名称()
'宏代码
End Sub

您可以在Excel、Word中录制宏,然后将代码修剪后(录制的代码经常会有一些没有什么用的部分)复制到动作中使用。

如需返回内容,请声明Function。如下示例返回Word文档路径:

Function GetDocumentFullName() As String
GetDocumentFullName = ActiveDocument.FullName
End Function

自1.39.32版本起,VBA脚本支持不在第一行的sub、function,会自动查找到第一个。支持在第一行使用'main:主程序sub或function名的方式指定要执行的主要sub或function。(建议不要修改已有动作,避免旧版本Quicker无法支持)

等待执行结束:是否等执行完再继续。不等待则 VBA 出错也不会提示。

最长等待时间(ms):等待上限,默认 10000。

失败后停止动作:出错后是否中止。默认开启。

返回内容Function 的返回值。1.39.31+。

设置格式、设置对象属性

概述:

  • 本功能有点复杂,需要手写对象名称。需要您对VBA对象模型有一定的了解,并且善于查阅微软官方文档以了解各个对象类型的属性和方法。

  • 用于对Word/WPS文字、PowerPoint/WPS演示的特定对象设置属性(如对选中文字设置字体、段落格式)。本功能暂不支持Excel/WPS表格

  • 本功能不需要在Office软件中开启【信任对 VBA 工程对象模型的访问】选项。

  • 可参考通过录制宏得到的代码。

参数说明

Office软件辅助

辅助控制Office软件
操作类型
应用程序
格式设置/属性赋值代码
selection .Font .Name = "仿宋" .NameAscii = "Arial Black" .Size = 40
请参考文档说明
步骤执行是否成功
-- 选择变量 --
步骤执行是否成功

应用程序:目前不支持 Excel 和 WPS 表格。

格式设置/属性赋值代码

用于设置对象属性值的代码。其语法如下:

  • 顶格写对象名称。(支持的对象请参考本文后续章节说明)
  • 通过缩进方式指定要设置的属性(以及下一级属性)。也可以将多个层级的属性名合并在一行,如.Font.Fill.ForeColor.RGB = #FF0000(设置字体的颜色)。缩进字符的数量没有限制,只要同一级别的内容缩进位置相同即可。
  • 通过.属性名 = 属性值的方式赋值。
  • 对象名、属性名大小写不敏感。
  • 每个对象类型所支持的属性,可以参考VBA文档,或通过查看录制宏所生成的代码了解。
  • 也可以通过.方法名: 参数1,参数2,....的形式调用参数类型明确的简单方法。
  • 对可枚举类型(IEnumerable)类型的对象,可以使用.*表示其每个元素。用于对该枚举对象的每个元素调用相同的处理。
  • 可以在行的开始使用 // 注释一行
  • 布尔类型属性,可以使用 ! 表示对当前值取反。

注:本功能通过c#的反射机制查找属性和方法名称,并根据其类型定义转换属性值。有的参数类型可能无法正常转换。

等待执行结束:不等待则忽略错误。

最长等待时间(ms):等待上限,默认 10000。

Word 支持说明

所支持的对象列表

对象名称说明文档链接
ApplicationWord应用程序对象。VBA
Doc当前活动文档。
为Application.ActiveDocument的别名。
VBA
PageSetup当前文档的页面设置。
为Application.ActiveDocument.PageSetup 的别名。
VBA
Selection当前选择的内容。
为Application.Selection的别名。
VBA
Selection.Font当前选择内容的字体格式设置。
为Application.Selection.Font的别名。
VBA
Selection.P当前选择内容的段落格式设置。
为Application.Selection.ParagraphFormat的别名。
VBA
Styles.样式名
如:styles.标题 1
某个样式。
用于更新文档中某个样式的字体、段落等设置。
VBA
StyleByText根据段落文本内容设置段落的样式。用于自动排版功能中,识别标题段落并自动设置成对应的标题样式。见本文后面部分。

Styles.样式名 :设置样式的文字和段落格式

样式名可以使用Word的内置样式名(如wdStyleHeading1对应于“标题 1”)或中文样式名(如“标题 1”)。注意,样式名中间的空格需要保留,不然无法匹配。

示例:

Styles.正文
.Font
.Name = "仿宋"
.Size = 16
.Color = wdColorAutomatic
.ParagraphFormat
.Alignment = wdAlignParagraphLeft
.LineSpacingRule = wdLineSpaceExactly
.LineSpacing = 29
// 首行缩进
.CharacterUnitFirstLineIndent = 0
.MirrorIndents = 0
.SpaceBefore = 0
.SpaceAfter = 0

Styles.标题 1
.Font
.Name = "黑体"
.Size = 16

Styles.标题 2
.Font
.Name = "楷体"
.Size = 16

Styles.标题 3
.Font
.Name = "仿宋"
.Size = 16

StyleByText :根据文字内容设置段落样式

公文排版标准对各级别标题的样式做了规定。 因此,可以根据段落的文字内容倒推判断其所对应的标题级别,。设置方法:

StyleByText
.样式名1 = "正则表达式(C#语法)"
.样式名2 = "正则表达式(C#语法)"
...更多规则

示例:

StyleByText
.标题 1 = "^\s*[一二三四五六七八九十]{1,3}、[^\r]*"
.标题 2 = "^\s*([一二三四五六七八九十]{1,3})[^\r]*"
.标题 3 = "^\s*\d+[\.]([^。\\r:])*[。]{0,1}"
.标题 4 = "^\s*(\d+)([^。\\r:])*"

Selection 选中区域

设置选中内容的样式:

selection
.style = "标题 1"

清除选中内容的格式 (结尾的冒号表示调用方法):

Selection
.ClearFormatting:

设置高亮显示颜色(可选值):

selection
.Range.HighlightColorIndex = wdYellow

PageSetup 页面设置

PageSetup
.LineNumbering.Active = False
.Orientation = wdOrientPortrait
.TopMargin = CentimetersToPoints(2)
.BottomMargin = CentimetersToPoints(3)
.LeftMargin = CentimetersToPoints(4)
.RightMargin = CentimetersToPoints(5)
.Gutter = CentimetersToPoints(0)
.HeaderDistance = CentimetersToPoints(1.5)
.FooterDistance = CentimetersToPoints(1.75)
.PageWidth = CentimetersToPoints(21)
.PageHeight = CentimetersToPoints(29.7)
.FirstPageTray = wdPrinterDefaultBin
.OtherPagesTray = wdPrinterDefaultBin
.SectionStart = wdSectionNewPage
.OddAndEvenPagesHeaderFooter = False
.DifferentFirstPageHeaderFooter = False
.VerticalAlignment = wdAlignVerticalTop
.SuppressEndnotes = False
.MirrorMargins = False
.TwoPagesOnOne = False
.BookFoldPrinting = False
.BookFoldRevPrinting = False
.BookFoldPrintingSheets = 1
.GutterPos = wdGutterPosLeft
.LayoutMode = wdLayoutModeLineGrid

注:上面的代码主体是通过录制宏得到的。

长度/尺寸数值可以直接使用VBA代码中的CentimetersToPoints(厘米数),也可以使用5.2cm这样的格式。如使用下面的代码设置一个常规公文文档的页边距:

PageSetup
.TopMargin = 3.7cm
.BottomMargin = 3.5cm
.LeftMargin = 2.8cm
.RightMargin = 2.6cm

PowerPoint 支持说明

所支持的对象列表

对象名称说明文档链接
ApplicationPowerPoint应用程序对象。VBA
Presentation当前活动动幻灯片。
为Application.ActivePresentation的别名。
VBA
PageSetup当前活动幻灯片的页面设置。
为Application.ActivePresentation.PageSetup 的别名。
VBA
Selection当前选择的内容。
为Application.ActiveWindow.Selection的别名。
VBA
Selection.Font当前选择内容的字体格式设置。
为Application.Selection.TextRange2.Font的别名。
VBA
Selection.P当前选择内容的段落格式设置。
为Application.Selection.TextRange2.ParagraphFormat的别名。
VBA
selection.shapes当前所选中的图形。为Application.Selection.ShapeRange的别名。VBA

示例

设置幻灯片大小为A4纸张,水平方向:

pagesetup
.SlideSize = ppSlideSizeA4Paper
.Slideorientation = msoOrientationHorizontal

设置选中对象的文字字体

selection.font
.name = "黑体"
.size = 20
.fill.forecolor.rgb = #FF0000

选中的图形快速对齐到左半屏:

selection.shapes
.left = 0
.top = 0
.width = 50%
.height = 100%

注:ShapeRange对象的Left、Top、Width、Height 支持使用百分比数字指定位置和大小。

相对于幻灯片横向分布选中的图形(调用ShapeRange.Distribute方法):

selection.shapes
.Distribute: msoDistributeHorizontally, msoTrue

示例动作

冻结窗格
注释下面步骤代码中的叹号表示对属性值取反。
Office软件辅助设置格式/对象属性赋值 Excel 或 WPS表格(根据前台进程自动识别)

获取ProgId

主要用于编写同时兼容Office和WPS的c#代码。

当“应用程序”参数选择“xxxx 或 xxxx”时,模块会判断前台进程名称返回对应的ProgID。

Office软件辅助

辅助控制Office软件
操作类型
应用程序
步骤执行是否成功
-- 选择变量 --
步骤执行是否成功
ProgId
progId
获取程序的ProgId,可用于在C#里得到对应的Application对象。
示例:C#冻结窗格
注释为兼容Excel和WPS,先根据前台进程获取ProgId(用于调用接口的程序对象标识)
Office软件辅助获取ProgId Excel 或 WPS表格(根据前台进程自动识别)
注释使用c#代码获取程序对象并执行逻辑
运行C#代码

执行界面命令

功能区每个按钮通常对应一个命令 ID,如格式刷是 FormatPainter。本操作按 ID 触发。

Office软件辅助

辅助控制Office软件
操作类型
应用程序
命令ID
AlignRight
界面按钮所对应的命令ID,请参考模块文档了解如何获取。

命令ID:界面按钮对应的 ID。

可以从如下渠道获取某个功能对应的ID:

1)从Office软件的“选项”设置窗中“自定义功能区”设置中找到对应的功能,查看其Tooltip提示。

2)从微软提供的文档(英文)中查找,文档仓库地址:https://github.com/OfficeDev/office-fluent-ui-command-identifiers

故障排查

(1)异常来自HRESULT:0x800401E1

原因:

  • 当前未启动目标程序;
  • 或者目标程序以不同安全级别启动了(如以管理员身份启动了Excel等软件,用Quicker启动也可能造成这种情况);
  • 修改了Windows用户账户控制。

(2)现象:无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“Microsoft.Vbe.Interop.VBComponent”。或 Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Vbe.Interop.VBComponent'.

原因:

安装的Office缺少组件或VBA环境异常。

尝试参考:https://getquicker.net/Common/Topics/ViewTopic/21592 重装VBA环境。

如果仍未解决,可能是因为使用第三方精简Office版本安装,或第三方工具安装的Office版本。 请使用微软官方安装程序按默认安装或选择所有组件。 推荐使用Office365。

(2) 异常来自HRESULT:0x800A03EC

  • 有可能启动了多个Excel进程。 可以在任务管理器中关闭所有Excel进程,然后通过开始菜单或双击文件再打开一次。
  • 如果文档保存在共享目录中,确保文档没有被其他人打开。
  • 确保文档没有处于只读、密码保护等非正常编辑状态。

可以参考这个帖子:https://stackoverflow.com/questions/7099770/hresult-0x800a03ec-on-worksheet-range

(3)异常来自 HRESULT:0x800AC472

  • 如果Excel中有打开的对话框,关闭这些对话框窗口;
  • 如果有已打开的Excel,从任务管理器中找到并退出这些进程。

相关链接

更新历史

  • 20221116 1.36.7

  • 增加“获取ProgId”操作类型;

  • 设置对象属性:对布尔类型支持使用!对当前值取反。

  • 20230204 增加故障排查说明

  • 20230213 增加一个故障排查说明

  • 20230301 增加说明:通过Quicker启动的Excel进程因为会被提权,会导致无法使用的情况。

  • 20230312 补充0x800A03EC错误的说明。

  • 20230914 1.39.31版本支持VBA返回内容。

  • 20230916 1.39.32 VBA脚本支持不在第一行的sub、function,自动查找到第一个。支持在第一行使用'main:主程序sub或function名的方式指定要执行的主要sub或function。(建议不要修改已有动作,避免旧版本Quicker无法支持)

  • 20240808 1.43.16 增加“执行界面命令”操作类型。

更新于