[英]VBA Serialize Module to JSON
我有一个要转换为 C# 的 VBA 项目。 我需要能够运行单元测试来验证转换后的 C# 代码。 原始应用程序的所有数据都存储在全局变量中的单个模块中,序列化该模块非常有用,这样我就可以在单元测试中从中获取子例程输入和输出。
我已经阅读了其他问题并找到了这个 github 项目:
https://github.com/VBA-tools/VBA-JSON
不幸的是,您必须将一个对象传递到它的“ConvertToJson”函数中,而模块没有我可以传递的引用。
这个库有没有办法序列化模块而不是类模块?
有没有办法从模块创建对象引用?
谢谢!
您可以尝试将您的模块转换为具有 PredeclaredId 的类。 无需新建对象,只需在方法调用前加上类名即可。 为了避免导出模块的麻烦,将 predeclaredId 设置为 true 并重新导入,您可以为 VBA 安装免费且出色的 Rubberduck AddIn。
没有一种优雅的方式来序列化 VBA 标准模块,但我找到了一种使用可扩展性库来实现它的方法。 (类似于反射)。 请原谅所附代码的初步状态; 它尚未写入序列化格式,它只是检索标准模块中的所有双精度值并打印它们的值,只要该模块仅包含变量声明。 虽然这不是完整或健壮的序列化代码,但它具有标准模块难以实现的部分。 一旦我写了一个更完整的例程,我会更新。
Public Sub Serialize()
Dim code As String
Dim splitCode As Variant
Dim variableName As String
Dim i As Integer
Dim count As Integer
Dim Project As VBProject
Dim module As CodeModule
Dim value As Variant
Dim nextClass As VBComponent
Set Project = ThisWorkbook.VBProject
Set module = Project.VBComponents("TheModule").CodeModule
i = 1
Do While i <= module.CountOfLines
'Get the next line of the Module of interest
code = module.Lines(i, 1)
'Look for any variable types we care about
If InStr(code, "Double") <> 0 Then
splitCode = Split(code)
variableName = splitCode(1)
Set nextClass = Project.VBComponents.Add(vbext_ct_StdModule)
nextClass.Name = "aaaTMP"
'Inject the Function we need
nextClass.CodeModule.InsertLines 1, "Public Function GetValue() As Variant"
nextClass.CodeModule.InsertLines 2, "GetValue = " & variableName
nextClass.CodeModule.InsertLines 3, "End Function"
value = Application.Run("GetValue")
MsgBox variableName & ": " & value
Project.VBComponents.Remove nextClass
End If
i = i + 1
Loop
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.