在我已经被另一个过滤后按属性过滤块
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
循环的每次迭代中测试 flg
和 idx
的值并退出 for
来略微提高具有许多属性的块的效率] 循环,如果它们具有适当的值,或者,您可以使用 Do
或 While
循环在每次迭代中测试这些变量(以及 i
变量的大小)以避免使用 Exit
;但我认为在这两种情况下性能改进都可以忽略不计。
我正在创建一个控制台,用于查找具有特定属性值的块并将其替换为另一个(类似于 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
循环的每次迭代中测试 flg
和 idx
的值并退出 for
来略微提高具有许多属性的块的效率] 循环,如果它们具有适当的值,或者,您可以使用 Do
或 While
循环在每次迭代中测试这些变量(以及 i
变量的大小)以避免使用 Exit
;但我认为在这两种情况下性能改进都可以忽略不计。