所以我正在尝试做一些复杂的事情,但是由于我对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”值?
如果有人能指出我正确的方向,将不胜感激!
谢谢!
答案 0 :(得分:1)
如果您具有带有TEXTJOIN
函数的Excel 2016+,则可以使用Excel的内置函数。 (如果没有它们,则可以在VBA中进行类似的编程)。
A1:A16
中(删除了多余的换行符)。<t></t>
//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将按照公式栏中的说明在公式周围放置括号{...}
答案 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