【问题标题】:Convert / Replace tab stops to comma将制表位转换/替换为逗号
【发布时间】:2021-01-01 06:23:37
【问题描述】:

我的 Word 文档需要我将制表位转换或替换为逗号。

文本可能如下所示:

Hello........world (dot)
Hello------------World (dash)
Hello____World (line)
Hello          world (none)

Word 提供 4 种制表位前导选项:点、破折号、直线和无。
我只想将前 3 种领导者类型替换为逗号。

最后一个不会这样改:

Hello,world
Hello,World
Hello,World
Hello          world

Word 中的查找和替换选项卡功能不起作用。所以我尝试从各种来源“复制并粘贴”到一个简单的宏中来完成这项任务:

Sub Macro1()
    For Each para In ActiveDocument.Content.Paragraphs
        For Each aTab In para.TabStops
            If aTab.Leader = wdTabLeaderDots _
              Or aTab.Leader = wdTabLeaderDashes _
              Or aTab.Leader = wdTabLeaderLines Then
                TypeText = ","
                aTab.Clear
            End If
        Next aTab
    Next para
End Sub

参考:https://msdn.microsoft.com/en-us/library/office/ff192806.aspx

Word 说行中有错误:TypeText = ","。


Slai 对这个问题有一个解决方案。我将第二个代码复制到一个宏中,稍作修改使其工作:

Sub Macro1()
    Dim p As Paragraph, t As TabStop
        
    For Each p In ActiveDocument.Paragraphs
        For Each t In p.TabStops
            If t.Leader Then p.Range.Find.Execute "^t", , , , , , , , , ",", wdReplaceAll
        Next
    Next
End Sub

如果您需要宏仅处理所选内容中的段落,请将 ActiveDocument 替换为 Selection。

【问题讨论】:

  • 也许是查找和替换格式officearticles.com/word/…
  • @Slai 我尝试过 Word 中的查找和替换功能,但在这种情况下不起作用。

标签: vba ms-word


【解决方案1】:

查找和替换格式似乎仅在制表位位置已知的情况下才有效:

With ThisDocument.Range.Find
    For L = wdTabLeaderDots To wdTabLeaderLines
        .ParagraphFormat.TabStops.Add Position:=36, Leader:=L
        .Execute "^t", , , , , , , , , ",", wdReplaceAll
    Next
End With

另一种方法是检查每个段落的制表位(顺便说一句WdTabLeader has 6 values):

Dim p As Paragraph, t As TabStop

For Each p In ThisDocument.Paragraphs
    For Each t In p.TabStops
        If t.Leader Then p.Range.Find.Execute "^t", , , , , , , , , ",", wdReplaceAll
    Next
Next

【讨论】:

  • 我已将您的代码复制到一个新宏中,运行它但它不起作用。我不明白代码中“^t”、、、、、、、、、、、、“”部分的含义。你能帮我一个更详细的宏吗?我对 Word 宏或 VBA 完全陌生。这几天刚学了一点VBA或者编程(仅基于谷歌搜索)来解决我文档的一些问题。提前致谢。
  • @doquan0 抱歉,忘记回复了。你是什​​么意思它没有工作..什么都没有发生?您可以尝试将ThisDocument 替换为ActiveDocument"^t" 是 Tab 的特殊字符,"," 是第 10 个参数 ReplaceWith msdn.microsoft.com/en-us/library/office/ff193977.aspx
  • 第二个代码 Dim p As Paragraph ... Next Next 完美运行。十分感谢。正如你所说,我需要在代码中将 ThisDocument 替换为 ActiveDocument 才能使其工作。我的赏金已经过期,所以我不能给你 50 点声望。但是,我已将此标记为已接受的答案,以表示对您的感谢。
  • 我对包含多个制表符的段落有疑问。例如:hello world.....hello----world___hello world。使用您给出的第二个代码,段落中的所有制表符前导都将更改为逗号 - 这是我没想到的结果。你能帮我处理一下宏吗,这样它就不会变成制表符(无)变成逗号?提前致谢。
【解决方案2】:

TypeTextSelection 对象的一个​​方法。由于您没有指定对象,TypeText 在您的代码中失败。由于您也不使用 Selection 对象,因此您根本不能使用 TypeText。我建议像这样的结构。

With Para.Range
    .Collapse wdCollapseEnd
    .Move wdCharacter, -1
    .Text = ","
End With

此代码将在段落末尾添加一个逗号,这将带您了解您希望逗号在哪里的问题。你想要它代替标签,它与TabStop 完全不同。选项卡是一个 Chr(9),您可以轻松替换它。但是,如何解释这个 Chr(9) 取决于为其设置的 TabStop 类型,这取决于 Chr(9) 在页面上的哪个位置生效。你不能通过检查文本来判断这一点。因此,您无法通过查看文档的文本来区分 TabStops 的类型。

要明确:不能用逗号替换TabStop,因为TabStop 不存在。可以用逗号替换制表符。

如果不知道其在文本中的精确位置,就无法确定特定选项卡的前导。示例:如果TabStop 存在于距左边距 100 点处并且一个制表符在距左边距 100 点结束的空间中生效,比如说 50 点,并且在距左边距 50pts 和 100pts 之间的区域中没有其他 TabStop 设置,文档中的选项卡可以与设置为 100pts 的 TabStop 关联,其领导者确定,并替换制定或省略的选项卡(不是TabStop !!!)。

如果知道文档中制表符的精确位置,就不可能在它与段落中的任何制表位之间建立关联。由于无法确定哪个TabStop 可能会生效,因此也无法对其任何属性做出有根据的猜测。如果不准确了解选项卡在文档中的位置,唯一可以做出的决定是无条件地执行还是替换它。

【讨论】:

  • 我在 aTab.Clear 行之后添加了您的代码。它在段落的最后一个字符之前添加一个逗号,例如 Hello(tab)Worl,d。我注意到代码中的 aTab.Clear 行创建了一个普通选项卡。您能否调整代码,使其在新创建的正常选项卡之前或之后添加逗号,例如 Hello(tab),World?
  • 制表符和其他任何字符一样。您可以像其他任何东西一样搜索并替换它。为此,人们不会使用我上面发布的代码。它只是查找和替换。请清楚区分制表符和制表位。您可以在段落中设置任意数量的制表位,但除非文本中有制表位,否则它们都不会生效。文本中的制表符激活哪个制表位取决于该制表符在一行中的位置。
  • 感谢您的评论。我了解制表符和制表位之间的区别。正如你所说,设置制表位后,我需要按键盘上的“制表位”按钮来激活它。我在之前的评论中的“正常”选项卡是 aTab.Clear 删除所有制表位并重置所有选项卡的格式。没有点、没有破折号和没有线条,甚至所有选项卡的空间都重置为 Word 的默认值(0.5 英寸或 36 磅)。
  • 我承认现在很困惑。制表符(= 文本中的字符)可以用逗号替换。制表位(= 段落格式的对象)不能用逗号替换。正确的是,Word 将为用户自己未设置任何制表位的文档行中的延伸设置默认制表位。这些停靠点没有前导符,除非在行尾设置制表位,否则无法删除。
猜你喜欢
  • 2022-07-21
  • 2017-02-25
  • 2022-01-22
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
相关资源
最近更新 更多