【问题标题】:VBA Split data by new line wordVBA按换行符拆分数据
【发布时间】:2018-05-17 00:49:19
【问题描述】:

我正在尝试在 word 中使用 VBA 拆分数据。

我是用下面的方法得到的数据

d = ActiveDocument.Tables(1).Cell(1, 1).Range.Text

这可以正常工作并获取正确的数据。这个例子的数据是

This
is
a
test

但是,当我需要使用分隔符将字符串拆分为字符串列表时,\n

这是所需输出的示例

This,is,a,test

我正在使用

Dim dataTesting() As String
dataTesting() = Split(d, vbLf)
Debug.Print dataTesting(0)

但是,这会返回所有数据,而不仅仅是第一行。

这是我在拆分功能中尝试过的

  • \n
  • \n\r
  • \r
  • vbNewLine
  • vbLf
  • vbCr
  • vbCrLf

【问题讨论】:

  • 很可能是手动换行vbVerticalTab - Split(d, Chr(11))
  • 也可能是Chr(10)
  • 它是 vbCR (ANSI 13),一个“段落标记”

标签: vba split ms-word


【解决方案1】:

Word 使用 vbCr (ANSI 13) 编写“新”段落(按 ENTER 键时创建) - 如果激活了非打印字符的显示,则在 Word UI 中由 ¶ 表示。

在这种情况下,您显示的表格单元格内容将如下所示

This¶
is¶
a¶
test¶

Word中拆分由pilcro分隔的数组的正确方法是:

Dim d as String
d = ActiveDocument.Tables(1).Cell(1, 1).Range.Text
Dim dataTesting() As String
dataTesting() = Split(d, vbCr)
Debug.Print dataTesting(0)  'result is "This"

【讨论】:

    【解决方案2】:

    你可以试试这个(来自this thread的正则表达式拆分器)

    Sub fff()
        Dim d As String
        Dim dataTesting() As String
    
        d = ActiveDocument.Tables(1).Cell(1, 1).Range.Text
        dataTesting() = SplitRe(d, "\s+")
    
        Debug.Print "1:" & dataTesting(0)
        Debug.Print "2:" & dataTesting(1)
        Debug.Print "3:" & dataTesting(2)
        Debug.Print "4:" & dataTesting(3)
    End Sub
    
    Public Function SplitRe(Text As String, Pattern As String, Optional IgnoreCase As Boolean) As String()
        Static re As Object
    
        If re Is Nothing Then
            Set re = CreateObject("VBScript.RegExp")
            re.Global = True
            re.MultiLine = True
        End If
    
        re.IgnoreCase = IgnoreCase
        re.Pattern = Pattern
        SplitRe = Strings.Split(re.Replace(Text, ChrW(-1)), ChrW(-1))
    End Function
    

    如果这不起作用,您的 Word 文档中可能有奇怪的 unicode/Wprd 字符。例如,它可能是软休息。您可以尝试不使用“\W+”而不是“\s+”进行拆分。没有您的文件,我无法对此进行测试。

    【讨论】:

      【解决方案3】:
      Dim dataTesting() As String
      dataTesting() = Split(d, vbLf)
      Debug.Print dataTesting(0)
      

      工作正常,非常感谢您的示例, 为什么它返回整个数组是因为您使用 0 作为索引,在许多编程语言中,0 是整个数组,所以第一个元素是 , 所以在我的例子中,从 1 开始,这完美地分割了一个我遇到问题的字符串。

      更准确地说,这就是我的情况

      Dim dataTesting() As String
          dataTesting() = Split(Document.LatheMachineSetup.Heads.Item(1).Comment, vbCrLf)
          MsgBox (dataTesting(1))
      

      并且该注释是一个多行字符串。

      Image

      所以这个消息框正好返回了第一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 2012-02-03
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多