Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Excel Interop手动编译PERSONAL.xlsb时,是否为VBA宏指定快捷键?_C#_Excel_Vba_Excel Interop - Fatal编程技术网

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

C# 使用Excel Interop手动编译PERSONAL.xlsb时,是否为VBA宏指定快捷键?,c#,excel,vba,excel-interop,C#,Excel,Vba,Excel Interop,这是一个利基问题,所以我会尽我所能去定义一切。我正在使用Excel2007 我们公司使用excel制作表格。我们有许多工人使用这些表格。出于安全原因,我们不希望电子表格包含宏,但我们仍然需要使用VBA对普通工作簿中的数据执行大规模操作。因此,我们所有的宏都是在每个员工的PERSONAL.xlsb文件中定义的,并且可以在普通工作簿中调用。因为我们在这个工作簿上运行了许多不同的宏,所以使用快捷方式调用它们非常方便。快捷方式在excel中定义,如下所示: PERSONAL.xlsb文件非常特殊,因为

这是一个利基问题,所以我会尽我所能去定义一切。我正在使用Excel2007

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

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

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

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

然后,当我对更改感到满意时,我想运行一个程序,使用将这些内容编译成一个很好的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);

            }
        }
    }
}

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

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

属性VB\u Name=“MyModule”
子函数()
属性MyFunction.VB\u ProcData.VB\u Invoke\u Func=“y\n14”
“做你的事
端接头
次级职能2()
属性MyFunction2.VB\u ProcData.VB\u Invoke\u Func=“q\n14”
“多做点事
端接头
“y\n14”
“q\n14”
中的第一个字符将是快捷键,可与
Ctrl
键一起使用,在这种情况下,可以使用Ctrl+y和Ctrl+q

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