热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我已经被其他人过滤后,按属性过滤

我正在创建一个控制台,该控制台查找具有特定属性值的块并将其替换为另一个(类似于Word

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


推荐阅读
author-avatar
肖筱童2502874877
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有