在我已经被另一个过滤后按属性过滤块

Filtering block by attribute after I have already filtered by another

我正在创建一个控制台,用于查找具有特定属性值的块并将其替换为另一个(类似于 Word 中的 find(textbox1) 和 replace(textbox2))。

For Each blk In ss
        If (blk.HasAttributes) Then
            attr = blk.GetAttributes()
            For i = 0 To UBound(attr)
                If attr(i).TagString = "item" And _
                    attr(i).TextString = TextBox1.Value Then
                    attr(i).TextString = TextBox2.Value
                    Exit For
                End If
            Next
            End If
    Next

虽然已经解决了,但是又出现了新的问题。我的同事现在想按 2 个属性进行过滤。例如,带有标记 "item" 的属性可以具有值 "coke"。但是您可能只想更改包含苏打水而不是药物的块的名称。因此,我选择了另一个区分它们的属性 (textbox11)。

For Each blk In ss
        If (blk.HasAttributes) Then
            attr = blk.GetAttributes()
            For i = 0 To UBound(attr)
            If attr(i).TagString = "origin" And attr(i).TextString = TextBox11.Value Then
            attr = 0
            attr = blk.GetAttributes()

            For o = 0 To UBound(attr)
                If attr(i).TagString = "item" And _
                    attr(i).TextString = TextBox1.Value Then
                    attr(i).TextString = TextBox2.Value
                    Exit For
                End If
                End If
            Next
            End If
    Next

但它不起作用。你会如何解决这个问题?

假设我已经正确理解了您希望通过该程序实现的目标,也许以下方法就足够了:

Dim flg As Boolean
Dim idx As Long

For Each blk In ss
    If blk.HasAttributes Then
        attr = blk.GetAttributes()
        flg = False
        idx = -1
        For i = 0 To UBound(attr)
            Select Case attr(i).TagString
                Case "origin"
                    If attr(i).TextString = TextBox11.Value Then flg = True
                Case "item"
                    idx = i
            End Select
        Next i
        If flg And idx >= 0 Then
            If attr(idx).TextString = TextBox1.Value Then
                attr(idx).TextString = TextBox2.Value
            End If
        End If
    End If
Next blk

由于我们不能假设 origin 属性将在块所持有的属性数组中的 item 属性之前遇到,上面的代码遍历整个数组并填充如果满足给定条件,则两个变量的值(具体来说,如果遇到 origin 属性并包含特定值,以及如果在遍历数组时遇到 item 属性)。

您可以通过在 for 循环的每次迭代中测试 flgidx 的值并退出 for 来略微提高具有许多属性的块的效率] 循环,如果它们具有适当的值,或者,您可以使用 DoWhile 循环在每次迭代中测试这些变量(以及 i 变量的大小)以避免使用 Exit;但我认为在这两种情况下性能改进都可以忽略不计。