如何提取Excel 365普通批注、线程批注内容并转换为纯文本字符串
Excel 365两类批注批量提取为普通字符串的实用方案
Excel 365的批注分为传统批注和线程批注两种,两类对应的接口逻辑不同,以下是两种不同场景的便捷处理方案:
方案1:VBA 批量提取(适合高频/批量处理场景)
- 按下
Alt + F11打开VBA编辑器,右键点击当前工作簿名称→插入→模块 - 将以下代码粘贴到模块编辑区:
Sub 提取任意类型批注为字符串() Dim rng As Range For Each rng In Selection Dim res As String res = "" ' 判断是否存在传统批注 If Not rng.Comment Is Nothing Then res = rng.Comment.Text ' 判断是否存在线程批注 ElseIf Not rng.CommentThreaded Is Nothing Then res = rng.CommentThreaded.Text End If ' 结果输出到选中单元格右侧列,可自行修改输出位置 rng.Offset(0, 1).Value = res Next End Sub
如果需要提取线程批注下的全部回复内容,可将线程批注判断分支替换为以下代码片段:
Dim cmt As CommentThreaded, rep As CommentThreaded Set cmt = rng.CommentThreaded res = cmt.Author.Name & ":" & cmt.Text & vbCrLf For Each rep In cmt.Replies res = res & rep.Author.Name & ":" & rep.Text & vbCrLf Next
- 回到Excel界面,选中需要提取批注的单元格区域,按下
Alt + F8,选择宏名「提取任意类型批注为字符串」点击运行即可。
方案2:Power Query 无代码提取(适合不想启用宏的场景)
- 选中包含批注的数据源区域,按下
Ctrl + T转换为超级表 - 点击顶部菜单栏「数据」→「从表格/区域」,进入Power Query编辑器
- 点击顶部「添加列」→「自定义列」,输入自定义列公式:
= try if Value.Is(Value.Type([目标列名]), Type.RecordType) then [目标列名][Comment]?[Text] ?? [目标列名][CommentThreaded]?[Text] ?? "" else "" otherwise ""
注意将公式中的目标列名替换为你实际需要提取批注的列的名称
- 点击确定后,新列会自动匹配两类批注输出普通字符串,最后点击「关闭并上载」即可将结果导回Excel工作表。
内容的提问来源于stack exchange,提问作者ascripter
相关产品推荐
相关产品推荐

