使用VBA将自定义类保存到访问表

时间:2019-07-26 17:37:47

标签: class ms-access access-vba

我有一个很奇怪的问题,我不清楚是否可行。我有一个已建立的Access数据库,该数据库基本上存储文档。在其中,您可以在Excel中生成这些文档。就目前而言,我将要存储在单元格中的值存储为表格值(例如字符串)。但是我想尽可能地存储属性字符串,以便也可以存储格式。

我对如何创建一个基本上是归因于字符串的自定义类有一个想法,但是然后我仍然遇到一个问题,那就是它必须是一个可以存储在Access表中的对象。

我当时想在表中创建一个OLEObject字段并将其保存在那里,但是当我尝试在该字段中保存自定义类时却给了我一个错误。

  

运行时错误“ 438”:

     

对象不支持此属性或方法

我尝试制作一个对象变量,然后将自定义类设置为该变量,但仍然存在相同的错误。

Dim attStr As New AttributedStringClass
attStr.Value = "Test Test"

Dim oleObj As Object
Set oleObj = attStr

Dim rst As Recordset: Set rst = CurrentDb.OpenRecordset("tblTest")
rst.AddNew
rst("attributeString") = oleObj
rst.Update

AttributedStringClass

Option Compare Database
Option Explicit

Dim zValue As String

Property Get Value() As String
    Value = zValue
End Property

Property Let Value(dValue As String)
    zValue = dValue
End Property

我非常简单地测试是否可以存储自定义类,以防万一不可能。

我想做的甚至有可能吗?还是我吠错了树? 预先感谢!

1 个答案:

答案 0 :(得分:0)

不幸的是,您要寻找的是对象序列化。 .net支持序列化,因此您可以将对象转换为XML,或者如今,使用的更紧密和简短的格式是JSON。

但是,您可以制作自己的序列化器。因此,您将必须采用自己制作的自定义类,并调用例程(传递类对象)以将所有值吐出为文本。也许该格式可以用逗号定界,或者我想甚至可以使用JSON格式(但我们没有.net那样好的JSON serlizer / de-serlizer)。

然后将文本保存在标准备注栏中。然后,您可以读取/提取该数据,并调用例程以将文本反序列化为对象。

但是,由于您确实知道该类,因此可以公开每个属性,并使用for / each循环。此技巧概述如下: https://www.mrexcel.com/forum/excel-questions/466141-use-custom-class-each-loop.html

但是,我要做的只是创建您的类,添加所有“成员”,然后简单地添加一个名为serialize和de serializer的例程。

所以:

dim clsMyClass     as new clsTour

clsMyClass.HotelName = "Greenwood Inn"
.etc. etc. etc.

' now get all of the values as a string

dim strCsv     as string
strCsv = clsMyClass.Serlize

' now, the comma delimited strCsv as all the values of the class as a string
rstData!Cdata   = strCsv
rstData.update

现在,此时,便笺字段已保存(如上所述,可以使用xml,json或csv格式)。

要拉+加载(反序列化)该类,我们现在去:

 dim rstData           as DAO.Recordset
 ' code to load up reocord set
 set rstData = currentdb.OpenRecordSet("Select * from tblTours where id  =2")

 strCsv = rstData!CData
 dim clsMyClass      as new clsTour
 clsMyclass.Serialize = strCsv

 ' at this point, your class is now loaded with all the correct values.
 eg:
 msgbox "Hotel name = " & clsMyClass.HotelName

因此,在.net世界中,将一个类序列化为一个字符串,然后传递给Web服务,然后最终将对象反序列化为类/对象的想法。

在.net中,此生成内置在框架中。因此,当您调用SOAP或如今更常见的REST服务时,数据就会以xml(或json)的形式发送给您。最后,您现在调用de-serialize方法,并且可以在代码中使用该对象了。因此,如今,将类转换为某种“字符串”或可以另存为文本或从网站传递(或拉出)的想法很普遍。

因此,您的想法和问题很正常,尤其是如果您来自支持序列化的任何现代系统和框架。

如前所述,如果您的类仅要保存5-10个值,那么一个简单的方法就可以很轻松地将所有值序列化和从该类持有的值中的字符串中反序列化。但是对于复杂的对象,那么当然会需要一个支持这种自动功能的开发平台。在.net中,您可以将任何对象传递给序列化器,它会吐回xml(或json)字符串。现在可以保存该字符串,将其发送到网站或某个程序。为了获得对象,您可以将该字符串反序列化回该对象以供您在代码中使用。

请记住,整个概念仅适用于定义良好的类,如果该类不是动态类,则该概念也适用。