到目前为止这是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属性,它应该允许我将第二个参数作为参数传递。
我想要的是在类中有一个集合对象,所有变量都有不同类型而不是私有变量。
提前感谢。
答案 0 :(得分:2)
您的班级需要一个私人收藏变量。我知道这不是你想听到的,但它是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
你会像这样与Campo互动。
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