作者:肖筱童2502874877 | 来源:互联网 | 2023-06-21 09:55
我正在创建一个控制台,该控制台查找具有特定属性值的块并将其替换为另一个(类似于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
属性)。
通过在flg
循环的每次迭代中测试idx
和for
的值并退出for
循环,可以稍微提高具有许多属性的块的效率。如果它们具有适当的值,或者可以使用Do
或While
循环在每次迭代中测试这些变量(以及i
变量的大小)以避免使用的Exit
;但我应该想象两种情况下的性能改进都可以忽略不计。