使用Excel Interop手动编译PERSONAL.xlsb时,为VBA宏指定快捷键?

问题描述 投票:4回答:1

这是一个利基问题,所以我会尝试尽我所能来定义一切。我正在使用Excel 2007。

我们公司使用excel来生产我们的表格。我们有很多工人使用这些表格。出于安全原因,我们不希望我们的电子表格包含宏,但我们仍然需要使用VBA对正常工作簿中的数据执行批量操作。因此,我们所有的宏都在每个员工的PERSONAL.xlsb文件中定义,并且可以在我们的普通工作簿上调用。由于我们在此工作簿上运行了许多不同的宏,因此使用快捷方式调用它们非常方便。快捷方式在excel中定义,如下所示:

PERSONAL.xlsb文件很特殊,因为每当打开任何Excel文件时,Excel都会自动将其作为隐藏的后台工作簿打开。这很好,因为它使您能够在当前工作簿上的PERSONAL.xlsb中调用用户定义的宏,而无需启用宏的当前工作簿。

.xlsb是二进制扩展,使用一些专有的Microsoft压缩算法。问题是编写宏和VBA代码是通过Excel中捆绑的VBA IDE完成的。这意味着您编写的代码不存储在纯文本中,而excel充当中间人,可以将您的VBA代码读/写到.xlsb文件中的二进制blob。

由于我们使用(并计划添加)许多宏,因此将它们编码为我选择的编辑器中的普通文件并使用git来跟踪更改将非常有利。理想情况下,我想要一个包含一堆不同.vba文件的开发文件夹,以逻辑方式分隔每个宏。然后我想要一个纯文本配置文件,为每个.vba代码模块定义可选的快捷键。

然后,当我对更改感到满意时,我想运行一个程序,该程序使用Microsoft Excel Interop将所有这些编译成一个很好的PERSONAL.xlsb文件,该文件可以很容易地保持最新并发送给其他员工。我已经实现了几乎所有这些,但我无法弄清楚如何将快捷键分配给代码模块。

这是我将VBA文件编译为.xlsb文件的示例代码:

using Microsoft.Office.Interop.Excel;
using Microsoft.Vbe.Interop;
using System;
using System.IO;

namespace BinaryCompile
{
    class Program
    {
        private static string path = @"C:\Users\Path\To\Source";

        static void Main(string[] args)
        {
            var excel = new Microsoft.Office.Interop.Excel.Application();
            //Console.WriteLine(path);
            var workbook = excel.Workbooks.Add();

            var project = workbook.VBProject;

            include_files(get_vba_files(), ref project);

            excel.MacroOptions();

            workbook.SaveAs(path + "/PERSONAL.xlsb", XlFileFormat.xlExcel12);
            workbook.Close();

            Console.Read();
            excel.Quit();

        }

        static string[] get_vba_files()
        {
            return Directory.GetFiles(path, "*.vba");
        }

        static void include_files(string[] vba_files, ref VBProject project)
        {
            foreach (string source in vba_files)
            {
                var module = project.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
                module.CodeModule.AddFromFile(source);
                module.Name = Path.GetFileNameWithoutExtension(source);

            }
        }
    }
}

我找不到任何关于如何为这些以编程方式生成的模块分配快捷键的文档。

c# excel vba excel-interop
1个回答
1
投票

如果您可以自由修改vba文件,这是一个选项。如果在Excel中创建宏,指定快捷方式,然后导出模块,您将看到该文件具有以下结构:

Attribute VB_Name = "MyModule"
Sub MyFunction()
Attribute MyFunction.VB_ProcData.VB_Invoke_Func = "y\n14"
    'Do Your stuff
End Sub

Sub MyFunction2()
Attribute MyFunction2.VB_ProcData.VB_Invoke_Func = "q\n14"
    'Do more stuff
End Sub

"y\n14""q\n14"中的第一个字符将是与Ctrl键一起使用的快捷键,在这些情况下,Ctrl + y和Ctrl + q。

旁注:我尝试了你的代码,我只能通过删除excel.MacroOptions();行来使它工作。

© www.soinside.com 2019 - 2024. All rights reserved.