Class 如何在VBA中使用Let/Get属性更新/读取集合对象项

Class 如何在VBA中使用Let/Get属性更新/读取集合对象项,class,vba,oop,Class,Vba,Oop,这是迄今为止的cls_Ativo类代码: Option Compare Database Option Explicit Private obj_Utilitario As New cls_Utilitario Private col_Ativo As Collection Private Const SQL As String = "SELECT tbl_Ativos.codigo_ativo, tbl_Ativos.especificacao FROM tbl_Ativos ORDER

这是迄今为止的cls_Ativo类代码:

Option Compare Database
Option Explicit

Private obj_Utilitario As New cls_Utilitario
Private col_Ativo As Collection

Private Const SQL As String = "SELECT tbl_Ativos.codigo_ativo, tbl_Ativos.especificacao FROM tbl_Ativos ORDER BY tbl_Ativos.codigo_ativo;"

Private Sub Class_Initialize()
    Dim registro As Recordset
    Dim campoRegistro As Field
    Dim i As Integer

    Set col_Ativo = New Collection

    Set registro = CurrentDb.OpenRecordset(SQL)

    If (Not (IsNull(registro)) And (registro.RecordCount > 0)) Then
        registro.MoveLast
        registro.MoveFirst

        For i = 0 To registro.Fields.Count - 1
            Set campoRegistro = registro.Fields(i)
            col_Ativo.Add campoRegistro, campoRegistro.SourceField
        Next i
    Else
        Set col_Ativo = Nothing
    End If

    Set registro = Nothing
    Set campoRegistro = Nothing
End Sub

Private Sub Class_Terminate()
    Set col_Ativo = Nothing
    Set obj_Utilitario = Nothing
End Sub

Public Property Get Campo(arg_Item As Variant) As Variant
    Campo = col_Ativo.item(arg_Item)
End Property

Public Property Let Campo(arg_Item As Variant, arg_Valor As Variant)
    Select Case arg_Item
        Case "codigo_ativo"
            If VarType(arg_Valor) = vbString Then
                If ValidaCodigoAtivo(arg_Valor) Then
                    col_Ativo.item(arg_Item) = arg_Valor
                Else
                    MsgBox "O código inserido não é válido."
                End If
            Else
                MsgBox "O código inserido não é um texto."
            End If

        Case "especificacao"
            If VarType(arg_Valor) = vbString Then
                col_Ativo.item(arg_Item) = arg_Valor
            Else
                MsgBox "A especificação inserida não é um texto válido."
            End If
    End Select
End Property
这就是我在表单模块中要做的:

Private Sub btnTeste_Click()
    Dim obj_Ativo As cls_Ativo

    Set obj_Ativo = New cls_Ativo

    'Save a text into the collection item "especificacao" using Let property
    obj_Ativo.Campo ("especificacao","texto de exemplo, texto de exemplo...")

    'Return the collection item using Get property
    Msgbox obj_Ativo.Campo ("especificacao")

    Set obj_Ativo = Nothing
End Sub
当我调用obj_Ativo.Campo时,它只允许我将arg_Item作为参数传递,并显示它不会返回任何值,就像它是一个Let属性一样。但如果它确实是一个Let属性,它应该允许我将第二个参数作为参数传递

我想要的是在类中有一个集合对象,包含所有不同类型的变量,而不是私有变量


提前感谢。

您的类中需要一个私有集合变量。我知道这不是你想听的,但这是vba的工作原理。你不能用不同的类型获得/放弃。Campo还需要接受并返回一个集合对象

private argItems as Collection

Public Property Get Campo() As Collection
    Set Campo = argItems
End Property

Public Property Let Campo(arguments as Collection)
    ' process your collection of arguments
End Property
你会像这样与坎波互动

Private Sub btnTeste_Click()
    Dim obj_Ativo As cls_Ativo

    Set obj_Ativo = New cls_Ativo

    Dim args as New Collection
    With args
        .Add "especificacao"
        .Add "texto de exemplo"
        .Add "texto de exemplo"
    End With

    obj_Ativo.Campo (args)

    'Return the collection item using Get property
    Msgbox obj_Ativo.Campo.Item("especificao").Value

    Set obj_Ativo = Nothing
End Sub

谢谢蒂姆的快速回复。你明白我打算做什么吗?我希望避免将值与表单中类的每个变量相关联,例如:myObject.Name=“Tchutchu”=>myObject.Age=30=>etc。。。用于通过循环将值动态关联到对象集合。我还希望在集合中动态附加这些对象。这些对象将是表字段。表单中的控件将与相应的表字段具有相同的名称,因此,我将能够轻松地将集合对象与表单控件关联。你认为这可以做到吗?谢谢。我知道你想做什么了:你所需要做的就是切换你的
公共属性,让Campo(arg_项作为变量,arg_Valor作为变量)
到一个子集,比如
公共子集\u Campo(arg_项作为变量,arg_Valor作为变量)
你的
Get
可以保持原样。好的,蒂姆。我想这样试试。谢谢。我本来想避免这样,但是。。。也许这是最好(也是唯一)的方法。这就是生活。谢谢Ckuhn的帮助。@Thromy这当然不是唯一的方法,但从我的语言经验来看,我认为这是你最好的选择。祝你好运。你明白我打算做什么吗?我希望避免将值与表单中类的每个变量相关联,例如:myObject.Name=“Tchutchu”=>myObject.Age=30=>etc。。。用于通过循环将值动态关联到对象集合。我还希望在集合中动态附加这些对象。这些对象将是表字段。表单中的控件将与相应的表字段具有相同的名称,因此,我将能够轻松地将集合对象与表单控件关联。你认为这可以做到吗?谢谢。我不能说我百分之百理解你想做什么,但我可以肯定地说这是可以做到的。它将非常类似于
ADODB.Recordset.Properties
errrr。。。。。财产。在该示例中,
rs.properties
是一个集合对象,它包含一个完整的变量对象列表。在您的例子中,“properties”是表示类中属性的字符串集合。我还没有真正想过它将如何实现,但我很想知道它是如何为您工作的。好的,Ckuhn203。我将研究记录集属性,并尝试得到我需要的结果。如果我对记录集属性有任何疑问,我希望你能帮我。谢谢