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

Vba 在我已被另一个属性过滤后按属性过滤块,vba,autocad,autocad-plugin,Vba,Autocad,Autocad Plugin,我正在创建一个控制台,用于查找具有特定属性值的块,并将其替换为另一个(类似于Word中的find(textbox1)和replace(textbox2)) 虽然我已经解决了,但出现了一个新问题。我的同事现在想通过两个属性进行过滤。例如,带有标记“item”的属性可以具有值“coke”。但您可能只想更改包含苏打水的块的名称,而不想更改药物的名称。因此,我选择了另一个区分它们的属性(textbox11) 但它不起作用。您将如何解决这个问题?假设我已经正确理解了您希望通过该计划实现的目标,也许以下方法

我正在创建一个控制台,用于查找具有特定属性值的块,并将其替换为另一个(类似于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