首页 > 解决方案 > 使用 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

属性字符串类

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

我保持非常简单的测试是否可以存储自定义类,以防万一。

我想要做的甚至可能吗?还是我在叫错树?提前致谢!

标签: vbaclassms-access

解决方案


不幸的是,您要寻找的是对象序列化。.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)的形式发送给您。最后,您现在调用反序列化方法,并且您现在可以在代码中使用该对象。因此,这种将类转换为某种“字符串”或可以保存为文本或从网站传递(或拉取)的东西的想法如今相当普遍。

所以,你的想法和问题是相当正常的,特别是如果你来自任何支持序列化的现代系统和框架。

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

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


推荐阅读