根据值的出现循环遍历字符串值并将值解析为新行

时间:2019-05-13 21:21:41

标签: excel xml vba for-loop

所以我正在尝试做一些复杂的事情,但是由于我对VBA编码语法非常陌生(但是在其他编程语言中有一定经验),因此我不确定该如何解决

基本上,我正在尝试解析此文本:

<Step>

    <Description>

        This is a description

    </Description>

    <Validation>

        This is how we validate

    </Validation>

</Step>

<Step>

    <Description>

        This is another description.

    </Description>

    <Validation>

        And this is another validation.

    </Validation>

</Step>

然后根据开始和结束文本的键标记进行解析。因此,开头的语句是括号,后跟字段描述符,因此用括号和正斜杠将其封闭。

现在,我正在使用一个称为Supermid的UDF(取自this website),该UDF返回两个给定单词(在本例中为我刚刚描述的开始和结束标记)之间的值。 因此,如果上面的文本在单元格A1中,则Supermid(A1, "<Validation>","</Validation>")将返回“这就是我们的验证方式”。

我遇到了一个问题,我想遍历上面的文本,并为每个<Step> </Step>实例分别进行解析。

因此,因为有两个<Steps>封装了描述令牌和验证令牌,所以我想将它们分开。

所以看起来像这样:

Step 1  This is a description   This is how we validate
Step 2  This is another description And this is another validation

基本上,我想遍历整个字段,将检测到的每个字段视作其自身的实体,对其进行迭代并相应地将其解析为相应的列(用于描述的列B,用于验证的列C)

如果我要合并supermid并且要解析的值在单元格A1中,我认为伪代码将看起来像这样:

For i = 0; i < Steps; i++:
     Range("C1").Formula = "=supermid($A1, ""<Feature Description>"", ""</Feature Description>"")"
     Range("D1").Formula = "=supermid($A1, ""<Feature Validation>"", ""</Feature Validation>"")"]
     Range("B1").Formula = ""Step" & i" //this is to clarify which step number it is

我的主要问题是将伪代码转换为VBA语法,因为我从没有深入研究过它,并且我正在学习。 我在想我必须计算开始<Step>的出现次数,将其存储在Long中,并将其用作“ i”的迭代器。

最大的问题是每次迭代将解析的文本分成新的行,我不确定如何计算字符串值中出现的步骤数并相应地将它们分开。

是否有一种方法可以为每次循环迭代迭代单元号?在显示步骤时如何引用“ i”值?

如果有人能指出我正确的方向,将不胜感激!

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您具有带有TEXTJOIN函数的Excel 2016+,则可以使用Excel的内置函数。 (如果没有它们,则可以在VBA中进行类似的编程)。

  • 我将您的文档粘贴到A1:A16中(删除了多余的换行符)。
  • 我通过将其“包装”到另外两个标记<t></t>
  • 中将其转换为有效的XML文档。
  • XPATH://Step[1]/*返回步骤#1的所有子对象
  • 然后,我使用FILTERXML函数使用XPath表达式提取每个 Step ,并将结果与​​TEXTJOIN函数结合在一起。

=IFERROR(TEXTJOIN(" ",TRUE,FILTERXML("<t>" &TEXTJOIN(CHAR(10),TRUE,$A$1:$A$16)& "</t>","//Step[" & ROWS($1:1)&"]/*")),"")

ROWS函数在向下拖动时将生成要提取的 Step 编号。返回所有步骤后,IFERROR函数将返回空字符串

上面的公式是一个数组公式。由于这是一个数组公式,因此您需要在按下 enter 的同时按住 ctrl + shift 来“确认”它。如果操作正确,Excel将按照公式栏中的说明在公式周围放置括号{...}

enter image description here

答案 1 :(得分:0)

例如:

async

我正在将数据存储在工作表单元格中,但是它可能来自其他任何地方。

答案 2 :(得分:0)

因此,我选择不使用XML路由(因为使用这些类型的标记不是我的意图,它更像是我在HTML中熟悉的约定),而只是采用了非常糟糕的VBA路由。 / p>

这是我想出的:

Dim cell As Range
Dim rng As Range
Dim Jdescription As String
Dim steps As Integer
Dim name, desc, valid As Integer
Dim newDescription As String
name = 1
desc = 1
valid = 1

Set rng = Sheets("Scratch2").Range("A1:A" & LastRowDescription)
For Each cell In rng.Cells
    Jdescription = cell.Value
    steps = (Len(Jdescription) - Len(Replace(Jdescription, "<Step>", ""))) / Len("<Step>")
    For i = 1 To steps
         newDescription = Left(Jdescription, 7 + InStr(Jdescription, "</Step>"))
         Sheets("Scratch2").Cells(name, 2).Value = "Step " & i
         name = name + 1
         Sheets("Scratch2").Cells(desc, 3).Value = SuperMid(newDescription, "<Description>", "</Description>")
         desc = desc + 1
         Sheets("Scratch2").Cells(valid, 4).Value = SuperMid(newDescription, "<Validation>", "</Validation>")
         valid = valid + 1
         Jdescription = Replace(Jdescription, newDescription, "")
    Next i
Next cell