【问题标题】:Get all the VBA macros of a workbook by EPPlus通过 EPPlus 获取工作簿的所有 VBA 宏
【发布时间】:2016-09-20 15:53:40
【问题描述】:

在从EPPlus 下载的示例Sample15.cs 中,我看到EPPlus 可以编写/注入VBA 宏。但是,我看不到如何从 .xlsm 工作簿中读取所有 VBA 宏。

EPPlus 能否解释 VbaProject.bin 并支持此功能?

PS:Open XML SDK 似乎也无法做到这一点(如果我错了请纠正我),这就是我考虑 EPPlus 的原因...

【问题讨论】:

    标签: epplus epplus-4


    【解决方案1】:

    如果您只想阅读每个模块中的代码,您只需像这样浏览“Workbook.VbaProject.Modules”集合:

    var fi = new FileInfo(@"C:\temp\Book1.xlsm");
    using (var pck = new ExcelPackage(fi))
    {
        var modules = pck.Workbook.VbaProject.Modules;
        foreach (var module in modules)
        {
            Console.WriteLine($"Module Name: {module.Name}{Environment.NewLine}Code:");
            Console.Write(module.Code);
            Console.WriteLine("---------");
        }
    

    这会在输出中给你这个(我刚刚创建了一个带有两个模块的 excel xlsm):

    Module Name: ThisWorkbook
    Code:
    ---------
    Module Name: Sheet1
    Code:
    ---------
    Module Name: Module1
    Code:
    Public Sub proc1()
        Dim wb As Workbook
        Set wb = ActiveWorkbook
    
        Dim ws As Worksheet
        Set ws = wb.ActiveSheet
    
        ws.Cells(1, 1).Value = "proc1"
    
    End Sub
    
    ---------
    Module Name: Module2
    Code:
    Public Sub proc2()
        Dim wb As Workbook
        Set wb = ActiveWorkbook
    
        Dim ws As Worksheet
        Set ws = wb.ActiveSheet
    
        ws.Cells(2, 1).Value = "proc2"
    
    End Sub
    
    ---------
    

    【讨论】:

    • 这正是我想要的......另外,我正在研究EEPlus的源代码,看看它是如何实现的......为什么我在vbaProject.bin的解释>VBA/.cs`?
    • @SoftTimur 我认为操纵 vba bin 本身就是一个完整的项目,因为它是一个二进制文件。由于 vba 是 excel DOM 的一个子集/分支,它确实需要一个项目全神贯注地做到这一点。如果你还没有看到这个,这里是一个很好的阅读:codeproject.com/Articles/15216/Office-bin-file-format
    • 但是你的例子表明 EEPlus 确实读取了这个二进制文件,对吧?虽然我没有看到它的代码的哪一部分实现了这一点......
    • @SoftTimur 没错,Epplus 确实出于自己的目的操纵它,但我确信这只是可以完成的一小部分。但要回答你的问题,我相信文件ExcelVbaProject.cs 是在ExcelWorkbook.cs 中引用的实际二进制读/写epplus.codeplex.com/SourceControl/latest#EPPlus/VBA/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    相关资源
    最近更新 更多