繁体   English   中英

VBA 将模块序列化为 JSON

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM