选择。查找通配符结果以数组

时间:2018-07-19 15:06:40

标签: vba ms-word word-vba

考虑以下我从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)
                );                 
            }
        }           
    }        
}    

如何获得所有结果并将其保存到数组中?

1 个答案:

答案 0 :(得分:0)

您可以使用Range对象进行此操作。将Range视为不可见的选择,其重要区别在于可以有多个范围,但只有一个选择。

在下面的代码中,将搜索范围(rSearch)设置为整个文档,并为其定义了Find属性,而不是Selection。我将wrapwdFindContinue更改为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
  • 有必要复制找到的范围-如果不这样做,该范围将被写入数组。并且它将始终反映 current 范围rSearch-数组成员“指向”的是Range。副本将复制Range对象,并使副本独立于原始对象。这也是为什么重置rFoundSet rFound = Nothing)的好主意-确保rSearch.Duplicate的下一个实例再次独立的原因。