vba - 使用 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
我保持非常简单的测试是否可以存储自定义类,以防万一。
我想要做的甚至可能吗?还是我在叫错树?提前致谢!
解决方案
不幸的是,您要寻找的是对象序列化。.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)字符串。现在可以保存该字符串,将其发送到网站或某些程序。为了获取对象,您将该字符串反序列化回对象以在您的代码中使用。
请记住,整个概念仅适用于定义良好的类,如果该类不是动态的,则该概念运行良好。
推荐阅读
- python - tf.keras:为 model.fit 提供额外的值
- php - 如何在PHP中另一个数组的foreach循环中将数组的值增加1
- python - 我需要验证poetry.lock 文件吗?
- excel - 在 VBA 中使用循环复制和粘贴时如何跳过非数字值?
- python - python列表中是否有任何函数可以将逗号分隔值转换为单个元素?
- slack - 如何不在松弛中格式化表情符号?
- postgresql - 将 Microstrategy Cube 连接到 Postgres 物化视图
- python-2.7 - 如何为此元素编写定位器
- javascript - 涉及带条件数组的 Switch 语句中的案例
- android - Android 在 sdk 集成中链接