考虑以下我从Macro Recorder中获得的宏:
public class AccountByPeriodEnq_Extension:PXGraphExtension<AccountByPeriodEnq>
{
public PXAction<AccountByPeriodFilter> Recon;
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Reconcile")]
protected void recon()
{
PXCache gltran = Base.Caches[typeof(GLTran)];
foreach (GLTran tran in gltran.Updated)
{
if (tran.Selected == true)
{
GLTranExt glTranEx = tran.GetExtension<GLTranExt>();
var recon = (glTranEx.UsrRecon == true) ? false : true;
PXDatabase.Update<GLTran>(
new PXDataFieldAssign<GLTranExt.usrRecon>(recon),
new PXDataFieldRestrict<GLTran.batchNbr>(tran.BatchNbr),
new PXDataFieldRestrict<GLTran.lineNbr>(tran.LineNbr)
);
}
}
}
}
如何获得所有结果并将其保存到数组中?
答案 0 :(得分:0)
您可以使用Range
对象进行此操作。将Range
视为不可见的选择,其重要区别在于可以有多个范围,但只有一个选择。
在下面的代码中,将搜索范围(rSearch
)设置为整个文档,并为其定义了Find
属性,而不是Selection
。我将wrap
从wdFindContinue
更改为wdFindStop
,以便宏不会从文档的开头重新开始,而又一遍又一遍...然后wdReplaceAll
必须为wdReplaceOne
,以便可以处理找到的每个范围。
在Do
循环中,将找到的范围分配给数组(aFoundRanges
)。如果搜索成功,则将“重新格式化”数组以接受其他成员。找到的范围将“复制”到范围rFound
,该范围已分配给数组。计数器增加; rFound
被重设*。搜索范围被重新设置为从最后一个“命中”的末尾开始,到文档的末尾结束。
这会循环直到Find.Execute
不再成功。
Sub KeepFoundInArray()
'
Dim rSearch As Word.Range
Dim rFound As Word.Range
Dim aFoundRanges() As Word.Range
Dim counter As Long
Dim bFound As Boolean
Set rSearch = ActiveDocument.content
rSearch.Find.ClearFormatting
rSearch.Find.Replacement.ClearFormatting
With rSearch.Find.Replacement.Font
.Bold = True
.color = wdColorGreen
End With
With rSearch.Find
.Text = "[0-9]{2}/[0-9]{2}/[0-9]{4}"
.Replacement.Text = ""
.Forward = True
.wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Do
bFound = rSearch.Find.Execute(Replace:=wdReplaceOne)
If bFound Then
ReDim Preserve aFoundRanges(counter)
Set rFound = rSearch.Duplicate
Set aFoundRanges(counter) = rFound
Set rFound = Nothing
counter = counter + 1
rSearch.Collapse wdCollapseEnd
rSearch.End = ActiveDocument.content.End
End If
Loop While bFound
Debug.Print UBound(aFoundRanges)
End Sub
Range
。副本将复制Range
对象,并使副本独立于原始对象。这也是为什么重置rFound
(Set rFound = Nothing
)的好主意-确保rSearch.Duplicate
的下一个实例再次独立的原因。