Command2
Text1.Item(0)
Text1.Item(2)
Text2
Text1.Item(0)
Text1.Item(2)
Command1这样会重复打印的。
对于每个ControlX.Name=text1的时候,都会做个循环,对于这一点,是不是还能改进呢?

解决方案 »

  1.   

    如果仅仅是列印:Private Sub Command3_Click()
    Dim x As VB.Control
    For Each x In Me.Controls
        If VBA.VarType(VBA.CallByName(Me, x.Name, VbGet)) = vbObject Then       '控件数组
           Debug.Print x.Name & ".Item(" & x.Index & ")"
        Else
           Debug.Print x.Name
        End If
    Next x
    End Sub
      

  2.   

    方法是可行的,不过还是应该用错误捕获。其实错误捕获的开销
    并不大,相反CallByName每次都要用到IDispatch接口其性能等同于
    后期绑定调用。所以,还是应该用错误捕获,如下:Private Sub Command1_Click()
        Dim x As VB.Control
        On Error GoTo Err_Collection
        For Each x In Me.Controls
            Debug.Print x.Name & ".Item(" & x.Index & ")"
        Next
        On Error GoTo 0
        Exit Sub
        
    Err_Collection:
        Debug.Print x.Name
        Resume Next
        
    End Sub
    即使不想用错误捕获,也可以用下面的方法。这是试出来的,有个问题
    我还没有想出是为什么,如下:Private Sub Command3_Click()
    Dim x As VB.Control
    For Each x In Me.Controls
    '    Debug.Print VBA.VarType(x)
        If VarType(x) = vbString Then          '控件数组
           Debug.Print x.Name & ".Item(" & x.Index & ")"
        Else
           Debug.Print x.Name
        End If
    Next x
    End Sub调试代码中的VarType对于控件数组里的对象返回8即vbString,而对一般控制
    返回11即vbBoolean。不知这是为什么,还请高手指教。
    上面的代码都在我的VB上测试通过,不会是因为我的VB有问题吧!