Vba 在我已被另一个属性过滤后按属性过滤块
我正在创建一个控制台,用于查找具有特定属性值的块,并将其替换为另一个(类似于Word中的find(textbox1)和replace(textbox2)) 虽然我已经解决了,但出现了一个新问题。我的同事现在想通过两个属性进行过滤。例如,带有标记“item”的属性可以具有值“coke”。但您可能只想更改包含苏打水的块的名称,而不想更改药物的名称。因此,我选择了另一个区分它们的属性(textbox11)Vba 在我已被另一个属性过滤后按属性过滤块,vba,autocad,autocad-plugin,Vba,Autocad,Autocad Plugin,我正在创建一个控制台,用于查找具有特定属性值的块,并将其替换为另一个(类似于Word中的find(textbox1)和replace(textbox2)) 虽然我已经解决了,但出现了一个新问题。我的同事现在想通过两个属性进行过滤。例如,带有标记“item”的属性可以具有值“coke”。但您可能只想更改包含苏打水的块的名称,而不想更改药物的名称。因此,我选择了另一个区分它们的属性(textbox11) 但它不起作用。您将如何解决这个问题?假设我已经正确理解了您希望通过该计划实现的目标,也许以下方法
但它不起作用。您将如何解决这个问题?假设我已经正确理解了您希望通过该计划实现的目标,也许以下方法就足够了:
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
属性,因此如果满足给定条件,上述代码将迭代整个数组并填充两个变量的值(特别是,如果遇到origin
属性并包含特定值,以及在数组上迭代时遇到item
属性)
通过在
for
循环的每次迭代中测试flg
和idx
的值,并退出for
循环(如果这些值保持适当),可以稍微提高具有多个属性的块的效率,或者,您可以使用Do
或While
循环来测试属性每次迭代时se变量(以及i
变量的大小)为了避免使用退出
;但我可以想象,在这两种情况下,性能改进都可以忽略不计。假设我已经正确理解了您希望通过该程序实现的目标,也许以下方法就足够了:
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
属性,因此如果满足给定条件,上述代码将迭代整个数组并填充两个变量的值(特别是,如果遇到origin
属性并包含特定值,以及在数组上迭代时遇到item
属性)
通过在
for
循环的每次迭代中测试flg
和idx
的值,并退出for
循环(如果这些值保持适当),可以稍微提高具有多个属性的块的效率,或者,您可以使用Do
或While
循环来测试属性每次迭代时se变量(以及i
变量的大小)为了避免使用Exit
;但我可以想象,在这两种情况下,性能的提高都可以忽略不计。您需要使用一个缩进来保持缩进一致。如果在同一缩进级别上有两次End If
,这是不正常的;-)你需要使用一个来保持缩进一致。如果你在同一缩进级别上有两次End If
,这是不正常的;-)非常感谢,它起作用了:)刚刚找到了这个缺少的如果flg和idx>=0,那么我想你的意思是如果flg=true和idx>=0,那么谢谢你的提示!不客气flg=True
不应该是必需的,因为flg=True
将返回True
或False
,这是flg
可以接受的唯一值。非常感谢,它正在工作:)刚刚找到了这个缺少的如果flg和idx>=0那么
我想你的意思是如果flg=true和idx>=0那么
谢谢你的提示!不客气flg=True
不应该是必需的,因为flg=True
将返回True
或False
,这是flg
可以接受的唯一值。
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